MQTT阿里云
学习资料:
MQTT介绍
MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。
MQTT报文功能解释(部分)
连接物联网云平台的某个具体设备
报文功能:连接云的某个具体设备
CONNECT:
固定报头:
1b:0x10
2b:??
可变报头:
1b:0x00
2b:0x04
3b:'M' 0x4D
4b:'Q' 0x51
5b:'T' 0x54
6b:'T' 0x54
7b:0x04
8b:0xC2
9b:0x00
10:0x3C
有效负载:
ClienID_Len(2byte)+CilenID+
UserName_Len(2byte)+UserName+
PassWord_Len(2byte)+PassWord
连接报文总览:
10 74 00 04 4D 51 54 54 04 C2 00 3C 00 29 6C 69 5F 74 65 73 74 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 00 13 6C 69 5F 74 65 73 74 26 61 31 35 4A 32 77 48 75 57 66 75 00 28 39 35 65 32 38 32 32 31 35 30 34 63 37 62 63 35 33 33 35 65 62 65 39 36 31 33 62 34 61 32 65 62 32 61 39 63 66 36 66 37
向物联网云平台发送消息
报文功能:给云发送消息
报文名:PUBLISH
报文原型:
固定报头:
1b:0x30
2b:0xE4 0x01
可变报头:
Topic_Len(2byte)+Topic
00 32 2F 73 79 73 2F 61 31 35 4A 32 77 48 75 57 66 75 2F 6C 69 5F 74 65 73 74 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74
有效负载:
纯数据、纯消息(JSON格式数据)
连接报文总览:
09 7B 0D 0A 09 09 22 69 64 22 3A 22 32 33 30 37 38 38 30 22 2C 0D 0A 09 09 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 70 61 72 61 6D 73 22 3A 7B 20 20 0D 0A 09 09 09 09 22 43 75 72 72 65 6E 74 48 75 6D 69 64 69 74 79 22 3A 38 30 2C 0D 0A 09 09 09 09 22 43 75 72 72 65 6E 74 54 65 6D 70 65 72 61 74 75 72 65 22 3A 32 36 2C 0D 0A 09 09 09 09 22 52 65 6C 61 79 22 3A 31 0D 0A 09 09 09 7D 2C 0D 0A 09 09 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 22 0D 0A 09 7D
订阅主题才能接收到物联网云平台的消息
报文功能:订阅主题 才能接收到云的消息
报文名字:SUBSCRBIE
报文原型:
固定报头:
1b:0x82
2b:??
可变报头:
1b:00
2b:0x0A
有效负载:
主题长度(2字节)+主题本身+0
STM32实战演习
阿里云物联网平台设置
-
创建产品(你的产品名称--会有你的产品KEY)
-
Topic类列表:
-
基础通信Topic
-
物模型通信Topic:我们想要让设备(STM32)中数据上传、数据回收 就要使用到里面的
属性上报 /sys/Your产品KEY/${deviceName}/thing/event/property/post 发布 设备属性上报
这个就是我们将STM32采集到的数据上传使用的主题
要将里面的${deviceName} 改成 (你自己的设备名称),上面的发布意思是 我们具有发布的权限
属性设置 /sys/Your产品KEY/${deviceName}/thing/service/property/set 订阅 设备属性设置
这个就是我们可以使用阿里云物联网下发数据使用的主题
要将里面的${deviceName} 改成 (你自己的设备名称),上面的订阅意思是 我们具有订阅的权限
-
自定义Topic
-
-
功能定义:这里放置你要上传的STM32的数据
-
-
添加设备 (基于上方创建的产品下--设备名称)
-
设备信息:MQTT连接信息
{ "clientId":"Your clientId", "username":"Your username", "mqttHostUrl":"iot-06z00f5ugqk5544.mqtt.iothub.aliyuncs.com", "passwd":"Your passwd", "port":1883 }
-
物模型数据:产品中的功能定义上线的功能会在这里出现
-
-
完成以上两步后,可以先使用MQTT.fx软件实现MQTT连接阿里云,发送的数据格式应该如下
-
{ "method" : "thing.event.property.post" , "id": "162277852", "params" :{ "Tem" : 11.0, "Hum" : 22.0 }, "version" : "1.0.0" }
使用MQTT代码连接阿里云
-
-
-
路径:paho.mqtt.embedded-c-master\MQTTPacket\src
-
这个src里面的所有
.c
和.h
文件都要,然后将他们复制到我们keil的工程文件里面,新建一个MQTT文件夹 -
文件名 解释 MQTTConnectClient.c 包含了作为MQTT客户端的连接服务器,断开连接,发送心跳请求的函数 MQTTConnectServer.c 包含了作为MQTT服务端处理连接请求所需要的函数 MQTTDeserializePublish.c 包含了解析PUBLISH报文的函数,通俗说就是接收消息用的 MQTTFormat.c 包含了报文构造函数,被其它文件中的报文构造函数调用,不直接调用里面的函数 MQTTPacket.c 包含了供其他文件调用的一些解析报文用的函数 MQTTSerializePublish.c 包含了构造PUBLISH,PUBACK,PUBREC,PUBREL报文的函数,通俗说就是发消息用的 MQTTSubscribeClient.c 包含了构造SUBSCRIBE报文的函数,发送订阅主题的请求时使用的 MQTTSubscribeServer.c 包含了解析SUBSCRIBE和构造SUBACK的函数,服务端使用的文件 MQTTUnsubscribeClient.c 包含了构造UNSUBSCRIBE的函数,发送取消订阅主题的时使用 MQTTUnsubscribeServer.c 包含了解析UNSUBSCRIBE和构造UNSUBACK报文的函数,服务端使用的文件
-
-
那我们如何使用这个库函数呢?可以参考 他给的库中的代码示例(示例在和src同一级里面的samples中)
-
使用代码实现上传到阿里云
/*ESP8266.c中的代码*/ /** * @brief 使用AT指令 WIFI先连接阿里云服务器 * @param * @retval */ void Wifi_ConnectAliYun(void) { if(EspSendCmdAndCheckRecvData("AT\r\n","OK",1000) == 1) { if(EspSendCmdAndCheckRecvData("AT+CWMODE=1\r\n","OK",1000) == 1) { if(EspSendCmdAndCheckRecvData("AT+CWJAP=\"Your热点名称\",\"Your 热点密码\"\r\n","OK",10000) == 1) { if(EspSendCmdAndCheckRecvData("AT+CIPSTART=\"TCP\",\"iot-06z00f5ugqk5544.mqtt.iothub.aliyuncs.com\",1883\r\n","OK",10000)==1)//连接阿里云服务器的网址和端口号都是共用的 { EspSendCmdAndCheckRecvData("AT+CIPMODE=1\r\n","OK",1000);//开启透传 EspSendCmdAndCheckRecvData("AT+CIPSEND\r\n",">",1000);//发送数据 MqttConnect();//MQTT开始连接物联网平台 Delay_ms(100);//连接成功之后 不能立刻执行其他的功能 //MqttSubscride();只需要订阅一次 //清空回收的buff memset(wifi.rxbuff,0,1024); wifi.rxover = 0; wifi.rxcount = 0; } } } } } /** * @brief 使用MQTT连接阿里云物联网平台 -- 平台兼容MQTT协议5.0、3.11、3.1版本 -- * @param * @retval */ void MqttConnect(void) { MQTTPacket_connectData data = MQTTPacket_connectData_initializer;//使用MQTT库函数中的宏定义初始化 data data.clientID.cstring = "Your clientId";//根据上文中你的ID data.username.cstring = "Your username";//你的username data.password.cstring = "Your password";//你的密码 /*下面这个操作就是把data中的数据 构造成可以使用的CONNECT的报文 然后将这个报文 放到wifi.txbuff缓存起来 并返回报文的长度*/ int len = MQTTSerialize_connect(wifi.txbuff, 1024, &data); Esp8266_SendString(wifi.txbuff,len);//通过串口发送到ESP8266然后MQTT协议开始和物联网平台对接 }
/*使用到MQTT库函数连接到物联网平台的部分代码--MQTTConnectClient.c*/ #define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 } /*初始化用到的就是 标签:char,wifi,报文,09,STM32,MQTT,65,云物 From: https://www.cnblogs.com/Sakura-Ji/p/17744771.html