stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT) |
您所在的位置:网站首页 › 厚优是什么意思 › stm32与ESP8266连接,将温湿度数据上传到OneNet(MQTT) |
前段时间弄懂了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)固定报头![]() 程序中为00 04 4D 51 54 54 04 C2 00 64 (3)有效载荷包含一个或多个以长度为前缀的字段,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。(客户端标识符为设备ID,用户名为产品ID,密码为鉴权信息)。 2.确认连接报文(CONACK)报文首字节为0x20 3.订阅报文(SUBSCRIBE) (1)固定报头![]() 仅有报文标识符,格式为 MSB+LSB。 (3)有效载荷SUBSCRIBE报文的有效载荷必须包含至少一组主题过滤器 和 QoS等级字段组合。 每一组主题过滤器 和 QoS等级的拼接组合为MSB+LSB+topic+Qos 4.订阅确认报文报文首字节为0x90 5.PINGREQ报文只有固定报头 只有固定报头 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 |