旅游网站专业化建设的要点,口碑营销案例2022,html5素材网站,国内知名网站制作公司此篇智能家居入门与前两篇类似#xff0c;但是是使用MQTT协议接入ONENET云平台#xff0c;实现微信小程序与下位机的通信#xff0c;这里相较于使用http协议的那两篇博客#xff0c;在主程序中添加了独立看门狗防止程序卡死和服务器掉线问题。后续还有使用MQTT协议连接MQTT… 此篇智能家居入门与前两篇类似但是是使用MQTT协议接入ONENET云平台实现微信小程序与下位机的通信这里相较于使用http协议的那两篇博客在主程序中添加了独立看门狗防止程序卡死和服务器掉线问题。后续还有使用MQTT协议连接MQTT服务器的智能家居项目。 前言一、硬件模块二、连接服务器测试三、两个协议的对比分析1、代码结构上2、获取服务器数据上3、架构上 四、下位机主要代码1、接收并解析云平台下发数据2、传感器数据上云 五、微信小程序主要代码1、index.js2、index.wxml 六、源码获取 前言
这里给出前两篇使用http协议博客的网址 ①实现数据上云https://blog.csdn.net/m0_71523511/article/details/135892908 ②实现小程序控制下位机https://blog.csdn.net/m0_71523511/article/details/135907645 在第二篇的博客结尾提出了服务器经常掉线的问题使用别人编写好的心跳包也没用因为程序一直卡死在重连中所以也可以参照本篇的解决办法加上独立看门狗隔一段时间喂狗如果超过时间没喂狗说明程序多半卡死此时看门狗处理逻辑中执行初始化esp8266和连接服务器的操作。 ③独立看门狗https://www.bilibili.com/video/BV1th411z7sn/?p46spm_id_frompageDrivervd_source2a10d30b8351190ea06d85c5d0bfcb2a ④由于使用到了MQTT协议想深入了解源码的话可以看看之前的的博客对MQTT协议进行详解https://blog.csdn.net/m0_71523511/article/details/135905690
一、硬件模块
1、0.96寸OLED液晶显示屏 2、DHT11温湿度传感器 3、继电器 4、小风扇、小水泵 5、MQ-4、MQ-9 6、esp8266-01s或者esp-12f 7、JLink下载器 8、STM32F103C8T6 大部分在上面说的第一篇博客中有介绍这里介绍一下继电器、小风扇、小水泵 ①继电器 由于单片机的io口无法直接驱动小风扇和水泵这里用继电器充当开关使用继电器驱动小风扇和小水泵运动。 输入端口外接5V电源黑色跳帽可以控制继电器是高电平触发还是低电平触发。 输出端口从左往右看分别是NO1/NO2,COM1/COM2,NC1/NC2代表常开公共端常闭三种状态。 继电器的两种状态开和关当继电器触发时为打开状态NOn口就会被使能当继电器为关闭状态时NCn口就会被使能中间作为公共端连接输出。
硬件连线 继电器输出端小风扇红黑两根线子红线接入继电器的NO1/NO2口继电器的COM1/COM2拿一根公母杜邦线引出来接入5V电源小风扇的黑线接STM32的GND口。 继电器输入端 原文链接https://blog.csdn.net/qq_51868810/article/details/127792611
②小风扇、小水泵 这两个小东西就只有电源线和底线给5v输入即可转动起来
二、连接服务器测试
如果想单独先使用esp8266测试是否能正常与服务器通信的话可以参考这篇博客不会创建产品也可以看 https://blog.csdn.net/m0_71523511/article/details/135887108 需要注意的点 ①创建产品时要选择MQTT协议那个目录下进行创建 ②AT指令中的IP地址和端口号要换成183.230.40.39 6002 ③需要记住的有产品ID、鉴权信息创建产品时自己填写的、Master-APIkey、设备ID
三、两个协议的对比分析
1、代码结构上
相较于使用http协议连接onenet使用mqtt协议需要多几个源文件onenet.c、cJSON.c、MqttKit.c。 ①onenet.c是与onenet平台的数据交互接口层通过调用MqttKit.c和esp8266.c中的库函数实现与云平台的通信 ②MqttKit.c是MQTT协议库是MQTT协议最底层由onenet.c进行调用。前面两个都是大神张继瑞开源。 ③cJSON.c是一个用于处理JSON数据格式的轻量级C语言库JSONJavaScript Object Notation是一种轻量级的数据交换格式常用于在不同系统之间传输和存储数据。在对云平台下发数据进行解析时会用到onenet.c。
2、获取服务器数据上
******使用http协议和MQTT协议连接onenet最大的不同就是获取onenet云平台数据的方式 http协议直接构建HTTP请求报文并调用esp8266_send_data函数发送HTTP请求并获取返回的字符串。 mqtt协议不主动发送请求使用ESP8266_WaitRecive函数等待如果云平台有数据下发那就存起来当作变量传入OneNet_RevPro函数进行消息解析。
3、架构上 请求/响应和发布/订阅是两种不同的通信模式它们在系统架构和通信方式上有所不同。 ①请求/响应 特点 在请求/响应模式中通信的一方发送请求而另一方回复响应。通信是单向的有一个明确的请求者和一个响应者。 用途 这种模式常见于客户端和服务器之间的通信。客户端发送请求服务器处理请求并返回相应的响应。 ②发布/订阅 特点 在发布/订阅模式中消息的发布者将消息发送到一个主题topic而订阅者可以选择订阅特定主题以接收相关消息。通信是多对多的发布者和订阅者之间是松耦合的。 用途 这种模式常见于事件驱动系统、消息中间件和实时数据更新场景。发布者发布消息到主题所有订阅该主题的订阅者都会收到消息。 由以上分析很容易得出一个结论在做环境信息检测这种实时数据更新的项目上使用MQTT协议更具优势。
四、下位机主要代码
1、接收并解析云平台下发数据
主循环中使用以下代码接收并跳转 dataPtr ESP8266_GetIPD(10);if(dataPtr ! NULL){timeCount 0;OneNet_RevPro(dataPtr);}接收到数据后跳转至onenet.c的OneNet_RevPro函数中进行mqtt数据包(报文)解包和数据解析
void OneNet_RevPro(unsigned char *cmd)
{MQTT_PACKET_STRUCTURE mqttPacket {NULL, 0, 0, 0}; //协议包char *req_payload NULL;char *cmdid_topic NULL;unsigned short req_len 0;unsigned char type 0;short result 0;char *dataPtr NULL;char numBuf[10];int num 0;cJSON *json , *json_value;cJSON *json1, *json_value1;cJSON *json2, *json_value2;type MQTT_UnPacketRecv(cmd);switch(type){case MQTT_PKT_CMD: //命令下发OLED_Refresh_Line(jinru111);result MQTT_UnPacketCmd(cmd, cmdid_topic, req_payload, req_len); //解出topic和消息体if(result 0){//打印收到的信息printf( cmdid: %s, req: %s, req_len: %d\r\n, cmdid_topic, req_payload, req_len);// 对数据包req_payload进行JSON格式解析json cJSON_Parse(req_payload);if (!json)//如果json内容为空则打印错误信息printf(Error before: [%s]\n,cJSON_GetErrorPtr());else{json_value cJSON_GetObjectItem(json , LED0);//提取对应属性的数值if((json_value-valueint)1){GPIO_SetBits(GPIOB,GPIO_Pin_12); }else if((json_value-valueint)0) GPIO_ResetBits(GPIOB,GPIO_Pin_12); }//开关风扇json1 cJSON_Parse(req_payload);if (!json1)printf(Error before: [%s]\n,cJSON_GetErrorPtr());else{json_value1 cJSON_GetObjectItem(json1 , feng);if((json_value1-valueint)1)GPIO_SetBits(GPIOB,GPIO_Pin_5); else if((json_value1-valueint)0)GPIO_ResetBits(GPIOB,GPIO_Pin_5); }//开关水泵json2 cJSON_Parse(req_payload);if (!json2)printf(Error before: [%s]\n,cJSON_GetErrorPtr());else{json_value2 cJSON_GetObjectItem(json2 , shui);if((json_value2-valueint)1){GPIO_SetBits(GPIOB,GPIO_Pin_6); }else if((json_value2-valueint)0)GPIO_ResetBits(GPIOB,GPIO_Pin_6); }if(MQTT_PacketCmdResp(cmdid_topic, req_payload, mqttPacket) 0) //命令回复组包{printf( Tips: Send CmdResp\r\n);ESP8266_SendData(mqttPacket._data, mqttPacket._len); //回复命令MQTT_DeleteBuffer(mqttPacket); //删包}cJSON_Delete(json);//释放位于堆中cJSON结构体内存cJSON_Delete(json1);}break;case MQTT_PKT_PUBACK: //发送Publish消息平台回复的Ackif(MQTT_UnPacketPublishAck(cmd) 0)//printf( Tips: MQTT Publish Send OK\r\n);break;default:result -1;break;}ESP8266_Clear(); //清空缓存if(result -1)return;dataPtr strchr(req_payload, :); //搜索}if(dataPtr ! NULL result ! -1) //如果找到了{dataPtr;while(*dataPtr 0 *dataPtr 9) //判断是否是下发的命令控制数据{numBuf[num] *dataPtr;}numBuf[num] 0;num atoi((const char *)numBuf); //转为数值形式}if(type MQTT_PKT_CMD || type MQTT_PKT_PUBLISH){MQTT_FreeBuffer(cmdid_topic);MQTT_FreeBuffer(req_payload);}
}2、传感器数据上云
主函数中读取传感器数值每隔一段时间上传 else if(timeCount 100) //发送间隔{DHT11_Read_Data(tempValue,humidity);gas AD_GetValue(ADC_Channel_2);ranqi AD_GetValue(ADC_Channel_3);delay_ms(10);OneNet_SendData();//发送数据给onenetESP8266_Clear(); timeCount 0;}调用OneNet_SendData发送数据在OneNet_SendData函数中又调用OneNet_FillBuf函数将要发送的数据拼接起来。
unsigned char OneNet_FillBuf(char *buf)
{char text[32];//LED0_FLAGGPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);//读取LED的开关状态即对应引脚的//LED1_FLAGGPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);memset(text, 0, sizeof(text));strcpy(buf, ,;);memset(text, 0, sizeof(text));sprintf(text, Tempreture,%d;,tempValue);strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, Humidity,%d;, humidity);strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, tianranqi,%d;, gas);strcat(buf, text);memset(text, 0, sizeof(text));sprintf(text, keranqiti,%d;, ranqi);strcat(buf, text);printf(buf_mqtt%s\r\n,buf);return strlen(buf);}//
// 函数名称 OneNet_SendData
//
// 函数功能 上传数据到平台
//
// 入口参数 type发送数据的格式
//
// 返回参数 无
//
// 说明
//
void OneNet_SendData(void)
{MQTT_PACKET_STRUCTURE mqttPacket {NULL, 0, 0, 0}; //协议包char buf[128];short body_len 0, i 0;//printf( Tips: OneNet_SendData-MQTT\r\n);memset(buf, 0, sizeof(buf));//清空数组内容body_len OneNet_FillBuf(buf); //获取当前需要发送的数据流的总长度if(body_len){if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, mqttPacket) 0) 数据点上传组包将数据封装成mqtt协议所要求的数据包格式{{for(; i body_len; i)mqttPacket._data[mqttPacket._len] buf[i];ESP8266_SendData(mqttPacket._data, mqttPacket._len); //上传数据到平台printf( Send %d Bytes\r\n, mqttPacket._len);MQTT_DeleteBuffer(mqttPacket); //删包}else{printf( WARN: EDP_NewBuffer Failed\r\n);}}}五、微信小程序主要代码 图中圈起来的地方需要根据自己的数据进行填写在下面的调试信息栏可以看到有数据上传查看数据流即可
1、index.js
主要是增加了控制风扇和水泵的代码
feng_kai:function(){//按钮发送命令控制硬件wx.request({url:https://api.heclouds.com/cmds?device_id1108129261,header: {content-type: application/json,api-key:nV4Cso3uQMZR2EGQQiY49MRCfx8},method: POST,data:{feng:1},success(res){console.log(成功,res.data)},fail(res){console.log(失败,res)}})
},feng_guan:function(){//按钮发送命令控制硬件wx.request({url:https://api.heclouds.com/cmds?device_id1108129261,header: {content-type: application/json,api-key:nV4Cso3uQMZR2EGQQiY49MRCfx8},method: POST,data:{feng:0},success(res){console.log(成功,res.data)},fail(res){console.log(失败,res)}})
},shui_kai:function(){//按钮发送命令控制硬件wx.request({url:https://api.heclouds.com/cmds?device_id1108129261,header: {content-type: application/json,api-key:nV4Cso3uQMZR2EGQQiY49MRCfx8},method: POST,data:{shui:1},success(res){console.log(成功,res.data)},fail(res){console.log(失败,res)}})
},shui_guan:function(){//按钮发送命令控制硬件wx.request({url:https://api.heclouds.com/cmds?device_id1108129261,header: {content-type: application/json,api-key:nV4Cso3uQMZR2EGQQiY49MRCfx8},method: POST,data:{shui:0},success(res){console.log(成功,res.data)},fail(res){console.log(失败,res)}})
},需要注意的是这里的url需要更换成‘https://api.heclouds.com/cmds?device_id11081xxxxxx’并且文件开头的apikey和设备号也要换成自己的。
2、index.wxml
最后加上
button typeprimary stylemargin-top: 20px; bindtapfeng_kai开风扇/button
button typewarn bindtapfeng_guan关风扇/buttonbutton typeprimary stylemargin-top: 20px; bindtapshui_kai开水泵/button
button typewarn bindtapshui_guan关水泵/button六、源码获取
我用夸克网盘分享了「智能家居MQTTONENET.rar」点击链接即可保存。打开「夸克APP」无需下载在线播放视频畅享原画5倍速支持电视投屏。 链接https://pan.quark.cn/s/db251fd599bd 提取码9sR9