我是靠谱客的博主 无聊冷风,这篇文章主要介绍STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(三)STM32部分STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(三)STM32部分,现在分享给大家,希望可以做个参考。

STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(三)STM32部分

关于单片机部分主要使用ESP8266 WIFI模块进行联网,单片机采用STM32ZET6

ESP8266部分

在这里插入图片描述

ESP8266是一款使用非常广泛的WIFI模块,这里我们通过单片机的AT指令来控制它
这里有8266的AT指令手册:https://www.espressif.com/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
在进行程序测试之前,推荐使用串口调试助手直接连接8266测试AT指令,和检查模块是否可用
在这里插入图片描述

关于ESP8266的具体细节可以查看官网接下来来讲解STM32程序部分

STM32程序

因为MQTT的协议建立在TCP的连接之上,所以我们要用8266建立一个TCP连接,我们对照手册进行设置

我们首先把8266初始化

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
UsartPrintf(USART_DEBUG, "1. ATrn");//检查AT指令是否可用 while(ESP8266_SendCmd("ATrn", "OK")) DelayXms(500); UsartPrintf(USART_DEBUG, "2. CWMODErn");//将8266设置为STA模式 while(ESP8266_SendCmd("AT+CWMODE=1rn", "OK")) DelayXms(500); UsartPrintf(USART_DEBUG, "3. AT+CWDHCPrn");//开启DHCP while(ESP8266_SendCmd("AT+CWDHCP=1,1rn", "OK")) DelayXms(500); UsartPrintf(USART_DEBUG, "4. CWJAPrn");//设置要连接的WIFID的SSID和密码 //ESP8266_WIFI_INFO "AT+CWJAP="Lord AC","19981220"rn" while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "OK")) DelayXms(500); UsartPrintf(USART_DEBUG, "5. CIPSTARTrn");//设置为TCP连接,并设定IP和端口号 //ESP8266_ONENET_INFO "AT+CIPSTART="TCP","183.230.40.39",6002rn" while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) DelayXms(500); UsartPrintf(USART_DEBUG, "6. ESP8266 Init OKrn");//初始化完成

完成以上步骤TCP连接就成功建立了,将产品ID等写成宏定义,通过函数封装连接平台(具体的封装函数不做详解,都是C语言的知识,之后会将整个工程放到Github)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define PROID "367119" #define AUTH_INFO "test" #define DEVID "619588959" if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0) { ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传平台 dataPtr = ESP8266_GetIPD(250); //等待平台响应 if(dataPtr != NULL) { if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK) { switch(MQTT_UnPacketConnectAck(dataPtr)) { case 0:UsartPrintf(USART_DEBUG, "Tips: 连接成功rn");status = 0;break; case 1:UsartPrintf(USART_DEBUG, "WARN: 连接失败:协议错误rn");break; case 2:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法的clientidrn");break; case 3:UsartPrintf(USART_DEBUG, "WARN: 连接失败:服务器失败rn");break; case 4:UsartPrintf(USART_DEBUG, "WARN: 连接失败:用户名或密码错误rn");break; case 5:UsartPrintf(USART_DEBUG, "WARN: 连接失败:非法链接(比如token非法)rn");break; default:UsartPrintf(USART_DEBUG, "ERR: 连接失败:未知错误rn");break; } } } MQTT_DeleteBuffer(&mqttPacket); //删包 }

串口1会打印调试信息,我们可以看到已经成功连接,并且我们打开OneNET后台,也可以看到设备上线
在这里插入图片描述
在这里插入图片描述

发送数据

采用JSON格式将数据封成包,然后上传

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
unsigned char OneNet_FillBuf(char *buf) { char text[48]; memset(text, 0, sizeof(text)); strcpy(buf, "{"); memset(text, 0, sizeof(text)); sprintf(text, ""test":%d,",666); strcat(buf, text); memset(text, 0, sizeof(text)); sprintf(text, ""test2":%d",888); strcat(buf, text); strcat(buf, "}"); return strlen(buf); } void OneNet_SendData(void) { MQTT_PACKET_STRUCTURE mqttPacket = {NULL, 0, 0, 0}; //协议包 char buf[128]; short body_len = 0, i = 0; UsartPrintf(USART_DEBUG, "Tips: OneNet_SendData-MQTTrn"); memset(buf, 0, sizeof(buf)); body_len = OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度 if(body_len) { if(MQTT_PacketSaveData(DEVID, body_len, NULL, 3, &mqttPacket) == 0) //封包 { for(; i < body_len; i++) mqttPacket._data[mqttPacket._len++] = buf[i]; ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台 UsartPrintf(USART_DEBUG, "Send %d Bytesrn", mqttPacket._len); MQTT_DeleteBuffer(&mqttPacket); //删包 } else UsartPrintf(USART_DEBUG, "WARN: EDP_NewBuffer Failedrn"); } }

同时我们可以在后台查看到刚刚上传的数据
在这里插入图片描述

至此我们成功完成上传数据

项目文件地址

附上整个项目的github地址https://github.com/DevilAC/MQTT-STM32-ESP8266/tree/master

最后

以上就是无聊冷风最近收集整理的关于STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(三)STM32部分STM32 MQTT协议 连接中国移动OneNet服务器 上传接收数据(三)STM32部分的全部内容,更多相关STM32内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部