ESP32 WIFI MESH学习笔记
文章目录
前言一、服务器部分二、ESP32部分1.引入例子2.修改用户名称及密码3.初始化IOT登陆信息4.初始化5.侦听函数6.主函数7.子节点程序三、程序验证前言
前文(笔记6)已完成带websever根节点的MESH网搭建,并实现了通过访问web节点控制子节点设备。但使用物联网的形式,会更容易地实现设备的远程监控本文将记录通过WIFI把Mesh网接入MQTT服务器,实现向MQTT服务器收发信息的功能。
一、服务器部分
为方便学习,本次使用简单的DFOBOT的MQTT服务器,地址为: 。第一次使用需进行注册,这里不再介绍。
注册完成后,记下用IOT用户名iot_id(user )和密码Iot_pwd(password)。注意不是登陆iot.dfrobot的用户名和密码 ,如下图:
然后新建一个设备,如下:
记下topic名称,服务器的设置就完在了。
二、ESP32部分
1.引入例子
加载例子 mqttbrtdge,如下图:
2.修改用户名称及密码
修改下图中MESH网名称、密码,以及可接入公网的WIFI名称及密码。
需注意的是,如接家用WIFI不能接5G,只能接4.2G。我还是用手机热点进行连接。方便查看是否已接入。
然后,我们需要生成以下对象
painlessMesh mesh;WiFiClient wifiClient;PubSubClient mqttClient(mqtt_Broker, 1883, mqttCallback, wifiClient);
3.初始化IOT登陆信息
在程序前段,声名登陆信息(指针变量),如下:
我还增加两个变量,分别记录访问IOT时,需要提供访问设备的名称, 以及是否已连接到IOT服务器
4.初始化
初始化部分与websever部分相同,不再累述。传送门
5.侦听函数
当侦听到话题内容时,把内容从串口打印出来,并向全网广播:
代码如下
void mqttCallback(char* topic, uint8_t* payload, unsigned int length) {char* cleanPayload = (char*)malloc(length+1);memcpy(cleanPayload, payload, length);cleanPayload[length] = '\0';String msg = String(cleanPayload);Serial.printf(" Received msg=%s\n", msg.c_str()); free(cleanPayload);String targetStr = String(topic);Serial.printf(" Received rargetStr=%s\n", targetStr);mesh.sendBroadcast(msg);}
6.主函数
主函数比较简单,
mesh.update();mqttClient.loop();
由于发现wifi不时会掉线,增加了以下代码,用于掉线后重新接入mqtt服务器。
if (!mqttClient.connected()){Mqtt_connected =0;} if (mqttClient.connect(client_id.c_str(), MQTT_UserID, MQTT_UserPW)&&Mqtt_connected == 0) {Mqtt_connected = 1;Serial.println("Public emqx mqtt broker connected");mqttClient.publish(Topic, "Hi EMQ X I'm ESP32 ^^");mqttClient.subscribe(Topic);}else {delay(1000);}
至此,MESH网的根节点程序已完成。
7.子节点程序
子节点程序与笔记6一致。不累述传送门入口
三、程序验证
打开手机WIFI ,分别给三块ESP32加电。其中根节点用电脑USB口加电。
打开IDE的串口监视器,稍等一段时间后,会有 “Public emqx mqtt broker connected” 字样。此时,说明我们的MESH网已接入MQTT服务器。
我们打开MQTT服务器对应话题板,会发现写入了“Hi EMQ X I’m ESP32 ^^”字样,说明已经把信息写入了MQTT的话题 板,如下图
我们再向这个话题板发送Led_1_on,以及Led_1_off 的信息,如下图
回到我们的串口发监视器,会有以下内容:
如果我们按笔记6的程序编写子节点的程序,我们会发现节点1的红灯会亮起来。
此时再发送Led_1_off,节点设备上的红灯会熄灭。说明我们可以通过MQTT的话题板控制节点设备了。
以上就是今天的笔记,谢谢观看!