赞
踩
我们的ESP32开发板已经可以通过Wi-Fi正常连接网络,我们需要将板卡采集的数据上报到服务器,并将数据存入数据库,服务器可以下发指令到板卡执行某些动作,这样就实现了一个简单的IoT平台。
物联网一般使用的是MQTT通讯协议,MQTT主要是订阅者和发布者之间的消息传递。
因此我们这里需要搭建一个MQTT服务器,这里选用的是EMQX开源免费版本进行搭建。
EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒级的低时延。
EMQX产品优势
准备软件安装包:
EMQX官方文档提供了详细的说明,我们的云端服务器使用的是Ubuntu 22.04 64位系统,参考对应的文档选择某种安装方式即可,这里采用的是通过 Apt 源安装
EMQX官网: https://www.emqx.io/
1.通过以下命令配置 EMQX Apt 源:
curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
2.运行以下命令安装 EMQX:
sudo apt-get install emqx
3.运行以下命令启动 EMQX:
sudo systemctl start emqx
远程登录云端服务器,依次执行上面的三个命令,执行完成后EMQX服务就已经启动了。
浏览器中输入访问地址: http://IP:18083/,即可打开登录界面
注意事项
Ubuntu系统防火墙默认不开启18083端口,需要在设置防火墙开放18083端口,否则无法打开EMQX的管理界面Dashboard
初次登录账户和密码为admin/public,初次登录系统会要求修改密码
成功登录后可看到EMQX的管理平台Dashboard
客户端工具是作为验证工具,用于快速测试MQTT消息服务和应用程序开发。
MQTTX官网:https://mqttx.app/zh
安装过程,到官网下载并运行安装程序
下一步,选择安装路径
点击安装,直至安装完成即可
运行主界面
默认为英文操作界面,设置为中文,点击左侧配置按钮,在Language栏选择简体中文即可
1.启动 MQTTX 客户端。点击新建连接创建一个 MQTT 连接。
2.配置新建的 MQTT 连接作为消息发送客户端。
注意事项
1.MQTTX访问的是MQTT服务器1883端口,注意需要在服务器防火墙放行这个端口
2.连接所用到的用户名和密码需要在EMQX管理平台的客户端 认证中进行创建
我们已经创建了一个客户端连接并成功连接上了MQTT服务器,然后订阅一个主题hantu_iot/testtopic并向它发送一条消息。
打开MQTTX工具,点击添加订阅
进入添加订阅窗口,在Topic文本框中输入hantu_iot/testtopic
点击确定
按钮,即可看到已经添加了这个订阅
我们在MQTTX的右角下的Topic处输入hantu_iot/testtopic,并在内容框中输入一段json格式字符串,点击绿色提交按钮。
可以看到MQTTX客户端向服务器提交了一条了消息,由于MQTTX客户端自已也订阅了这个主题,所以它也会收到服务器分发过来的这条消息,这就实现了一次简单的发送、接收消息。
MQTT服务器搭建完成以后,我们就可以将开发板采集到的数据通过MQTT协议发送到MQTT服务器,并将其存储到服务器数据库当中(数据持久化),由于EMQX免费版不提供数据持久化的功能,为了解决这个问题,我们会需要用到另外一个重要的工具Node-Red
ESP32最小开发板通过WiFi连接到网后,通过MQTT协议收发消息,我们需要用到第三方库PubSubClient库
引入方法,我们打开Arduino IDE,进入项目
->导入库
–>管理库
在左侧库管理
界面搜索栏中输入我们想要查找的库名称,我们这里输入"PubSubClient",回车进行搜索
点击安装
直接进行安装即可,这里选择的版本是2.8.0
接下来我们就可以开始编写代码了,输入以下代码
#include <Arduino.h> #include <WiFi.h> #include <PubSubClient.h> /*=========================== 全局变量及宏定义 =============================*/ // WiFi const char *ssid = "此处为WIFI网络名称"; const char *password = "此处为WIFI密码"; // MQTT Broker const char *mqtt_broker = "MQTT服务器IP"; // 服务器地址 const char *clientid = "Hantu-1234"; // 自定义clientid const char *topic = "hantu_iot/testtopic"; // 定义 Topic const char *mqtt_username = "用户名"; // 用户名 const char *mqtt_password = "密码"; // 密码 const int mqtt_port = 1883; // 端口 //定义客户端 WiFiClient espClient; PubSubClient client(espClient); void setup() { // 初始化波特率 Serial.begin(9600); // 连接WiFi网络 WiFi.begin(ssid, password); Serial.print("正在连接WIFI"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("."); } Serial.println("连接成功"); Serial.print("IP Address"); Serial.println(WiFi.localIP()); // 连接到MQTT服务器 client.setServer(mqtt_broker, mqtt_port); // 设置mqtt保持活跃时间 ms client.setKeepAlive(60); // 设置回调函数 client.setCallback(callback); while (!client.connected()) { Serial.printf("The client %s connects to the public mqtt broker\n", clientid); if (client.connect(clientid, mqtt_username, mqtt_password)) { Serial.println("ESP32开发板连接MQTT服务器成功"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } // 定阅主题 client.subscribe(topic, 0); // 发布消息 client.publish(topic, "Hi EMQX, I'm ESP32 ^^"); } void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); } void loop() { client.loop(); }
输入完成后,初次编译需要指定程序的存放目录,工程名称命名为MQTT_SendToServer,然后执行上传命令即可进行代码的编译并上传至开发板,点击上传
按钮开始上传
注意事项
每次上传程序的时候需要注意选择正确的开发板和端口
看到这样的执行结果就说明程序已经正常上传到开发板,我们打开串口监视器
可以看到程序已经正常运行。
注意事项
由串口监视器输出的结果可以看到,板卡向MQTT服务器发送消息以后,板卡也收到了这条消息,因为在发布消息以前,板卡本身也订阅了这个主题,所以服务器会把消息推送过来,同时MQTTX工具也会收到这条消息。
本示例学习如何远程能过网络来控制LED的开和关,我们已经实现了与MQTT服务器的消息通信,接下来我们来实现远程控制板载LED灯的开和关。
打开Arduino IDE,输入程序,命名工程名称为MQTT_Led_OnOff
#include <Arduino.h> #include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> /*=========================== 全局变量及宏定义 =============================*/ // WiFi const char *ssid = "此处为WIFI网络名称"; const char *password = "此处为WIFI密码"; // MQTT Broker const char *mqtt_broker = "MQTT服务器IP"; // 服务器地址 const char *clientid = "Hantu-1234"; // 自定义clientid const char *topic = "hantu_iot/testtopic"; // 定义 Topic const char *mqtt_username = "用户名"; // 用户名 const char *mqtt_password = "密码"; // 密码 const int mqtt_port = 1883; // 端口 //定义客户端 WiFiClient espClient; PubSubClient client(espClient); /*=========================== 自定义全局变量&宏定义 =============================*/ int redPin = 25; void setup() { // 初始化波特率 Serial.begin(9600); // 设置LED灯为输出模式 pinMode(redPin, OUTPUT); // 连接WiFi网络 WiFi.begin(ssid, password); Serial.print("正在连接WIFI"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("."); } Serial.println("连接成功"); Serial.print("IP Address"); Serial.println(WiFi.localIP()); // 连接到MQTT服务器 client.setServer(mqtt_broker, mqtt_port); // 设置mqtt保持活跃时间 ms client.setKeepAlive(60); // 设置回调函数 client.setCallback(callback); while (!client.connected()) { Serial.printf("The client %s connects to the public mqtt broker\n", clientid); if (client.connect(clientid, mqtt_username, mqtt_password)) { Serial.println("ESP32开发板连接MQTT服务器成功"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } // 定阅主题 client.subscribe(topic, 0); // 发布消息 client.publish(topic, "Hi EMQX, I'm ESP32 ^^"); } void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Message arrived in topic: "); Serial.println(topic); Serial.print("Message:"); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); Serial.println("-----------------------"); //解析payload获取LED灯的开和关的值 JsonDocument doc; deserializeJson(doc, payload); int led_logic = doc["led"]; if (led_logic == 1) { digitalWrite(redPin, LOW); Serial.println("LED灯已打开"); } if (led_logic == 0) { digitalWrite(redPin, HIGH); Serial.println("LED灯已关闭"); } delay(50); } void loop() { client.loop(); }
然后编译并上传程序到板卡
我们打开MQTTX客户端,连接到服务器,然后向开发板订阅的主题"hantu_iot/testtopic"发送消息,服务器在接收到MQTTX的消息后以后在将消息推送给订阅者(开发板),从而就可以实现远程的控制
我们定义了一个简单的json字符串,只发送0或者1来进行开关
注意事项
发送数值1为开灯、数值0为关灯
点击发送即可看到灯的开关状态
注意事项
由于MQTTX工具也订阅了"hantu_iot/testtopic"这个主题,所以它发送出去的消息服务器也会给它推送过来
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。