搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

文章图片

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

文章图片

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

文章图片

搭建EMQX MQTT服务器并接入Home Assistant和.NET程序

本文主要介绍如何使用Docker搭建EMQX MQTT服务器 , 并将其接入到Home Assistant中 , 最后演示如何使用.NET接入MQTT 。
1. 背景在智能家居系统中 , MQTT(消息队列遥测传输协议)是一种轻量级的消息传输协议 , 特别适用于物联网(IoT)设备之间的通信 。 EMQX 是一个高性能的、开源的 MQTT 消息服务器 , 支持 MQTT 3.1、3.1.1 和 5.0 协议 , 并可以方便的创建集群 , 实现高可用性 。 Home Assistant 是一个开源的家庭自动化平台 , 支持 MQTT 集成 , 可以通过 MQTT 与其他设备进行通信 。
本文将介绍如何使用 Docker 搭建 EMQX MQTT 服务器 , 并将其接入到 Home Assistant 中 , 最后演示如何使用 .NET 接入 MQTT 。
2. 搭建 EMQX MQTT 服务器2.1 安装 EMQX使用 Docker 安装 EMQX 是最简单的方法之一 。 首先确保你的系统上已经安装了 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当然 , 你可以可以通过 docker-compose 来管理 EMQX 服务:
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 的数据和日志目录映射到宿主机的 /volume1/docker/mqtt/data/volume1/docker/mqtt/log 目录中 , 以便数据持久化 。 并且禁用了 EMQX 的遥测功能 , 对默认的节点名称进行了修改 。
2.2 端口说明【搭建EMQX MQTT服务器并接入Home Assistant和.NET程序】?1883: MQTT 协议端口?8883: MQTT over SSL 端口?8083: MQTT over WebSocket 端口?8084: MQTT over WebSocket with SSL 端口?18083: 管理界面端口


默认监听器


以上是 EMQX 默认的监听器配置 , 上一节我们使用了默认的端口映射 , 你也可以根据需要修改端口配置 。
2.3 配置 EMQXEMQX 安装完成后 , 你可以通过访问 http://localhost:18083 来打开 EMQX 的管理界面 , 默认用户名是 admin , 密码是 public 。 你可以在这里查看和修改 EMQX 的配置信息 。 首次登录时 , 会要求修改默认密码 。
当然忘记密码也不是问题 , 你可以在 bash 中通过以下命令重置管理后台指定用户的密码:
emqx ctl admins passwd <Username> <Password>与管理后台不同的是 , 客户端是单独的一套认证体系 , 你可以通过管理后台的 “访问控制” -> “客户端认证” 来创建新的客户端认证信息 。 这里我们可以通过使用客户端用户名、Client ID 与密码进行认证 。
选择 “Password-Based” , 数据源使用内置数据库即可 , 其他不需要修改 , 直接创建即可完 。


创建认证


完成认证信息的创建后 , 可以在该认证信息的条目中进行用户的管理 , 创建、删除、修改用户的密码等操作 。 这里我们需要创建一个用户 , 比如 ha , 用于后面的 Home Assistant 连接 。
3. 将 EMQX 接入 Home Assistant3.1 启用高级模型在 Home Assistant 中 , 需要启用高级模型才能使用 MQTT 集成中的高级功能 , 主要是为了更换 MQTT 协议为版本 5 , 默认是 3.1.1 接入 。 在个人资料中 , 点击 高级模式 开关 , 然后重启 Home Assistant 即可启用高级模式 。


高级模式


3.2 安装 MQTT 集成在 Home Assistant 中 , 导航到 设置 -> 设备与服务 , 然后点击右下角的 + 添加集成 按钮 , 搜索并选择 MQTT


MQTT


在添加 MQTT 集成时 , 需要输入 EMQX 服务器的信息 , 然后打开高级选项 , 点击提交 。


高级选项


此时配置页面会刷新 , 展示更多的配置信息 , 你需要填入前面设置的客户端认证信息 , 用户名和密码 , 然后将 MQTT 协议改为版本 5 , 点击下一步 。
此时 , Home Assistant 将会连接到 EMQX 服务器 , 你可以在 EMQX 管理后台的监控中看到 MQTT 设备的状态 , 验证是否成功连接 。


连接的客户端


我们可以看到 , Home Assistant 已经成功连接到 EMQX 服务器 , 并已经订阅了一些主题 。 这里是因为默认开启了设备自动发现功能 , Home Assistant 会自动订阅一些主题 , 以便发现设备 。
4. 使用 .NET 接入 MQTT到此我们已经成功搭建了 EMQX MQTT 服务器 , 并将其接入到 Home Assistant 中 。 如果我们想设计一个软件来接入 MQTT 服务器 , 并实现在智能家居系统中发布和订阅消息 , 那么首先我们需要了解如何在 .NET 中实现 MQTT 客户端 。 下面我们将演示如何使用 .NET 来实现一个简单的 MQTT 客户端 , 连接到 EMQX 服务器 , 并发布一条消息 。
4.1 安装 MQTT 客户端库在 .NET 项目中 , 可以使用 MQTTnet 库来实现 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服务地址\" 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 服务器正在运行 。 运行后 , 客户端将连接到 EMQX , 并发布一条消息到 home/temperature 主题 。 你可以在监控中看到该消息 。


发布消息


5. 最后通过本文的介绍 , 我们已经成功搭建了 EMQX MQTT 服务器 , 并将其接入到 Home Assistant 中 , 同时也演示了如何使用 .NET 接入 MQTT 。 希望这篇文章能帮助你更好地理解和使用 MQTT 协议 , 在你的智能家居项目中发挥更大的作用 。 后续我们将继续介绍在 .nanoFramework 中的使用 , 以及通过 MQTT 在 Home Assistant 中创建自定义的智能家居设备 , 敬请期待 。


    推荐阅读