ESP32/ESP8266 MQTT协议接入阿里云(二)
1、在连接阿里云之前,需要先了解MQTT的连接协议。
CONNECT 协议格式:固定包头+可变包头+有效载体
(1)固定报头
长度:2~5bytes
包括报文类型(1),固定保留位(0)和剩余长度。
剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。
注意:当剩余长度大于0x7F后,需要进位。
剩余长度字段的字节长度:最少1个字节,最多4个字节。
剩余长度字段可以表示的长度:1个字节时,可以表示剩余 0~127 长度。4个字节时,最大表示长度为 2^(7*4) - 1 = 2^28 - 1 = 268435455 长度。
剩余长度
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|
进位标志位 | 数据位6 | 数据位5 | 数据位4 | 数据位3 | 数据位2 | 数据位1 | 数据位0 |
当剩余长度>127也就是>0x7F后,需要进位,bit7=1,剩余长度增加一个字节,例如0xE1=0B1110 0001。 | |||||||
0xE1转成剩余长度:0xE1 0x01,前面0xE1=(剩余长度&0x7F) | 进位标志位0x80,后面0x01=剩余长度>>7位。 |
(2)可变报头
长度:10bytes。
Byte8 连接标志(Connect Flags)
连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在。我们需要用到Clean Session、PassWordFlag和UserName Flag。即0xC2.
Byte9 Byte10 保持连接
长度:2bytes
保持连接(KeepAlive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。如果在设置的时间的1.5倍内没有发送报文,则自动断开连接。
0x00 0x64表示100s。
(3)有效载体
有效载体可以分为:ClientID+Username+Password
每个部分前面有2个字节是该部分的长度。表示16位的长度
lenght_high (1 Byte) | lenght_low(1 Byte) | ClientID_data (n Bytes) | lenght_high(1 Byte) | lenght_low (1 Byte) | Username_data(n Bytes) | lenght_high(1 Byte) | lenght_low (1 Byte) | Password_data(n Bytes) |
---|---|---|---|---|---|---|---|---|
ClientID、Username和Password可以用三元组在软件中生成
生成器连接,提取码:6666.
使用生长器生成ClientID、Username和Password。
复制好后点击生成。
此处协议所需的所有东西都有了。接下来是wifi模块的使用,用的是AT指令集。
2、wifi模块联网,先连接wifi,然后设置传输模式,再发起TCP连接,最后进入透传。具体指令如下图。
这里的域名就是生成出来的连接域名。
3、ESP32/ESP8266接入阿里云平台
MQTT的报文:10 84 01 00 04 4d 51 54 54 04 c2 00 64 00 36 31 32 33 34 35 36 7c 73 65 63 75 72 65 6d 6f 64 65 3d 33 2c 73 69 67 6e 6d 65 74 68 6f 64 3d 68 6d 61 63 73 68 61 31 2c 74 69 6d 65 73 74 61 6d 70 3d 31 32 33 7c 00 16 45 53 50 33 32 5f 6e 6f 74 65 26 61 31 75 63 6f 73 44 55 6d 32 38 00 28 45 39 35 32 38 32 34 44 30 38 33 42 45 39 42 43 38 39 36 42 46 41 37 33 42 44 44 30 33 33 36 42 43 30 36 46 32 43 37 31
固定包头:10 84 01
可变包头: 00 04 4d 51 54 54 04 c2 00 64
有效载体:
ClientID lenght :00 36
ClientID:31 32 33 34 35 36 7c 73 65 63 75 72 65 6d 6f 64 65 3d 33 2c 73 69 67 6e 6d
65 74 68 6f 64 3d 68 6d 61 63 73 68 61 31 2c 74 69 6d 65 73 74 61 6d 70 3d
31 32 33 7c
“123456|securemode=3,signmethod=hmacsha1,timestamp=123|”
Username lenght:00 16
Username:45 53 50 33 32 5f 6e 6f 74 65 26 61 31 75 63 6f 73 44 55 6d 32 38
“ESP32_note&a1ucosDUm28”
Password lenght:00 28
Password:45 39 35 32 38 32 34 44 30 38 33 42 45 39 42 43 38 39 36 42 46 41 37 33
42 44 44 30 33 33 36 42 43 30 36 46 32 43 37 31
“E952824D083BE9BC896BFA73BDD0336BC06F2C71”
发送报文。
再查看设备
这时已经接入成功。ESP32/ESP8266 MQTT协议接入阿里云(三)将会介绍数据上传和数据下发。