MQTT是非常常用的物联网传输协议,通过发布订阅方式实现通信,比如在OneNET平台发布一个主题Topic,单片机里如何订阅主题呢?首先要连接,然后订阅,对应有订阅报文。然后就可以上传数据,对应有发布消息报文,比如通过esp8266将采集的环境数据整理成MQTT规范的报文,发送到物联网平台。然后微信小程序就可以从云平台获取到环境数据。
connect报文,由固定,可变报头和有效载荷构成。
固定报头由两字节组成,其中一个字节是剩余长度,还不确定,用??表示。
可变报头
有效载荷
其中,密码中*#被替换后,还要进行哈希加密,加密使用的密钥就是DeviceSecret,最后会生成一串16进制字符串,就是最终的密码。
有效载荷整理如下
还要转换,将字符转为ASCII码,这时候是十进制,要用16进制表示。
红色框选中部分,代表后面字符个数,这是UTF-8的规范,即开头使用两字节表示后面字符的长度。
最终,有效载荷如下
然后与固定报头可变包头拼接
将固定报头的??替换为??后面的字符总数。如下
剩余长度,每个字节的最高位都是标志位。
比如,十进制112,小于128,一个字节就能表示,最高位为0,所以是0x70。
如果剩余长度大于了127,怎么办呢,比如为300。300=128*2+44=2^7+2^2+2^3+2^5。为什么是128,因为低8位的标志位不能算进去,绿色的1表示后面还有字节表示剩余长度,绿色0表示没有。最终为AC 02。
已知AC 02,求实际长度