目录
操作中使用到的相关链接资料:
一、华为云产品设备的创建
二、MQTT.fx调试
操作步骤:
三、网络调试助手NetAssist调试
1.CONNECT 报文--用于连接项目产品
最终CONNECT 报文
PING报文--用于保活
断开连接发送
2.PUBLISH – 发布消息
最终 PUBLISH 报文
四、串口调试助手XCOM调试(这里需要结合USB-TTL和ESP8266-01S)
总结:
文章来源地址https://www.toymoban.com/news/detail-430010.html
操作中使用到的相关链接资料:
- 云平台链接:华为云物联网平台_华为云IoT平台_IoT_设备接入-华为云 (huaweicloud.com)
- 华为云提供的MQTT.fx调试文档链接:使用MQTT.fx调测_设备接入 IoTDA_开发指南_设备侧开发_使用MQTT Demo接入_华为云 (huaweicloud.com)
- API参考:08 API参考 (huaweicloud.com)
一、华为云产品设备的创建 (产品创建就不多说了,创建的时候要知道自己创建的信息,重要的是记录下生成的信息Deviveld和DeviceSecret)
文章来源:https://www.toymoban.com/news/detail-430010.html
- 记录下的Deviveld和DeviceSecret通过华为云设备接入提供的MQTT ClientId生成工具(Huaweicloud IoTDA Mqtt ClientId Generator (myhuaweicloud.com))生成连接信息(ClientId、Username、Password)。这些信息都是后续需要。
- 还有一个域名和端口号需要记录
华为云的设备接入 IoTDA ->管理控制台 -> 总览 -> 接入信息,我们可以看到右边会跳出华为云设备接入的域名端口号信息。
这里我是真实设备硬件设备接入,采用MQTT协议。我们记录下我们需要的信息:
域名:211352f6b5.iot-mqtts.cn-north-4.myhuaweicloud.com
端口号:MQTT (1883)| MQTTS (8883)
IP地址(可选,获取方法:通过cmd命令窗口ping域名获取):121.36.42.100
-
二、MQTT.fx调试
- 这里的MQTT.fx调试是跟随华为云提供文档步骤操作的,可以参考使用MQTT.fx调测_设备接入 IoTDA_开发指南_设备侧开发_使用MQTT Demo接入_华为云 (huaweicloud.com)这里我简单介绍一下:
- MQTT.fx下载链接https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows-x64.exe
-
操作步骤:
- 打开软件单击设置图标
- 参考图片配置:红色框内需要填写,其他默认。配置完后点击Apply然后关闭该窗口。
需要填写IP地址不能通过域名,ClientId、Username、Password是前面让你记录的信息。
- 填写上报信息
- 一个Topic,上报消息的Topic格式为:“$oc/devices/{device_id}/sys/properties/report”
例:填写接口地址,此处以“$oc/devices/{device_id}/sys/properties/report”为例,如“$oc/devices/63b812b7b7768d66eb7080d9_MQTT_text/sys/properties/report”。
- 一个上报的数据格式参考:
例:数据格式:
{
"services": [{
"service_id":"Connectivity",
"properties": {
"dailyActivityTime":99
},
"event_time": "2023017T121212Z"
},
{
"service_id":"Battery",
"properties": {
"batteryLevel": 75
},
"event_time":"2023017T121212Z"
}
]
}
- 结果:(可以根据你自己创建的产品属性自定义上报的数据内容)
- 一个Topic,上报消息的Topic格式为:“$oc/devices/{device_id}/sys/properties/report”
-
三、网络调试助手NetAssist调试
- 调试前先注意左边两个HEX的红框,图片上还有连接信息(IP地址端口号),上报的数据(这里使用的MQTT协议,具体格式可以网上搜索相关MQTT文档翻阅,这里简单介绍几个连接与设备属性上传)
- 简单说一下MQTT报文包含固定报头、可变报头和负载
-
1.CONNECT 报文--用于连接项目产品
- 固定报头byte1:10 byte2...(这里字节得根据后面可变报头加上负载的长度得出,通常一个字节不过不排除数据多是两个字节甚至更多)
- 可变报头:00 04 4D 51 54 54 04 C2 00 64(10个字节)
保活时间:64 => 0110 0100(32+16+4=100秒)
详情翻看MQTT协议(我没放链接,网上应该有,或者可以私信我我免费给(没放链接有担忧的......))
- 负载:负载顺序:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。是否需要根据链接标志(这里我需要客户端标识符、用户名、密码(这些信息前面有让记录))
1. 客户端ID:
63b812b7b7768d66eb7080d9_MQTT_text_0_0_2023010612
00 31 36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 3064 39 5F 4D 51 54 54 5F 74 65 78 74 5F 30 5F 30 5F 32 30 32 33 30 31 30 36 3132
2. 用户名:
63b812b7b7768d66eb7080d9_MQTT_text
00 22 36 33 62 3831 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 30 64 39 5F 4D 51 54 54 5F74 65 78 74
3. 密码:
3b3264a175c8d1d89624b88312d5da71a3c5790577ffb1871a8723185165c0c5
00 40 33 62 33 3236 34 61 31 37 35 63 38 64 31 64 38 39 36 32 34 62 38 38 33 31 32 64 35 64 6137 31 61 33 63 35 37 39 30 35 37 37 66 66 62 31 38 37 31 61 38 37 32 33 31 3835 31 36 35 63 30 63 35
负载中的3 个信息都构建好了,那么把3 个信息按顺序,先是客户端id,然后是用户名,最后是密码,组合在一起16 进制如下:
(2+49+2+34+2+64 = 153 )
36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 30 64 39 5F 4D 51 54 54 5F 74 65 78 74 5F 30 5F 30 5F 32 30 32 33 30 31 30 36 31 32 00 22 36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 3064 39 5F 4D 51 54 54 5F 74 65 78 74 00 40 33 62 33 32 36 34 61 31 3735 63 38 64 31 64 38 39 36 32 34 62 38 38 33 31 32 64 35 64 61 37 31 61 33 6335 37 39 30 35 37 37 66 66 62 31 38 37 31 61 38 37 32 33 31 38 35 31 36 35 6330 63 35
- 计算固定报头中的剩余长度:
剩余长度 = 可变报头长度 + 负载长度
可变报头是 10 个字节, 负载是217 个字节,剩余长度 = 10 + 153= 163,163/128=1…35,需要进位,剩余长度2字节,如此固定报头就定下来了,我们简化 16 进制进行书写,结果如下:10 A3 01
-
最终CONNECT 报文为:
10 A3 01 00 04 4D 51 54 5404 C2 00 64 00 31 36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 30 64 39 5F4D 51 54 54 5F 74 65 78 74 5F 30 5F 30 5F 32 30 32 33 30 31 30 36 31 32 00 22 36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 37 30 38 30 64 395F 4D 51 54 54 5F 74 65 78 74 00 40 33 62 33 32 36 34 61 31 37 35 63 38 64 31 64 38 39 36 32 34 62 38 38 3331 32 64 35 64 61 37 31 61 33 63 35 37 39 30 35 37 37 66 66 62 31 38 37 31 6138 37 32 33 31 38 35 31 36 35 63 30 63 35
- 返回数据20 02 00 00 (有依据可查,翻看MQTT协议)
-
拓展一下PING报文--用于保活(由于connect报文设置了报获时间,这里我们需要定时发送PING(类似心脏,告诉服务器你这台设备还“活着”))
发送:C0 00 (返回数据:D0 00 )
-
断开连接
发送:E0 00(无返回数据)
-
2.PUBLISH – 发布消息
- 固定报头byte1:30 byte2....(剩余长度根据后面跟随的数据,计算方法如上)
- 可变报头
按顺序包含主题名和报文标识符。- 主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。
需要发布数据的Topic 字符串
Topic: $oc/devices/{device_id}/sys/properties/report
设备ID: 63b812b7b7768d66eb7080d9_MQTT_text
>> Topic:
$oc/devices/63b812b7b7768d66eb7080d9_MQTT_text/sys/properties/report
长度68字节,转成 16 进制,并且最前面加入表示长度的2个字节,
00 44 24 6F 63 2F 6465 76 69 63 65 73 2F 36 33 62 38 31 32 62 37 62 37 37 36 38 64 36 36 65 62 3730 38 30 64 39 5F 4D 51 54 54 5F 74 65 78 74 2F 73 79 73 2F 70 72 6F 70 65 7274 69 65 73 2F 72 65 70 6F 72 74
- 报文标识符(Packet Identifier)只有当QoS等级是1或2时,报文标识符(Packet Identifier)字段才能出现在PUBLISH报文中。(这里不需要)
- 主题名(Topic Name)用于识别有效载荷数据应该被发布到哪一个信息通道。
- 负载
数据格式如下:
{"services":[{"service_id":"Connectivity","properties":{"dailyActivityTime":57},"event_time":"20151212T121212Z"},{"service_id":"Battery","properties":{"batteryLevel":80},"event_time":"20151212T121212Z"}]}
长度205字节,转成 16 进制(这里特别注意,负载数据前,不用加 2 个字节)
7B 22 73 65 7276 69 63 65 73 22 3A 5B 7B 22 73 65 72 76 69 63 65 5F 69 64 22 3A 22 43 6F 6E6E 65 63 74 69 76 69 74 79 22 2C 22 70 72 6F 70 65 72 74 69 65 73 22 3A 7B 2264 61 69 6C 79 41 63 74 69 76 69 74 79 54 69 6D 65 22 3A 35 37 7D 2C 22 65 7665 6E 74 5F 74 69 6D 65 22 3A 22 32 30 31 35 31 32 31 32 54 31 32 31 32 31 325A 22 7D 2C 7B 22 73 65 72 76 69 63 65 5F 69 64 22 3A 22 42 61 74 74 65 72 7922 2C 22 70 72 6F 70 65 72 74 69 65 73 22 3A 20 7B 22 62 61 74 74 65 72 79 4C65 76 65 6C 22 3A 38 30 7D 2C 22 65 76 65 6E 74 5F 74 69 6D 65 22 3A 22 32 3031 35 31 32 31 32 54 31 32 31 32 31 32 5A 22 7D 5D 7D
- 剩余长度=可变报头长度(2+68)+负载长度(205)= 275 == 93 02
-
最终 PUBLISH 报文:
30 93 0200 44 24 6F 63 2F 64 65 76 69 63 65 73 2F 36 33 62 38 31 32 6237 62 37 37 36 38 64 36 36 65 62 37 30 38 30 64 39 5F 4D 51 54 54 5F 74 65 7874 2F 73 79 73 2F 70 72 6F 70 65 72 74 69 65 73 2F 72 65 70 6F 72 74 7B 22 73 65 7276 69 63 65 73 22 3A 5B 7B 22 73 65 72 76 69 63 65 5F 69 64 22 3A 22 43 6F 6E6E 65 63 74 69 76 69 74 79 22 2C 22 70 72 6F 70 65 72 74 69 65 73 22 3A 7B 2264 61 69 6C 79 41 63 74 69 76 69 74 79 54 69 6D 65 22 3A 35 37 7D 2C 22 65 7665 6E 74 5F 74 69 6D 65 22 3A 22 32 30 31 35 31 32 31 32 54 31 32 31 32 31 325A 22 7D 2C 7B 22 73 65 72 76 69 63 65 5F 69 64 22 3A 22 42 61 74 74 65 72 7922 2C 22 70 72 6F 70 65 72 74 69 65 73 22 3A 20 7B 22 62 61 74 74 65 72 79 4C65 76 65 6C 22 3A 38 30 7D 2C 22 65 76 65 6E 74 5F 74 69 6D 65 22 3A 22 32 3031 35 31 32 31 32 54 31 32 31 32 31 32 5A 22 7D 5D 7D
四、串口调试助手XCOM调试(这里需要结合USB-TTL和ESP8266-01S)
-
- ESP8266-01S的AT指令这里不细说了,简单步骤就是设置AP(连接热点)模式、连接WIFI热点、连接服务器、进入透传、发送数据等
- AT--测试是否OK
- AT+CWMODE=1 -- 设置AP模式
- AT+CWJAP="wifiname","wifipassword" -- 连接WIFI热点
- AT+CIPSTART="TCP","121.36.42.100",1883 -- 连接华为云服务器
- AT+CIPMODE=1 -- 准备透传
- AT+CIPSEND -- 开始透传
- 发送数据 -- 上面我们计算出的CONNECT 报文和 PUBLISH 报文
-
总结:
- 上面所有调试我均测试成功,服务器能够正常通信,可以参考MQTT协议和API参考编写更多的报文。
- 调试方法如上,真实设备的报文可以通过代码写好,就不用再计算了,计算有风险,本人在计算中出错导致没有建立连接,导致我又花了两个小时看文档,最后坚信自己的方法重新计算才发现问题。
- 重复一次手动计算有风险,又浪费时间,可以尝试一次但不建议每次报文都手动计算。可以通过代码实现。
- 我的设备是通过ESP8266-01S模块通信STM32F103开发板(开发板不限,有串口就行),主控开发板进行报文计算发送和接收服务器的数据进行解析。具体思路可以参考第四串口调试助手XCOM调试
到了这里,关于MQTT协议连接华为云的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!