300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

时间:2018-09-11 11:45:36

相关推荐

STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(二)MQTT协议常用报文详解

上一次我们讲了OneNet平台的注册,这次我们来讲一下MQTT的常用报文用法

上一篇地址/weixin_42138122/article/details/108062089

惯例先贴上协议手册:https://mcxiaoke.gitbooks.io/mqtt-cn/content/

我们对着手册慢慢看

CONNECT – 连接服务端

要想发送数据咱们至少要先连接上服务器吧,所以先来看一下连接报文

连接报文由固定报头可变报头有效载荷3个部分组成

固定报头

顾名思义,这个部分是不会变的,我们可以在协议手册里看到它是什么

第1位(byte1)是00010000转为16进制就是10一位8个字节,正好对应两位16进制,转为16进制是为方便表述和发送,之后的表达都会采用16进制

byte2是剩余长度,我们先不管这个

固定报头暂且定位10 ??

可变报头

byte1、byte2:前两位表示协议名的长度,因为我们的协议是“MQTT”所以是4位,因此前两位是00 04

byte3、4、5、6:后四位自然就是我们的MQTT四个字母了,分别将这几个字母的ASCII码转为16进制,所以后4位就是4D 51 54 54

byte7:这一位对应协议版本,由于我们用的3.1.1版本,所以这一位固定04

byte8:这一位相当于配置一些MQTT协议的模式,每一位的配置文档都有详细说明,如图配置,启用用户名和密码(相当于你的设备ID鉴权信息),不保留遗嘱,Qos等级0,所以这一位为C2

byte9、byte10:这两位用来设置连接保活时间,也就是你啥都不干多久被服务器踢下去,单位是秒,这里我们设置120秒,转为16进制也就是00 78

总体来看我们的可变报文为00 04 4D 51 54 54 04 C2 00 78

有效载荷

因为前面我们使了能用户名和密码,所以这个地方根据文档我们应该依次填入(遗嘱没有使能):

客户端标识符 Client Identifier:对应Onenet的设备ID

用户名 User Name:对应Onenet的产品ID

密码 Password:对应Onenet鉴权信息

格式如下长度+东西

上面为我画的示意图,注意这个地方按照你创建的设备来填写用户名密码,之前我们在固定报头一直没讲的第二位的取值为固定报头之后所有的长度,也就是可变报头+有效载荷

至此我们的连接报文已经完成了,打开网络助手,连接服务器建立TCP连接,官网可以看到IP和端口号

可以看到服务器,发了一串数据给我们应答,这个地方我们看最后一位,它表连接返回码,码字对应意义如下:

如果为00,则代表连接成功,如果为其他,请根据错误信息对照修改,如果你没有收到信息并且被直接断开,就说明你报文格式都不对,请根据上面的教程仔细检查修改

DISCONNECT –断开连接

上次讲了连接,这次来讲断开连接

断开连接可以说是相当简单,就是很简单的一条固定指令E0 00,先连接,之后再发送你就会发现连接断开了

SUBSCRIBE - 订阅主题

固定报头

一样很简单,固定的暂且定位82 ??

可变报头

这两个字节相当于给报文取名字,我们随便设置一个00 0A

有效载荷

如图可以看到有效载荷的结构长度+主题名+服务等级

假设我们订阅一个“test”主题

由于我们需要一个发送端和一个接收端,所以我们还需要一个设备,onent里面点击添加设备,另一个设备的connect报文请自己举一反三,这里不再赘述

先发连接报文,然后再发订阅报文

可以收到如下信息,参看手册可以发现我们的“00 0A”报文等级0订阅成功

PUBLISH – 发布消息

先介绍一点基础概念,推送订阅主题,这个东西有点像微博,如果你订阅了一个用户,那么这个用户发微博你就会收到推送,而这里的主题就相当于微博的用户,publish报文就相当于发微博,接下来我们看一看具体怎么写

固定报头

byte1、byte2:和连接报文一样,固定值和剩余长度,并且需要一定的配置,具体配置参数手册写的很清楚,这里不再赘述,我们这个地方配置Qos等级0不保留,所以这两位暂且为30??

可变报头

接下来是可变报头,包含主题名报文标识符,由于我们是qos0所以不需要报文标识符

假设我们向一个名为“test”的主题推送一条消息

总共包含长度主题名两个字段,以这里的"test"为例,长度为4,主题名自然就是test,将test转为16进制,报文则可以写作00 04 74 65 73 74

有效载荷

接下来是有效载荷,说白了就i是我们要发的消息,如文档所述,有效载荷的长度,会被服务器自己算出来,所以这里我们不需要给出,直接写我们要发的消息就行了,假设我们发送字符串"AC is the Best",将ASCII码转为16进制,则为41 43 20 69 73 20 74 68 65 20 42 65 73 74

由此,我们的推送报文就写好了,总体来看为30 14 00 04 74 65 73 74 41 43 20 69 73 20 74 68 65 20 42 65 73 74

我们打开两个网络调试助手来进行测试,一个连接设备1并推送一个连接设备2并订阅,接收端选择ASCII码显示,就可以我们已经收到了字符串"AC is the Best"

还有一些常用的报文,如PINGREQ – 心跳请求UNSUBSCRIBE –取消订阅等,但由于比较简单,所以希望大家跟着手册自己进行测试

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。