本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。
MQTT协议简介
腾讯云物联网目前主要兼容MQTT协议3.1.1版本,所以后续主要以3.1.1版本中的设计来展开。对于做应用开发来说,主要需要理解MQTT的基本概念以及相关特性,以下做简单概括:
- 客户端:即物联网设备,可以通过腾讯云物联网SDK,包括IoT Hub C SDK以及IoT Explorer C SDK 等连接平台
- 服务器:即物联网服务平台,比如IoT Hub、IoT Explorer
- 服务质量:特别注意,服务质量只针对PUBLISH控制包。腾讯云物联网支持QoS0和QoS1(QoS2可在业务层做,比如在payload中增加去重标记)
- QoS0:消息只发送一次
- QoS1:消息发送后,需要接收到PUBACK,不然一定间隔后会重新发送,次数和间隔取决于平台和设备端实现
- 设备端:sdk 中会告知QoS1消息是否到达或者超时失败,具体处理交给用户决定。在该系列后续的文章会提到,届时在此处补充链接。
- 物联网服务平台:当QoS1消息未收到Puback会以3s间隔重发,最多3次
- 会话:通过CleanSession(CONNECT控制包的标记)可以使用已有会话或者创建新会话。创建会话和使用已有会话只有一个区别,即使用已有会话会保留上个会话的订阅关系,以及收到离线下发和下发后未确认的QoS1消息。请参见MQTT持久性会话。
- 订阅:订阅的对象是主题名
- IoT Hub中支持平台私有主题(平台已规定格式的主题名,具有特殊用途,比如广播等)和自定义设备相关主题(即以${productID}/${deviceName}/<usr_data>等),并控制发布/订阅权限
- IoT Explorer中主要是使用平台私有主题进行交互,比如数据模板、OTA等
- 保活:设备端具有保活机制,当设备无数据交互时,根据约定的keep alive值定期跟平台发送心跳包(即PINGREQ)
- 设备端SDK当两次心跳包未收到回复(PINGRESP)时将会进行重连
- 物联网服务平台会在1.5倍keep alive时间未收到心跳包时,断开与设备的连接
以上就是应用开发需要注意MQTT的相关事项,但是出于学习还是得弄清楚设备端的具体实现的。所以后续文章将会针对平台支持的11种MQTT包类型(CONNECT、CONNACK、PUBLISH、PUBACK、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK、PINGREQ、PINGRESP、DISCONNECT)进行解析,并且结合一些项目经验进行说明。
相关参考:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.pdf