14750浏览
查看: 14750|回复: 0
打印 上一主题 下一主题

[项目] ESP8266 通过 MQTT 协议实现 LED 的远程控制

[复制链接]
本帖最后由 无垠的广袤 于 2024-9-24 20:44 编辑

ESP8266 通过 MQTT 协议实现 LED 的远程控制
本文简要介绍了搭建 EMQX 服务器实现基于 MQTT 协议远程控制 NodeMCU ESP8266 板载 LED 的解决方案。

简介

1. MQTT
MQTT(Message Queuing Telemetry Transport)是一种基于 publish/subscribe (发布/订阅) 模式的 轻量级 通讯协议,构建于 TCP/IP 协议上,由 IBM 在1999年发布。
ESP8266 通过 MQTT 协议实现 LED 的远程控制图1
MQTT 可以实现用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务 。

2. EMQX
EMQX 是一款大规模分布式物联网 MQTT 服务器,单集群支持 1 亿物联网设备连接,消息分发时延低于 1 毫秒。为高可靠、高性能的物联网实时数据移动、处理和集成提供动力。

3. Home Assistant
Home Assistant (HA) 家庭助理,是一款基于 Python 的智能家居开源系统,可以方便地连接各种外部设备,支持众多品牌的智能家居设备。

方案

安装 Home Assistant
使用 Docker 容器安装 Home Assistant ,
  • 下载 Docker 软件;
  • C 盘根目录新建文件夹 homeassistant ;
  • 下载部署文件 GitHub 并解压得到 docker-compose.yml 保存至上述 homeassistant 文件夹;
  • Windows 打开 命令提示符 或 Windows PowerShell,输入如下代码实现自动下载镜像

  1. cd C:\homeassistant
  2. docker-compose.yml
  3. docker-compose up
复制代码

  • 安装过程需大约 30 分钟,即可在 Docker 容器中创建 Home Assistant 镜像;
  • 自动从镜像安装 Home Assistant 到容器。代码文件 docker-compose.yml 将映射 Home Assistant 配置文件到 C:/homeassistant 文件夹;
  • 浏览器输入网址 http://localhost:8123/ 进入Home Assistant 主界面,创建智能家居账号。

详见:How to run Home Assistant Container on Windows using Docker - Kiril Peyanski's Blog .

安装 EMQX
使用 EMQX 最简单的方式是在 EMQX Cloud 上创建完全托管的 MQTT 服务。
这里我们使用 Docker 运行 EMQX
Windows 命令行或 PowerShell 输入并执行如下代码
  1. docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
复制代码

等待进度条下载和部署完成(大约5分钟),即可获得 EMQX 服务器。
Docker 内的 localhost 或 127.0.0.1 指向的是容器内部地址,如需访问宿主机地址请使用宿主机的真实 IP .
详见:Gitee .

配置 EMQX
(1)浏览器打开网址 http://localhost:18083/ ,初始登录账户名 admin 密码 public ;
(2)依次打开 访问控制 - 客户端认证 - 创建 - Password-Based - 内置数据库 - (默认配置)- 创建 ;
(3)用户管理 - 新建用户 - 自定义用户名和密码(建议 admin).

连接 EMQX 与 HA
(1)命令行或 PowerShell 输入 ipconfig 获取本地计算机 IPv4 地址,如 42.34.25.153
(2)配置 Home Assistant ,依次点击设置 - 设备与服务 - 添加集成 - 搜索 MQTT - 填写代理信息。
代理栏输入计算机 IP 地址,端口 1883,用户名和密码为 EMQX 中创建的用户信息。
(3)点击 提交 后显示 成功创建 MQTT ,此时 集成 选项下出现 MQTT 条目,EMQX 网页 集群 的 总连接数 和 在线连接数 由 0 变为 1,表明 MQTT 设备已连接。
参考:MQTT 接入 Home Assistant .

连接 ESP8266 与 EMQX

