ESP8266 通過 MQTT 協(xié)議實現(xiàn) LED 的遠程控制
本文簡要介紹了搭建 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)自動下載鏡像
cd C:homeassistant
docker-compose.yml
docker-compose up
- 安裝過程需大約 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í)行如下代碼
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 服務(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ā)板,
需要注意 MQTT 服務(wù)器地址,若是 EMQX Cloud,則根據(jù)創(chuàng)建遠程節(jié)點填寫地址;若是本地計算機或Docker容器,則填寫本地物理 IP 地址。
主題為 MQTTX 客戶端定義的訂閱名稱,客戶名和密碼則對應(yīng) EMQX 服務(wù)器客戶端用戶定義。
#include < ESP8266WiFi.h >
#include < PubSubClient.h >
?
#define LED 2 // on-board LED D4
?
// WiFi
const char *ssid = "xxx"; // Enter your WiFi name
const char *password = "xxxxxx"; // Enter WiFi password
?
// MQTT Broker
const char *mqtt_broker = "xx.xx.xx.xx"; // EMQX Server IP
const char *topic = "emqx/esp8266"; // MQTTX topic
const char *mqtt_username = "UART"; // EMQX Server User Name
const char *mqtt_password = "123456"; //EMQX Server User Password
const int mqtt_port = 1883;
?
bool ledState = false;
?
WiFiClient espClient;
PubSubClient client(espClient);
?
void setup() {
// Set software serial baud to 115200;
Serial.begin(115200);
delay(1000); // Delay for stability
?
// Connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to the WiFi network");
?
// Setting LED pin as output
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); // Turn off the LED initially
?
// Connecting to an MQTT broker
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "esp8266-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT brokern", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
?
// Publish and subscribe
client.publish(topic, "hello emqx");
client.subscribe(topic);
}
?
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
String message;
for (int i = 0; i < length; i++) {
message += (char) payload[i]; // Convert *byte to string
}
Serial.print(message);
if (message == "on" && !ledState) {
digitalWrite(LED, LOW); // Turn on the LED
ledState = true;
}
if (message == "off" && ledState) {
digitalWrite(LED, HIGH); // Turn off the LED
ledState = false;
}
Serial.println();
Serial.println("-----------------------");
}
?
void loop() {
client.loop();
delay(100); // Delay for a short period in each loop iteration
}
測試
在 MQTTX 客戶端向目標主題發(fā)送控制文本 on
和 off
以控制板載 LED
**注意發(fā)送文本格式選項更改為 **
Plaintext
.
Arduino IDE 的串口助手監(jiān)控可以觀察到反饋信息
**與 MQTTX 客戶端操作類似,在 HomeAssistant 的 **MQTT 設(shè)置
中向目標主題發(fā)送消息,即可控制 LED 的亮滅
參考: [ESP8266 + MQTT :如何實現(xiàn) LED 燈的遠程控制 | EMQ (emqx.com)]
視頻展示
?
?
總結(jié)
**完成該項目的關(guān)鍵在于環(huán)境搭建,即 **HomeAssistant 和 EMQX 服務(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 控制,參考[文章],具體操作如下
**修改 HA 配置文件 **configuration.yaml
添加如下代碼,實現(xiàn) LED 開關(guān)的界面可視化
# add light
mqtt:
light:
# Device name
- name: "On-board LED"
# State topic
state_topic: "emqx/esp8266"
# Command topic
command_topic: "emqx/esp8266"
# Command type
payload_on: "on"
payload_off: "off"
# unique_ID
unique_id: "on-board LED"
# optimistic set
optimistic: false
配置文件
configuration.yaml
的路徑根據(jù) HA 安裝位置確定
保存配置文件后,在 開發(fā)者工具
中點擊 所有 YAML 配置
實現(xiàn)重載配置文件,效果如下
點擊開關(guān)按鈕即可實現(xiàn) NodeMCU-ESP8266 板載 LED 的亮滅控制。
審核編輯 黃宇
-
led
+關(guān)注
關(guān)注
242文章
23385瀏覽量
663549 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2914文章
44973瀏覽量
377441 -
遠程控制
+關(guān)注
關(guān)注
4文章
638瀏覽量
35020 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187954 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
45367 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
98瀏覽量
5495
發(fā)布評論請先 登錄
相關(guān)推薦
遠程控制通訊--基于Arduino + ESP8266控制LED燈
![<b class='flag-5'>遠程控制</b>通訊--基于Arduino + <b class='flag-5'>ESP8266</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b>燈](https://file.elecfans.com/web1/M00/45/F4/o4YBAFp9TbiADzvMAAEMZQhBIYg399.png)
![](https://file1.elecfans.com/web2/M00/08/DA/wKgaombzxA2ALfJdAAIp_yznRnY058.jpg)
ESP8266模塊想實現(xiàn)手機遠程控制
如何實現(xiàn)esp8266開發(fā)用按鈕遠程控制?
如何使用EDP協(xié)議通過ESP8266 WIFI模塊接入OneNET服務(wù)器來實現(xiàn)遠程控制LED燈?
請問esp8266如何通過mqtt協(xié)議建立連接實現(xiàn)小車的遠程控制?
ESP8266遠程控制開關(guān)的方法分享
ESP8266通過MQTT訂閱主題并推送數(shù)據(jù)到ONENET
![<b class='flag-5'>ESP8266</b><b class='flag-5'>通過</b><b class='flag-5'>MQTT</b>訂閱主題并推送數(shù)據(jù)到ONENET](https://file.elecfans.com/web2/M00/49/72/poYBAGKhwLWAfCCwAAB72xpzXYw452.png)
實現(xiàn)微信小程序和手機app遠程控制51單片機控制L298N電機驅(qū)動器控制馬達(ESP8266 AT89S52 http請求轉(zhuǎn)串口通信系統(tǒng)
![<b class='flag-5'>實現(xiàn)</b>微信小程序和手機app<b class='flag-5'>遠程控制</b>51單片機<b class='flag-5'>控制</b>L298N電機驅(qū)動器<b class='flag-5'>控制</b>馬達(<b class='flag-5'>ESP8266</b> AT89S52 http請求轉(zhuǎn)串口通信系統(tǒng)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
HC05-ESP8266實現(xiàn)控制LED的閃爍
![HC05-<b class='flag-5'>ESP8266</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b>的閃爍](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ESP8266通過MQTT協(xié)議連接ONENET
![<b class='flag-5'>ESP8266</b><b class='flag-5'>通過</b><b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>連接ONENET](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32 + ESP8266 + MQTT協(xié)議連接OneNet
![STM32 + <b class='flag-5'>ESP8266</b> + <b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>連接OneNet](https://file.elecfans.com//web2/M00/32/FE/pYYBAGIcXCmAT6GHAAHYyEtmbRo077.png)
ESP8266接入小愛同學(xué)—智能LED臺燈或風(fēng)扇(利用繼電器)
![<b class='flag-5'>ESP8266</b>接入小愛同學(xué)—智能<b class='flag-5'>LED</b>臺燈或風(fēng)扇(利用繼電器)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論