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 端口说明
- 1883: MQTT 协议端口
- 8883: MQTT over SSL 端口
- 8083: MQTT over WebSocket 端口
- 8084: MQTT over WebSocket with SSL 端口
- 18083: 管理界面端口
以上是 EMQX 默认的监听器配置,上一节我们使用了默认的端口映射,你也可以根据需要修改端口配置。
2.3 配置 EMQX
EMQX 安装完成后,你可以通过访问 http://localhost:18083
来打开 EMQX 的管理界面,默认用户名是 admin
,密码是 public
。你可以在这里查看和修改 EMQX 的配置信息。首次登录时,会要求修改默认密码。
当然忘记密码也不是问题,你可以在 bash 中通过以下命令重置管理后台指定用户的密码:
emqx ctl admins passwd <Username> <Password>
与管理后台不同的是,客户端是单独的一套认证体系,你可以通过管理后台的 “访问控制” -> “客户端认证” 来创建新的客户端认证信息。这里我们可以通过使用客户端用户名、Client ID 与密码进行认证。
选择 “Password-Based”,数据源使用内置数据库即可,其他不需要修改,直接创建即可完。
完成认证信息的创建后,可以在该认证信息的条目中进行用户的管理,创建、删除、修改用户的密码等操作。这里我们需要创建一个用户,比如 ha,用于后面的 Home Assistant 连接。
3. 将 EMQX 接入 Home Assistant
3.1 启用高级模型
在 Home Assistant 中,需要启用高级模型才能使用 MQTT 集成中的高级功能,主要是为了更换 MQTT 协议为版本 5,默认是 3.1.1 接入。在个人资料中,点击 高级模式
开关,然后重启 Home Assistant 即可启用高级模式。
3.2 安装 MQTT 集成
在 Home Assistant 中,导航到 设置
-> 设备与服务
,然后点击右下角的 + 添加集成
按钮,搜索并选择 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 MQTTnet
4.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 中创建自定义的智能家居设备,敬请期待。