找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1531|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

ESP8266通過MQTT協(xié)議實現(xiàn)LED的遠程控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1110079 發(fā)表于 2024-9-24 20:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本文簡要介紹了搭建 EMQX 服務(wù)器實現(xiàn)基于 MQTT 協(xié)議遠程控制 NodeMCU ESP8266 板載 LED 的解決方案。

簡介

1. MQTT
MQTT(Message Queuing Telemetry Transport)是一種基于 publish/subscribe (發(fā)布/訂閱) 模式的 輕量級 通訊協(xié)議,構(gòu)建于 TCP/IP 協(xié)議上,由 IBM 在1999年發(fā)布。

MQTT 可以實現(xiàn)用極少的代碼和有限的帶寬,為連接遠程設(shè)備提供實時可靠的消息服務(wù) 。

2. EMQX
EMQX 是一款大規(guī)模分布式物聯(lián)網(wǎng) MQTT 服務(wù)器,單集群支持 1 億物聯(lián)網(wǎng)設(shè)備連接,消息分發(fā)時延低于 1 毫秒。為高可靠、高性能的物聯(lián)網(wǎng)實時數(shù)據(jù)移動、處理和集成提供動力。

3. Home Assistant
Home Assistant (HA) 家庭助理,是一款基于 Python 的智能家居開源系統(tǒng),可以方便地連接各種外部設(shè)備,支持眾多品牌的智能家居設(shè)備。

方案
安裝 Home Assistant

使用 Docker 容器安裝 Home Assistant ,
  • 下載 Docker 軟件;
  • C 盤根目錄新建文件夾 homeassistant ;
  • 下載部署文件 GitHub 并解壓得到 docker-compose.yml 保存至上述 homeassistant 文件夾;
  • Windows 打開 命令提示符 或 Windows PowerShell,輸入如下代碼實現(xiàn)自動下載鏡像
    1. cd C:\homeassistant
    2. docker-compose.yml
    3. docker-compose up
    復(fù)制代碼

  • 安裝過程需大約 30 分鐘,即可在 Docker 容器中創(chuàng)建 Home Assistant 鏡像;
  • 自動從鏡像安裝 Home Assistant 到容器。代碼文件 docker-compose.yml 將映射 Home Assistant 配置文件到 C:/homeassistant 文件夾;
  • 瀏覽器輸入網(wǎng)址 http://localhost:8123/ 進入Home Assistant 主界面,創(chuàng)建智能家居賬號。

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

安裝 EMQX
使用 EMQX 最簡單的方式是在 EMQX Cloud 上創(chuàng)建完全托管的 MQTT 服務(wù)。
這里我們使用 Docker 運行 EMQX
Windows 命令行或 PowerShell 輸入并執(zhí)行如下代碼
  1. docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
復(fù)制代碼


等待進度條下載和部署完成(大約5分鐘),即可獲得 EMQX 服務(wù)器。
Docker 內(nèi)的 localhost 或 127.0.0.1 指向的是容器內(nèi)部地址,如需訪問宿主機地址請使用宿主機的真實 IP .
詳見:Gitee .

配置 EMQX
(1)瀏覽器打開網(wǎng)址 http://localhost:18083/ ,初始登錄賬戶名 admin 密碼 public ;
(2)依次打開 訪問控制 - 客戶端認證 - 創(chuàng)建 - Password-Based - 內(nèi)置數(shù)據(jù)庫 - (默認配置)- 創(chuàng)建 ;
(3)用戶管理 - 新建用戶 - 自定義用戶名和密碼(建議 admin).

連接 EMQX 與 HA
(1)命令行或 PowerShell 輸入 ipconfig 獲取本地計算機 IPv4 地址,如 42.34.25.153
(2)配置 Home Assistant ,依次點擊設(shè)置 - 設(shè)備與服務(wù) - 添加集成 - 搜索 MQTT - 填寫代理信息。
代理欄輸入計算機 IP 地址,端口 1883,用戶名和密碼為 EMQX 中創(chuàng)建的用戶信息。
(3)點擊 提交 后顯示 成功創(chuàng)建 MQTT ,此時 集成 選項下出現(xiàn) MQTT 條目,EMQX 網(wǎng)頁 集群 的 總連接數(shù) 和 在線連接數(shù) 由 0 變?yōu)?1,表明 MQTT 設(shè)備已連接。

參考:MQTT 接入 Home Assistant .

連接 ESP8266 與 EMQX
將如下代碼下載至 ESP8266 開發(fā)板,
  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. }
復(fù)制代碼


需要注意 MQTT 服務(wù)器地址,若是 EMQX Cloud,則根據(jù)創(chuàng)建遠程節(jié)點填寫地址;若是本地計算機或Docker容器,則填寫本地物理 IP 地址。
主題為 MQTTX 客戶端定義的訂閱名稱,客戶名和密碼則對應(yīng) EMQX 服務(wù)器客戶端用戶定義。

測試

在 MQTTX 客戶端向目標(biāo)主題發(fā)送控制文本 on 和 off 以控制板載 LED

注意發(fā)送文本格式選項更改為 Plaintext .
Arduino IDE 的串口助手監(jiān)控可以觀察到反饋信息

與 MQTTX 客戶端操作類似,在 HomeAssistant 的 MQTT 設(shè)置 中向目標(biāo)主題發(fā)送消息,即可控制 LED 的亮滅

參考:ESP8266 + MQTT :如何實現(xiàn) LED 燈的遠程控制 | EMQ

視頻
https://www.bilibili.com/video/BV1CrsYeHEsZ/



總結(jié)

完成該項目的關(guān)鍵在于環(huán)境搭建,即 HomeAssistantEMQX 服務(wù)器的安裝,由于是在 Windows 操作系統(tǒng)環(huán)境下,需要將其安裝于 Docker 容器中運行,而 Docker 軟件通過檢索實現(xiàn)鏡像安裝需要科學(xué)上網(wǎng),因此環(huán)境搭建是關(guān)鍵。
此外,該項目可進行擴展連接智能家居平臺 HomeAssistant,同樣安裝于 Docker 容器,只需要進行 MQTT 配置即可實現(xiàn)開關(guān)可視化和 APP 遠程 LED 控制。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:65237 發(fā)表于 2024-9-25 09:21 | 只看該作者
看了樓主的介紹,有沒有一完整的例程,能實現(xiàn)手機上控制,ESP8266收到指令后,反回一條控制信息,如已起動
回復(fù)

使用道具 舉報

板凳
ID:1110079 發(fā)表于 2024-9-26 05:40 | 只看該作者
阿飛7812 發(fā)表于 2024-9-25 09:21
看了樓主的介紹,有沒有一完整的例程,能實現(xiàn)手機上控制,ESP8266收到指令后,反回一條控制信息,如已起動

可以實現(xiàn)的,只需要在loop里添加一條串口發(fā)送代碼即可
回復(fù)

使用道具 舉報

地板
ID:65237 發(fā)表于 2024-9-26 09:22 | 只看該作者
lijinlei 發(fā)表于 2024-9-26 05:40
可以實現(xiàn)的,只需要在loop里添加一條串口發(fā)送代碼即可

謝謝你的指點,有沒有具體的例程,我現(xiàn)在在學(xué),搞的的地方還不怎么懂,望指點啊
回復(fù)

使用道具 舉報

5#
ID:580781 發(fā)表于 2025-4-7 20:07 | 只看該作者
好文章,正在學(xué)習(xí)中,感謝樓主分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表