【STM32+MQTT+ONENET】26,MQTT协议接⼊OneNET MQTT协议是⼀个⾯向物联⽹应⽤的即时通信协议,使⽤TCP/IP提供⽹络连接,能够对负载内容实现消息屏蔽传输,开销⼩,可以有效降低⽹络流量。MQTT协议适⽤于设备和平台需要保持长连接的使⽤场景,MQTT特点在于可以实现设备间的消息单播以及组播,可以不依赖于其他服务(下发命令服务,推送服务等)实现让设备以应⽤服务器的⽅式对真实设备进⾏管理和控制。
正因为MQTT协议拥有这些特点,现在成⽂了各个物联⽹云平台⽀持的最⼴泛的协议,百度、阿⾥、亚马逊、OneNet等国内外物联⽹云服务提供商均⽀持该协议,所以在做物联⽹开发的过程中,有必要学习和了解⼀下该协议。接下来我们就以OneNET的MQTT接⼊协议为例,学习⼀下该协议个通讯。
硬件连接环境:麒麟座迷你开发板⽤STlink连接到PC的USB⼝
软件开发环境:Keil MDK5.25编辑麒麟座mini开发板官⽅例程””
⽹络环境:PC机以太⽹卡连接路由器接⼊互联⽹,Windows10⽆线⽹卡建⽴热点,麒麟座开发板的ESP8266经过热点接⼊互联⽹。
抓包⼯具:抓取以太⽹卡的数据包,设置过滤条件为”ip.addr == 183.230.40.39”,只显⽰与OneNET MQTT服务器通讯的数据包。
模拟器:,在PC上可以模拟嵌⼊式设备通讯。
参考⽂档:OneNET官⽅MQTT⽂档:””,MQTT中⽂⽂档
交互过程:连接权鉴,数据上报,命令下发,断开连接。
⼀、连接权鉴
⾸先在修改官⽅例程中的参数信息,把WiFi名称和密码改成使⽤PC⽆线⽹卡模拟的热点⽹络,OneNET服务器的IP地址和端⼝号确保为”183.230.40.39”和”6002”,onenet.c中的PROID、DEVID、AUTH_INFO修改为项⽬中的真实值。
编译并下载程序到麒麟座迷你开发板,在PC上使⽤Wireshark开始抓取以太⽹卡的数据包,设置过滤条件为”ip.addr ==
183.230.40.39”,只显⽰与OneNET MQTT服务器通讯的数据包。给麒麟座开发板上电,等待⼏秒钟后,就可以看到开发板与OneNET服务器通讯的数据包了。
数据包中前三帧为开发板与OneNET服务器建⽴TCP连接的三次握⼿信息,这个是开发板给ESP8266发送建⽴TCP连接指令
后,ESP8266与服务器之间⾃动建⽴的。
数据包的第四帧⾄第五帧为麒麟座开发板项OneNET发送的鉴权信息和服务区应答。第六帧和第七帧
是OneNET服务器返回的鉴权结果信息和ESP8266的应答。
在以上过程中,我们作为设备端开发⼈员,只需要了解第四帧的鉴权信息发送和第六帧的服务器鉴权结果返回就可以了。
接下来重点分析第四帧数据,次帧数据总计有114字节,去除以太⽹头14字节,IP头20字节,TCP头20字节,剩余的TCP有效载荷共计60字节。
根据MQTT报⽂协议中规定,每⼀个MQTT包总共包含三部分:
1、Fixed Header部分定义如下:
根据抓包的数据,TCP负载的第⼀个字节是0x10,对应表格可以得知,MQTT Packet Type值为1,名称为CONNECT,其功能是客户端请求与服务器建⽴连接。其第⼆个字节的0x3a为表格中的Remaining Length字段,为数据包的长度。
根据MQTT协议规定,剩余长度(Remaining Length)表⽰当前报⽂剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括⽤于编码剩余长度字段本⾝的字节数。0x3a为⼗进制的58,这个数正好是TCP负载的60字节减去固定报头的两个字节长度。⾄于如何判断剩余长度占⽤的字节数,MQTT协议是这么规定的:
剩余长度字段使⽤⼀个变长度编码⽅案,对⼩于128的值它使⽤单字节编码。更⼤的值按下⾯的⽅式处理。低7位有效位⽤于编码数据,最⾼有效位⽤于指⽰是否有更多的字节。因此每个字节可以编码128个数值和⼀个延续位(continuation bit)。剩余长度字段最⼤4个字节。
根据以上定义,0x3a的⼆进制最⾼位为0,可以判定数据长度为1字节。
固定报头的部分分析完成后,根据下表进⾏判断:开源mqtt服务器
2、CONNECT类型的消息是有可变报头和负载的。对于可变报头部分,按照以下格式编码:
对照抓包数据:
Md对应的ASCII码值为0x4d
其中byte1-byte6是固定值,表格与数据完全对应(即00 04 4d 51 54 04 c8)。Byte7表⽰MQTT协议版本,这个必须固定为4,即3.1.1版,OneNET只⽀持这⼀版本协议,不⽀持更早版本的协议。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论