MQTT链接阿里云
1.创建产品及设备,
产生三元组
三元组
{ "ProductKey": 标示产品
"DeviceName": 标识设备
"DeviceSecret":密钥
"ProductKey": "a1pC3rpU4xF",
"DeviceName": "Lock_1",
"DeviceSecret": "cba236e94094a0399060a9fe355bef88"
}
访问远程主机的域名格式
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883
即 IP地址
a1pC3rpU4xF.iot-as-mqtt.cn-shanghai.aliyuncs.com
mqttClientId 格式:
clientId(DeviceName)+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
securemode=3,TCP直连
Lock_1|securemode=3,signmethod=hmacsha1|
mqttUsername 格式: deviceName(DeviceName)+"&"+productKey
Lock_1&a1pC3rpU4xF
mqttPassword 格式: sign_hmac(deviceSecret,content)
哈希算法(A,B)
A 要加密的字符串 content
clientId*deviceName*productKey#
*->DeviceName
#->ProductKey
clientIdLock_1deviceNameLock_1productKeya1pC3rpU4xF
B 密钥 DeviceSecret
cba236e94094a0399060a9fe355bef88
bc5f3a9e47c628ed91c74054bc33a1bd9ff25a7c
/Topic 报文/
通配符 # +
Topic 列表
属性上报(客户机向服务器发报文)
/sys/ProductKey/${deviceName}/thing/event/property/post
发布
设备属性上报
/sys/a1pC2rpU4xF/Lock_1/thing/event/property/post
属性上报(服务器响应客户机)
/sys/ProductKey/${deviceName}/thing/event/property/post_reply
订阅
云端响应属性上报
/sys/a1pC2rpU4xF/Lock_1/thing/event/property/post_reply
属性设置(服务器下发报文)
/sys/ProductKey/${deviceName}/thing/service/property/set
订阅
设备属性设置
/sys/a1pC2rpU4xF/Lock_1/thing/service/property/set
2.MQTT格式
//固定报头(报文类型+标志位+剩余长度)
1字节 1字节
报文类型+标志位
CONNECT 第0字节:0X10(CONNECT) -> 0001 0000
剩余长度(最多127个字节)
表示当前报文剩余部分的字节数,包括可变报头和负载的数据。
剩余长度不包括用于编码剩余长度字段本身的字节
//可变报头(报文标识符MSB+报文标识符LSB+协议名(Protocol Name)+协议级别(Protocol Level)+连接标志(Connect Flags)+保持连接(Keep Alive))
1字节 1字节 6字节 1字节 1字节 2字节
CONNECT(不需要报文标识符)从协议名开始
//有效载荷(客户端标识符 (ClientId),遗嘱主题,遗嘱消息,用户名,密码 )
CONNACK(需要)
MQTT 数据报类型
/CONNECT:连接报文**/
固定报头:
1byte: 0x10
2byte: ??
可变报头:
1byte: 0x00 ->0
2byte: 0x04 ->4
3byte: 0x4D ->M(81)
4byte: 0x51 ->Q(81)
5byte: 0x54 ->T(84)
6byte: 0x54 ->T(84)
7byte: 0x04 ->4
8byte: 0xC2 ->(1100 0010) 连接标志:(密码标志 Password Flag+用户名标志 User Name Flag+清理会话 Clean Session)
9byte: 0x00 ->0
10byte: 0x3C ->60(保持连接(Keep Alive)共60秒)
有效载荷:客户端标识符 (ClientId)+用户名+密码
ClientID_Len+ClientID+UserName_Len+UserName+PassWord_Len+PassWord
39(0X27) 17(0X11) 40(0X28)
ClientID:temp1|securemode=3,signmethod=hmacsha1|
74 65 6D 70 31 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 7C
UserName:temp1&a13GwFISwtD
74 65 6D 70 31 26 61 31 33 47 77 46 49 53 77 74 44
PassWord:00606113052b472fd762acd90dd2268c61450673
30 30 36 30 36 31 31 33 30 35 32 62 34 37 32 66 64 37 36 32 61 63 64 39 30 64 64 32 32 36 38 63 36 31 34 35 30 36 37 33
27 74 65 6D 70 31 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 7C
11 74 65 6D 70 31 26 61 31 33 47 77 46 49 53 77 74 44
28 30 30 36 30 36 31 31 33 30 35 32 62 34 37 32 66 64 37 36 32 61 63 64 39 30 64 64 32 32 36 38 63 36 31 34 35 30 36 37 33
CONNECT(完整)
10 ?? 00 04 4D 51 54 54 04 C2 00 3C 27 74 65 6D 70 31 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 7C
11 74 65 6D 70 31 26 61 31 33 47 77 46 49 53 77 74 44
28 30 30 36 30 36 31 31 33 30 35 32 62 34 37 32 66 64 37 36 32 61 63 64 39 30 64 64 32 32 36 38 63 36 31 34 35 30 36 37 33
/****CONNACK-确认连接 ******/
注意: CONNACK 报文没有有效负荷。
若正常链接 收到的 CONNACK 报文为:0x20,0x02,0x00,0x00。
/****SUBSCRIBE 订阅主题 ******/
/****SUBACK-订阅确认 ******/
允许的返回码值:
0x00 - 最大 QoS 0
0x01 - 成功 – 最大 QoS 1
0x02 - 成功 – 最大 QoS 2
0x80 - Failure 失败
0x00, 0x01, 0x02, 0x80 之外的 SUBACK 返回码是保留的,不能使用。
/****UNSUBSCRIBE-取消订阅 ******/
/****UNSUBACK-取消订阅确定 ******/
UNSUBACK 报文没有有效负荷。
/****PUBLISH-发布消息 ******/
//固定报头(MQTT数据包类型+重发标志+服务质量等级+保留标志)
4位 1位 2位 1位
目前流行的共享单车智能锁,智能锁可以定时使用 QoS level 0 质量消息请求服务器,发送单车的
当前位置,如果服务器没收到也没关系,反正过一段时间又会再发送一次。之后用户可以通过 App 查询周
围单车位置,找到单车后需要进行解锁,这时候可以使用 QoS level 1 质量消息,手机 App 不断的发送解锁消息给单车锁,确保有一次消息能达到以解锁单车。最后用户用完单车后,需要提交付款表单,可以使用 QoS
level 2 质量消息,这样确保只传递一次数据,否则用户就会多付钱了。
//可变报头(主题名+报文标识符)
//有效负荷 Josn格式
//整合
/****PUBACK-发布确认 ******/
发布信息用的为Qos0 未用到
/****PINGREQ-心跳请求 ******/
未用到
/****PINGRESP-心跳响应 ******/
未用到
/****DISCONNECT-断开连接 ******/
未用到
注意: DISCONNECT 报文没有可变报头和有效负荷