在 CZGL.AliIoTClient 中,Topic 被划分为五种类型:普通 Topic、属性上报、属性下发、事件上报和服务调用。除普通 Topic 外,其余四种均支持消息发送及对应的响应机制。

对于普通 Topic,消息发出后,基于 MQTT 协议,SDK 会严格确保消息可靠送达另一端。设备向服务器上报属性或事件时,服务器会返回响应;反之,服务器下发数据时,设备也需做出响应。不过,这些响应并非强制要求——在实际业务中,即便不处理也不会影响核心流程。
每个 Topic 均对应一个 MQTT 通讯地址,这些地址在 CZGL.AliIoTClient 中已自动生成,你只需填写普通 Topic 的通讯地址即可。
1) 订阅 Topic
订阅 Topic 前,请先在阿里云物联网平台定义好对应 Topic,并正确设置“订阅”权限。普通 Topic 的订阅有两种方式:一是在连接时通过 string[] 列表传入,二是在连接成功后动态添加。后者称为“热订阅”,可在运行时灵活调整。
具体用法如下:
// 设置要订阅的Topic、运行接收内容的Topic
string[] topics = new string[] { client.CombineHeadTopic("get"),"/a1xrkGSkb5R/mire/user/get1" };
client.ConnectIoT(topics,null,60);
Topic 地址通常较长,你只需记住 .../user/ 之后的部分,然后借助 CombineHeadTopic() 自动补全完整地址,例如 client.CombineHeadTopic("get")。
2)响应
当使用属性、事件或服务功能与服务器进行数据交互时,服务器会返回响应。你可以选择接收这些响应,也可以忽略。默认情况下,CZGL.AliIoTClient 不接收服务器的响应——因为在大多数场景下,响应信息仅在调试阶段有用。
| 响应方法 | 说明 |
|---|---|
| OpenEventPostReply() | 接收上报事件后服务器的响应 |
| OpenPropertyPostReply() | 接收设备属性上传后服务器的响应 |
| OpenPropertyDownPost() | 允许服务器下发设置设备属性指令 |
注意:这些响应必须在连接客户端前设置,客户端连接后不能再使用以上方法,否则会抛出异常。 该问题已修复。现在你可以在程序的任意阶段开启或关闭接收功能,使用非常灵活。
查看这些功能是否开启,可调用:
public CZGL.AliIoTClient.OpenTopic getOpenTopic()
返回的 OpenTopic 对象包含 8 个属性,用于获取或设置是否打开某种类型的接收:
| 属性 | 说明 | 默认值 |
|---|---|---|
| CommonTopic | 是否接收普通Topic | 固定为true,不可更改 |
| PropertyUpRawReplyTopic | 设备上传透传属性数据后服务器的响应 | false |
| PropertyPostReplyTopic | 设备上传Alink json属性数据后服务器的响应 | false |
| PropertyDownRaw | 服务器下发设置属性的命令(透传) | false |
| PropertyDownPost | 服务器下发设置属性的命令(Alink json) | false |
| EventUpRawReply | 设备事件上报后服务器的响应(透传) | false |
| EventPostReply | 设备事件上报后服务器的响应(Alink json) | false |
| ServiceDownRaw | 服务器调用服务(透传) | false |
| ServicePostRaw | 服务器调用服务(Alink json) | false |
有一点需要注意:由于区分了透传和 Alink json 两种格式,如果你使用的是透传,那么设置 Alink json 对应的项将无效,反之亦然。
3)连接服务器后
客户端成功连接服务器后,仍可增加要订阅的普通 Topic:
public void TopicAdd(string[] topics, [byte[] QOS = null])
示例:
client.TopicAdd(new string[]{ client.CombineHeadTopic("get") })
同样也可以移除已订阅的 Topic:
public void TopicRemove(string[] topics)
连接后,你可以关闭接收服务器的响应信息,但之前的设计无法重新开启。不过该问题已修复——现在你可以在程序的任意阶段取消后再次打开接收。
| 方法 | 说明 |
|---|---|
| CloseEventPostReply() | 不再接收设备上传事件后服务器的响应 |
| ClosePropertyPostReply() | 不再接收设备上传属性后服务器的响应 |
| ClosePropertyDownPost() | 不允许服务器下发设置设备属性的指令 |
4) Topic 说明
获取当前已订阅的 Topic 列表:
public string[] GetSubedList { get; }
示例:
var topicList = client.GetSubedList;
这里需要理解一个底层原理:服务器端设置设备属性、调用设备服务等操作,本质上是基于 MQTT 的发布/订阅模式。因此,无论功能看起来多复杂,数据传输最终都通过 Topic 完成。这也是为什么设备属性上报、属性下发等功能都可以配置 Topic 属性。
在 CZGL.AliIoTClient 中,客户端可以订阅它感兴趣的 Topic。连接服务器后,服务器可以向所有 Topic 发送数据,但只有那些被客户端明确订阅的 Topic,客户端才会真正收到推送消息。否则,你在控制台怎么点击发送都没用——客户端根本不会接收。
对于普通 Topic,是否允许服务器推送消息到客户端,完全取决于客户端连接时的配置,并且是动态变化的。但属性、事件、服务这些功能会保存之前的配置。举个例子,如果你调用了:
client.OpenPropertyPostReply();
开启了属性上传响应的接收,即使程序重启后没有再次调用这一行,它仍然会保持开启,除非你显式调用:
client.ClosePropertyPostReply();
总而言之,设备上传数据到服务器,服务器会返回响应;同样,服务器下发属性设置或调用服务时,客户端也可以做出响应。这些细节将在后续章节中进一步阐述。
