找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 301|回复: 3
收起左侧

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

[复制链接]
ID:1110079 发表于 2024-9-24 20:04 | 显示全部楼层 |阅读模式
本文简要介绍了搭建 EMQX 服务器实现基于 MQTT 协议远程控制 NodeMCU ESP8266 板载 LED 的解决方案。

简介

1. MQTT
MQTT(Message Queuing Telemetry Transport)是一种基于 publish/subscribe (发布/订阅) 模式的 轻量级 通讯协议,构建于 TCP/IP 协议上,由 IBM 在1999年发布。
1MQTT.png
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 开发板,
  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[i];  // 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. }
复制代码


需要注意 MQTT 服务器地址,若是 EMQX Cloud,则根据创建远程节点填写地址;若是本地计算机或Docker容器,则填写本地物理 IP 地址。
主题为 MQTTX 客户端定义的订阅名称,客户名和密码则对应 EMQX 服务器客户端用户定义。

测试

在 MQTTX 客户端向目标主题发送控制文本 on 和 off 以控制板载 LED
esp8266_MQTT_led.png
注意发送文本格式选项更改为 Plaintext .
Arduino IDE 的串口助手监控可以观察到反馈信息
esp8266_MQTT_UART_led.png
与 MQTTX 客户端操作类似,在 HomeAssistant 的 MQTT 设置 中向目标主题发送消息,即可控制 LED 的亮灭
esp8266_HA_MQTT_LED.png
参考:ESP8266 + MQTT :如何实现 LED 灯的远程控制 | EMQ

视频
https://www.bilibili.com/video/BV1CrsYeHEsZ/



总结

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

使用道具 举报

ID:65237 发表于 2024-9-25 09:21 | 显示全部楼层
看了楼主的介绍,有没有一完整的例程,能实现手机上控制,ESP8266收到指令后,反回一条控制信息,如已起动
回复

使用道具 举报

ID:1110079 发表于 2024-9-26 05:40 | 显示全部楼层
阿飞7812 发表于 2024-9-25 09:21
看了楼主的介绍,有没有一完整的例程,能实现手机上控制,ESP8266收到指令后,反回一条控制信息,如已起动

可以实现的,只需要在loop里添加一条串口发送代码即可
回复

使用道具 举报

ID:65237 发表于 2024-9-26 09:22 | 显示全部楼层
lijinlei 发表于 2024-9-26 05:40
可以实现的,只需要在loop里添加一条串口发送代码即可

谢谢你的指点,有没有具体的例程,我现在在学,搞的的地方还不怎么懂,望指点啊
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表