|
本帖最后由 jiangzhiwei 于 2019-10-16 23:07 编辑
在上一篇对mqtt简单的认识了之后,这一篇我讲解一下TCP-MQTT的转化过程
首先 感谢以下 几篇文章 大家可以参考:我也算是从这几个之中搬运的了~~
https://blog.csdn.net/libaineu2004/article/details/78773610
https://www.cnblogs.com/hbzzm/p/5813070.html
https://www.cnblogs.com/yangfengwu/p/9124299.html
(注: 近期学业繁忙
本帖暂时停止维护,如有问题恕不能回复,望谅解)
好了,接下来我来综合一下我所知道的~
上一篇我们讲到 MQTT是基于TCP之上开发的,所以在了解MQTT之前 先了解TCP协议~~
接下来讲解一下建立过程
在TCP连接建立之后,我们8266也就是作为一个TCP客户端,去连接了MQTT服务端,需要及时的发送第一条数据段,如下
10 35 00 06 4d 51 49 73 64 70 03 c2 01 2c 00 0f 38 36 31 36 39 34 30 33 30 31 34 32 34 37 33 00 0c 6c 69 62 61 69 6e 65 75 32 30 30 34 00 08 31 32 33 34 35 36 37 38
(以16进制发送)
0x10 -----------代表固定开头 就像起始位一样,他就是这么定义的
(这里0x10就是数据段的第一个数10 0x是16进制,后面一样,这个就不多解释了)
0x35 ----------------代表数据的长度 ,转化为10进制是53,就是说在你后面总共有53个字节的数据,不包括他自己,也就是说包括加上开头,从头到尾一共是53+2=55个字节的数据~~~这里只要算他之后的长度行了
(不知道16进制怎么转10进制的的进这个网址自己转化 http://tool.oschina.net/hexconvert/)
0x00 0x06 --------这是一组数据 这两个合起来看就是一个数字6,代表协议的名称 “MQIsdp”
6个字符的数据长度
0x4d 0x51 0x49 0x73 0x64 0x70 -------在之后的6个数据,里这六位就代表'M','Q','I','s','d','p'
注意,是字符 ‘M’的ASCI码的16进制就是0x4d,后面的一样~
0x03 -----------------等于10进制的3 代表的是版本号是3 版本。
0xc2 -----------------------连接标志位 反正记得在输完前面的之后 这里加个这个就行,就当做是固定的协议吧,他还有其他的标志位 如0xc6 这个我还没查到代表的啥~~所以、、就不多说了就先用0xc2吧。
0x01 0x2c----------------这两个也是一组数据,代表的是保活时间(KeepAlive)
不妨用转换来转换一下这两个,
看到是等于300,也就是说300s里需要发送心跳包去确认连接是否存在,否则会断开连接。这个是自己设定的,你可以设60 ,那输入的就是0x00 0x3c,记住一定要是2个数据段!!这代表的就是60。
0x00 0x0f -------------也是一组的看(2个数据)10进制的15,代表的是你作为客户端的ID长度,
ID是自己设置的,自己设置多少,这里就写id的长度。这里是15个长度。
.38 36 31 36 39 34 30 33 30 31 34 32 34 37 33 后面的这个15个数据就代表的你的ID名称
’8‘ '6' '1' '6' '9' '4' '0' '3' '0' '1' '4' '2' '4' '7' '3' 的十六进制数
0x00 0x0c -----------十进制12 代表服务器用户名长度,同上面一样,自行设置
6c 69 62 61 69 6e 65 75 32 30 30 34 ---这里12位就是对应的用户名啦
'l' 'i' 'b' 'a' 'i' 'n' 'e' 'u' '2' '0' '0' '4'
0x00 0x08 --------十进制 8 代表服务器密码长度 同上 自行设置
31 32 33 34 35 36 37 38 --------这里8位数就是密码了 到这里就结束了~
'1' '2' '3' '4' '5' '6' '7' '8'
-------------------------------------------------------------------------------------------------------------
以上就是MQTT的协议的连接了
当你用TCP客户端发送以上数据后,就会收到 服务端的回应
20 02 00 00 这就说明你成功连接上了!!!
接下来就是订阅主题消息和发布主题消息
其实理解了连接,订阅和发布就很好理解了,
///////////////////////////////////////////////////////////////
订阅主题为"r"的消息 Qos==0;
开头0x82
消息长度0x06
消息识别 0x00 0x01(1)
主题长度 0x00 0x01
主题名'r' 0x72
Qos 0x00
连起来就是 82 06 00 01 00 01 72 00
///////////////////////////////////////////////////////////////////////////////////
取消订阅主题"r"
数据头 0xa2
数据长度 0x05
消息识别 0x00 0x02 (2)
主题长度 0x01 0x01 (1)
主题“r” 0x72
连起来就是 a2 05 00 02 00 01 72
///////////////////////////////////////////////////////////////////////////////////
发布主题为"r"的消息 Qos==0 内容是“Hello word!”;
开头0x30
(0x30=0010 0000(二进制)
0011-------消息类型(3)发布消息
....0.. ------DUP标志
.......00. --------Qos的等级 0
...........0 ----------retain :不设置
这里我们只要知道带颜色的这两个就行了。其他的不深究了~~
)
消息长度0x0f
主题长度 0x00 0x01
主题名'r' 0x72
消息内容 "(这里就是Hello word! 的每个字符的16进制数了)"
连起来 就是
30 0f 00 01 72 68 65 6c 6c 6f 20 77 6f 6c 64 21
///////////////////////////////////////////////////////////////////////////////////
客户端关闭
e0 00
心跳包(每隔一段时间就需要发送的保活心跳包)
c0 00
理解了上面的,我们就可以用AT指令去开发MQTT了
所以用AT指令去开发,MQTT,需要做的,就是先建立TCP客户端连接,在保证能与服务端通信的情况下,按照上面的格式,去发送数据,就可以实现MQTT通信了。
下一篇我会贴具体的代码。~~另外有问题可以联系我~
第三篇
https://www.arduino.cn/thread-83047-1-1.html
|
|