将如下代码下载至 ESP8266 开发板,
需要注意 MQTT 服务器地址,若是 EMQX Cloud,则根据创建远程节点填写地址;若是本地计算机或Docker容器,则填写本地物理 IP 地址。
主题为 MQTTX 客户端定义的订阅名称,客户名和密码则对应 EMQX 服务器客户端用户定义。
  1. #include <ESP8266WiFi.h>
  2. #include <PubSubClient.h>
  3. #define LED 2 // on-board LED D4
  4. // WiFi
  5. const char *ssid = "xxx"; // Enter your WiFi name
  6. const char *password = "xxxxxx";  // Enter WiFi password
  7. // MQTT Broker
  8. const char *mqtt_broker = "xx.xx.xx.xx"; // EMQX Server IP
  9. const char *topic = "emqx/esp8266"; // MQTTX topic
  10. const char *mqtt_username = "UART"; // EMQX Server User Name
  11. const char *mqtt_password = "123456"; //EMQX Server User Password
  12. const int mqtt_port = 1883;
  13. bool ledState = false;
  14. WiFiClient espClient;
  15. PubSubClient client(espClient);
  16. void setup() {
  17.     // Set software serial baud to 115200;
  18.     Serial.begin(115200);
  19.     delay(1000); // Delay for stability
  20.     // Connecting to a WiFi network
  21.     WiFi.begin(ssid, password);
  22.     while (WiFi.status() != WL_CONNECTED) {
  23.         delay(500);
  24.         Serial.println("Connecting to WiFi...");
  25.     }
  26.     Serial.println("Connected to the WiFi network");
  27.     // Setting LED pin as output
  28.     pinMode(LED, OUTPUT);
  29.     digitalWrite(LED, LOW);  // Turn off the LED initially
  30.     // Connecting to an MQTT broker
  31.     client.setServer(mqtt_broker, mqtt_port);
  32.     client.setCallback(callback);
  33.     while (!client.connected()) {
  34.         String client_id = "esp8266-client-";
  35.         client_id += String(WiFi.macAddress());
  36.         Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
  37.         if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
  38.             Serial.println("Public EMQX MQTT broker connected");
  39.         } else {
  40.             Serial.print("Failed with state ");
  41.             Serial.print(client.state());
  42.             delay(2000);
  43.         }
  44.     }
  45.     // Publish and subscribe
  46.     client.publish(topic, "hello emqx");
  47.     client.subscribe(topic);
  48. }
  49. void callback(char *topic, byte *payload, unsigned int length) {
  50.     Serial.print("Message arrived in topic: ");
  51.     Serial.println(topic);
  52.     Serial.print("Message: ");
  53.     String message;
  54.     for (int i = 0; i < length; i++) {
  55.         message += (char) payload;  // Convert *byte to string
  56.     }
  57.     Serial.print(message);
  58.     if (message == "on" && !ledState) {
  59.         digitalWrite(LED, LOW);  // Turn on the LED
  60.         ledState = true;
  61.     }
  62.     if (message == "off" && ledState) {
  63.         digitalWrite(LED, HIGH); // Turn off the LED
  64.         ledState = false;
  65.     }
  66.     Serial.println();
  67.     Serial.println("-----------------------");
  68. }
  69. void loop() {
  70.     client.loop();
  71.     delay(100); // Delay for a short period in each loop iteration
  72. }
复制代码


测试

在 MQTTX 客户端向目标主题发送控制文本 on 和 off 以控制板载 LED
ESP8266 通过 MQTT 协议实现 LED 的远程控制图2
注意发送文本格式选项更改为 Plaintext .

Arduino IDE 的串口助手监控可以观察到反馈信息
ESP8266 通过 MQTT 协议实现 LED 的远程控制图3

与 MQTTX 客户端操作类似,在 HomeAssistant 的 MQTT 设置 中向目标主题发送消息,即可控制 LED 的亮灭
ESP8266 通过 MQTT 协议实现 LED 的远程控制图4
参考:ESP8266 + MQTT :如何实现 LED 灯的远程控制 | EMQ (emqx.com)

视频





总结

完成该项目的关键在于环境搭建,即 HomeAssistantEMQX 服务器的安装,由于是在 Windows 操作系统环境下,需要将其安装于 Docker 容器中运行,而 Docker 软件通过检索实现镜像安装需要科学上网,因此环境搭建是关键。
此外,该项目可进行扩展连接智能家居平台 HomeAssistant,同样安装于 Docker 容器,只需要进行 MQTT 配置即可实现开关可视化和 APP 远程 LED 控制,参考文章,具体操作如下
修改 HA 配置文件 configuration.yaml 添加如下代码,实现 LED 开关的界面可视化

  1. # add light
  2. mqtt:
  3.   light:
  4.     # Device name
  5.     - name: "On-board LED"
  6.     # State topic
  7.       state_topic: "emqx/esp8266"
  8.     # Command topic
  9.       command_topic: "emqx/esp8266"
  10.     # Command type
  11.       payload_on: "on"
  12.       payload_off: "off"
  13.     # unique_ID
  14.       unique_id: "on-board LED"
  15.     # optimistic set
  16.       optimistic: false
复制代码


配置文件 configuration.yaml 的路径根据 HA 安装位置确定

保存配置文件后,在 开发者工具 中点击 所有 YAML 配置 实现重载配置文件,效果如下

ESP8266 通过 MQTT 协议实现 LED 的远程控制图5

点击开关按钮即可实现 NodeMCU-ESP8266 板载 LED 的亮灭控制。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail