stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT)

您所在的位置:网站首页 厚优是什么意思 stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT)

stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT)

#stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT)| 来源: 网络整理| 查看: 265

        前段时间弄懂了WiFi模块的使用,并成功通过MQTT协议上传数据到OneNet云平台。下面简要说下基本思路。

一.云平台上的操作

在OneNet平台上选择MQTT协议创建产品和设备,这里注意记下产品ID,设备ID和鉴权信息。

#define PRODUCTID "******" //产品ID #define PRODUCTID_LEN strlen(PRODUCTID) //产品ID长度 #define DEVICEID "**********" //设备ID #define DEVICEID_LEN strlen(DEVICEID) //设备ID长度 #define AUTHENTICATION "1234" //鉴权信息 #define AUTHENTICATION_LEN strlen(AUTHENTICATION) //鉴权信息长度 二.用到的串口和定时器

        本例用到了两个串口和三个定时器,各自的作用如下         串口1:打印要显示的信息到电脑屏幕上。         串口2:与ESP8266通信,ESP8266通过串口2连接到服务器,并接收云服务器发送来的数据。其中断函数将接收数据放入Usart2_RxBuff中,如果ESP8266连接上服务器,在数据接收完毕后启用定时器4。         定时器4:将串口2接收到的数据放入MQTT_RxDataInPtr[]。         定时器3:隔一段时间向云服务器发送ping命令(心跳包),用于保持和服务器连接 。         定时器2:隔一段时间将传感器采集到的数据重发更新。

三.ESP8266连接服务器

使用AT指令,这里不过多论述。

四.报文

推荐看下面两个文章

OneNET平台MQTT协议分析-电子发烧友网百度安全验证百度安全验证百度安全验证

1.连接报文(CONNECT) (1)固定报头

(2)可变报头

程序中为00 04 4D 51 54 54 04 C2 00 64

(3)有效载荷

包含一个或多个以长度为前缀的字段,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。(客户端标识符为设备ID,用户名为产品ID,密码为鉴权信息)。

2.确认连接报文(CONACK)

报文首字节为0x20

3.订阅报文(SUBSCRIBE) (1)固定报头 (2)可变报头

仅有报文标识符,格式为 MSB+LSB。

(3)有效载荷

SUBSCRIBE报文的有效载荷必须包含至少一组主题过滤器 和 QoS等级字段组合。 每一组主题过滤器 和 QoS等级的拼接组合为MSB+LSB+topic+Qos

4.订阅确认报文

报文首字节为0x90

5.PINGREQ报文

只有固定报头

 6.PINGRESP报文

只有固定报头

7.发布报文(PUBLISH)

PUBLISH是发布消息协议报文,服务端和客户端双方都可以使用。

void MQTT_PublishQs0(char *topic, char *data, int data_len) { int temp,Remaining_len; Fixed_len = 1; //固定报头长度暂时先等于:1字节 Variable_len = 2 + strlen(topic); //可变报头长度:2字节(topic长度)+ topic字符串的长度,因为qos0不传报文标识符 Payload_len = data_len; //有效负荷长度:就是data_len Remaining_len = Variable_len + Payload_len; //剩余长度=可变报头长度+负载长度 temp_buff[0] = 0x30; //固定报头第1个字节 :固定0x30 do{ //循环处理固定报头中的剩余长度字节,字节量根据剩余字节的真实长度变化 temp = Remaining_len%128; //剩余长度取余128 Remaining_len = Remaining_len/128; //剩余长度取整128 if(Remaining_len>0) temp |= 0x80; //按协议要求位7置位 temp_buff[Fixed_len] = temp; //剩余长度字节记录一个数据 Fixed_len++; //固定报头总长度+1 }while(Remaining_len>0); //如果Remaining_len>0的话,再次进入循环 temp_buff[Fixed_len+0] = strlen(topic)/256; //可变报头第1个字节 :topic长度高字节 temp_buff[Fixed_len+1] = strlen(topic)%256; //可变报头第2个字节 :topic长度低字节 memcpy(&temp_buff[Fixed_len+2], topic,strlen(topic)); //可变报头第3个字节开始 :拷贝topic字符串 memcpy(&temp_buff[Fixed_len + 2 + strlen(topic)], data, data_len);//有效负荷:拷贝data数据 TxDataBuf_Deal(temp_buff, Fixed_len + Variable_len + Payload_len);//加入发送数据缓冲区 } (1)固定报头

 程序中使用的QOS等级为QOS0,固定报头为0x30 ??

(2)可变报头

可变报头按顺序包含主题名和报文标识符。 主题名:拼接方式均为 MSB+LSB+Content,主题名不能包含通配符。 报文标识符:QOS0时没有 注:OneNet规定,“$dp“为上传数据的主题名

(3)有效载荷

 有效载荷包含将被发布的应用消息。 本例中客户端发送灯的状态、温湿度到服务端,在云平台数据流界面可看到数据不断刷新。 同时服务端可下发命令到客户端,实现对灯和温湿度传感器的控制。

五.效果展示

 

 

 

 

 

 

   

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3