
文章圖片

文章圖片

文章圖片

本文主要介紹如何使用Docker搭建EMQX MQTT服務(wù)器 , 并將其接入到Home Assistant中 , 最后演示如何使用.NET接入MQTT 。1. 背景在智能家居系統(tǒng)中 , MQTT(消息隊列遙測傳輸協(xié)議)是一種輕量級的消息傳輸協(xié)議 , 特別適用于物聯(lián)網(wǎng)(IoT)設(shè)備之間的通信 。 EMQX 是一個高性能的、開源的 MQTT 消息服務(wù)器 , 支持 MQTT 3.1、3.1.1 和 5.0 協(xié)議 , 并可以方便的創(chuàng)建集群 , 實現(xiàn)高可用性 。 Home Assistant 是一個開源的家庭自動化平臺 , 支持 MQTT 集成 , 可以通過 MQTT 與其他設(shè)備進(jìn)行通信 。
本文將介紹如何使用 Docker 搭建 EMQX MQTT 服務(wù)器 , 并將其接入到 Home Assistant 中 , 最后演示如何使用 .NET 接入 MQTT 。
2. 搭建 EMQX MQTT 服務(wù)器2.1 安裝 EMQX使用 Docker 安裝 EMQX 是最簡單的方法之一 。 首先確保你的系統(tǒng)上已經(jīng)安裝了 Docker 。 你可以通過下面的命令來安裝 EMQX:
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest當(dāng)然 , 你可以可以通過 docker-compose 來管理 EMQX 服務(wù):services: emqx: image: emqx/emqx:5.8 container_name: emqx restart: always ports: - \"1883:1883\" - \"8083:8083\" - \"8084:8084\" - \"8883:8883\" - \"18083:18083\" environment: EMQX_NAME: iot_emqx EMQX_HOST: 127.0.0.1 EMQX_TELEMETRY__ENABLE: false volumes: - /volume1/docker/mqtt/data:/opt/emqx/data:rw - /volume1/docker/mqtt/log:/opt/emqx/log:rw user: \"${UID:${GID\" networks: - default
networks: default: driver: bridge這里我們將 EMQX 的數(shù)據(jù)和日志目錄映射到宿主機(jī)的 /volume1/docker/mqtt/data 和 /volume1/docker/mqtt/log 目錄中 , 以便數(shù)據(jù)持久化 。 并且禁用了 EMQX 的遙測功能 , 對默認(rèn)的節(jié)點名稱進(jìn)行了修改 。2.2 端口說明【搭建EMQX MQTT服務(wù)器并接入Home Assistant和.NET程序】?1883: MQTT 協(xié)議端口?8883: MQTT over SSL 端口?8083: MQTT over WebSocket 端口?8084: MQTT over WebSocket with SSL 端口?18083: 管理界面端口
以上是 EMQX 默認(rèn)的監(jiān)聽器配置 , 上一節(jié)我們使用了默認(rèn)的端口映射 , 你也可以根據(jù)需要修改端口配置 。
2.3 配置 EMQXEMQX 安裝完成后 , 你可以通過訪問
http://localhost:18083 來打開 EMQX 的管理界面 , 默認(rèn)用戶名是 admin , 密碼是 public 。 你可以在這里查看和修改 EMQX 的配置信息 。 首次登錄時 , 會要求修改默認(rèn)密碼 。當(dāng)然忘記密碼也不是問題 , 你可以在 bash 中通過以下命令重置管理后臺指定用戶的密碼:
emqx ctl admins passwd <Username> <Password>與管理后臺不同的是 , 客戶端是單獨的一套認(rèn)證體系 , 你可以通過管理后臺的 “訪問控制” -> “客戶端認(rèn)證” 來創(chuàng)建新的客戶端認(rèn)證信息 。 這里我們可以通過使用客戶端用戶名、Client ID 與密碼進(jìn)行認(rèn)證 。選擇 “Password-Based” , 數(shù)據(jù)源使用內(nèi)置數(shù)據(jù)庫即可 , 其他不需要修改 , 直接創(chuàng)建即可完 。
完成認(rèn)證信息的創(chuàng)建后 , 可以在該認(rèn)證信息的條目中進(jìn)行用戶的管理 , 創(chuàng)建、刪除、修改用戶的密碼等操作 。 這里我們需要創(chuàng)建一個用戶 , 比如 ha , 用于后面的 Home Assistant 連接 。
3. 將 EMQX 接入 Home Assistant3.1 啟用高級模型在 Home Assistant 中 , 需要啟用高級模型才能使用 MQTT 集成中的高級功能 , 主要是為了更換 MQTT 協(xié)議為版本 5 , 默認(rèn)是 3.1.1 接入 。 在個人資料中 , 點擊
高級模式 開關(guān) , 然后重啟 Home Assistant 即可啟用高級模式 。3.2 安裝 MQTT 集成在 Home Assistant 中 , 導(dǎo)航到
設(shè)置 -> 設(shè)備與服務(wù) , 然后點擊右下角的 + 添加集成 按鈕 , 搜索并選擇 MQTT 。在添加 MQTT 集成時 , 需要輸入 EMQX 服務(wù)器的信息 , 然后打開高級選項 , 點擊提交 。
此時配置頁面會刷新 , 展示更多的配置信息 , 你需要填入前面設(shè)置的客戶端認(rèn)證信息 , 用戶名和密碼 , 然后將 MQTT 協(xié)議改為版本 5 , 點擊下一步 。
此時 , Home Assistant 將會連接到 EMQX 服務(wù)器 , 你可以在 EMQX 管理后臺的監(jiān)控中看到 MQTT 設(shè)備的狀態(tài) , 驗證是否成功連接 。
我們可以看到 , Home Assistant 已經(jīng)成功連接到 EMQX 服務(wù)器 , 并已經(jīng)訂閱了一些主題 。 這里是因為默認(rèn)開啟了設(shè)備自動發(fā)現(xiàn)功能 , Home Assistant 會自動訂閱一些主題 , 以便發(fā)現(xiàn)設(shè)備 。
4. 使用 .NET 接入 MQTT到此我們已經(jīng)成功搭建了 EMQX MQTT 服務(wù)器 , 并將其接入到 Home Assistant 中 。 如果我們想設(shè)計一個軟件來接入 MQTT 服務(wù)器 , 并實現(xiàn)在智能家居系統(tǒng)中發(fā)布和訂閱消息 , 那么首先我們需要了解如何在 .NET 中實現(xiàn) MQTT 客戶端 。 下面我們將演示如何使用 .NET 來實現(xiàn)一個簡單的 MQTT 客戶端 , 連接到 EMQX 服務(wù)器 , 并發(fā)布一條消息 。
4.1 安裝 MQTT 客戶端庫在 .NET 項目中 , 可以使用
MQTTnet 庫來實現(xiàn) MQTT 客戶端 。 首先 , 通過 NuGet 安裝該庫:dotnet add package MQTTnet4.2 編寫 MQTT 客戶端代碼以下是一個簡單的 .NET MQTT 客戶端示例:using System.Text;using MQTTnet;using MQTTnet.Client;
class Program{ static async Task Main(string[
args) { var factory = new MqttFactory(); var mqttClient = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder() .WithClientId(\"Client1\") .WithTcpServer(\"MQTT服務(wù)地址\" 1883) .WithCredentials(\"你的客戶端登錄用戶名\" \"你的密碼\") .WithCleanSession() .Build();
mqttClient.ConnectedAsync += MqttClient_ConnectedAsync;
mqttClient.DisconnectedAsync += MqttClient_DisconnectedAsync;
mqttClient.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync;
await mqttClient.ConnectAsync(options);
await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(\"home/temperature\").Build());
Console.WriteLine(\"Press any key to send a message...\"); Console.ReadLine();
var message = new MqttApplicationMessageBuilder() .WithTopic(\"home/temperature\") .WithPayload(\"23.5\") .WithRetainFlag() .Build();
await mqttClient.PublishAsync(message);
Console.WriteLine(\"Message published. Press any key to exit.\"); Console.ReadLine();
await mqttClient.DisconnectAsync();
private static Task MqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg) { Console.WriteLine($\"Message received on topic: {arg.ApplicationMessage.Topic.\"); Console.WriteLine($\"Payload: {Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)\"); return Task.CompletedTask;
private static Task MqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg) { Console.WriteLine(\"Disconnected from EMQX.\"); return Task.CompletedTask;
private static Task MqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg) { Console.WriteLine(\"Connected to EMQX.\"); return Task.CompletedTask; 4.3 運行客戶端編譯并運行你的 .NET 項目 , 確保你的 EMQX 服務(wù)器正在運行 。 運行后 , 客戶端將連接到 EMQX , 并發(fā)布一條消息到 home/temperature 主題 。 你可以在監(jiān)控中看到該消息 。5. 最后通過本文的介紹 , 我們已經(jīng)成功搭建了 EMQX MQTT 服務(wù)器 , 并將其接入到 Home Assistant 中 , 同時也演示了如何使用 .NET 接入 MQTT 。 希望這篇文章能幫助你更好地理解和使用 MQTT 協(xié)議 , 在你的智能家居項目中發(fā)揮更大的作用 。 后續(xù)我們將繼續(xù)介紹在 .nanoFramework 中的使用 , 以及通過 MQTT 在 Home Assistant 中創(chuàng)建自定義的智能家居設(shè)備 , 敬請期待 。
推薦閱讀
- 房屋違章搭建怎么處理
- 荒山劃為基本農(nóng)田可以養(yǎng)殖搭建嗎
- 如何為小狗狗搭建狗窩
- 如何用積木搭建一只可愛的小狗
- 隔音棉怎么安裝方法
- 鴿棚怎么搭建合理
- Unity 3D如何搭建場景
- 地下室鋼筋含量一般是多少
- 如何快速搭建服務(wù)器環(huán)境
- 現(xiàn)在流行的手機(jī)直播平臺是如何搭建的 手機(jī)個人直播怎么搭建
