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

news2024/9/24 23:13:24

本文主要介绍如何使用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 端口说明

  • 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 中创建自定义的智能家居设备,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度学习》—— 神经网络中的数据增强

文章目录 一、为什么要进行数据增强&#xff1f;二、常见的数据增强方法1. 几何变换2. 颜色变换3. 尺寸变换4. 填充5. 噪声添加6. 组合变换 三、代码实现四、注意事项五、总结 一、为什么要进行数据增强&#xff1f; 神经网络中的数据增强是一种通过增加训练数据的多样性和数量…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

vue2 搜索高亮关键字

界面&#xff1a; 搜索 “成功” 附上代码&#xff08;开箱即用&#xff09; <template><div class"box"><input class"input-box" v-model"searchKeyword" placeholder"输入搜索关键字" /><div class"r…

【深度】边缘计算神器之数据网关

分布式计算、云边协同、互联互通是边缘计算设备的三项重要特征。 边缘计算设备通过分布式计算模式&#xff0c;将数据处理和分析任务从中心化的云平台下放到设备网关&#xff0c;即更接近数据源的地方&#xff0c;从而显著降低了数据传输的延迟&#xff0c;提高了响应速度和处…

OpenCV normalize() 函数详解及用法示例

OpenCV的normalize函数用于对数组&#xff08;图像&#xff09;进行归一化处理&#xff0c;即将数组中的元素缩放到一个指定的范围或具有一个特定的标准&#xff08;如均值和标准差&#xff09;。它有两个原型函数, 如下: Normalize()规范化数组的范数或值范围。当normTypeNORM…

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

通信工程学习:什么是NFVO网络功能虚拟化编排器

NFVO&#xff1a;网络功能虚拟化编排器 NFVO&#xff08;Network Functions Virtualization Orchestrator&#xff09;&#xff0c;即网络功能虚拟化编排器&#xff0c;是网络功能虚拟化&#xff08;NFV&#xff09;架构中的核心组件之一。NFV是一种将传统电信网络中的网络节点…

Health Check

强大的自愈能力是Kubernetes这类容器编排引擎的一个重要特性&#xff0c;自愈的默认实现方式是自动重启发生故障的容器&#xff0c;除此之外&#xff0c;用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查&#xff0c;进而实现如下需求&#xff1a; 零停机部署避…

c++优先队列priority_queue(自定义比较函数)

c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestPairs(vecto…

开源UNI-SOP云统一认证平台

今天给大家分享一款开源的商用级别认证平台UNI-SOP&#xff0c;这块软件分为开源版本和专业版本&#xff0c;由于专业版涉及到一些代码授权问题&#xff0c;暂时未开源&#xff0c;不过&#xff0c;一般应用开源版本足够了。 先来看看系统管理平台界面&#xff0c;然后我们再来…

[OPEN SQL] SELECT语句

本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 1.SELECT语句 SELECT语句从数据库表中读取必要的数据 1.1 读取一行数据 语法格式 SELECT SINGLE <cols>... WHERE cols&#xff1a;数据库表的字段 从数据库表中读取一条数据可使…

[数据结构]动态顺序表的实现与应用

文章目录 一、引言二、动态顺序表的基本概念三、动态顺序表的实现1、结构体定义2、初始化3、销毁4、扩容5、缩容5、打印6、增删查改 四、分析动态顺序表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引言 想象一下&#xff0c;你有一个箱子&#xff08;静态顺序…

武汉大学首个人形机器人来了!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈又发生了哪些新鲜事&#xff1f; 武汉大学展示首个人形机器人“天问”&#xff1a;1.7米高&#xff0c;65公斤重&#xff0c;36个自由度 武汉大学近日展示了其首个人形机器人“天问”&#xff0…

屏幕演示工具 | 水豚鼠标助手 v1.0.7

水豚鼠标助手是一款功能强大的屏幕演示工具&#xff0c;专为Windows 10及以上系统设计。这款软件提供了多种实用功能&#xff0c;旨在增强用户的屏幕演示体验&#xff0c;特别适合教师、讲师和需要进行屏幕演示的用户。鼠标换肤&#xff1a;软件提供多种鼠标光标样式&#xff0…

国庆出行新宠:南卡Pro5骨传导耳机,让旅途不再孤单

国庆长假即将来临&#xff0c;对于热爱旅行和户外运动的朋友们来说&#xff0c;一款适合旅行使用的耳机无疑是提升旅途体验的神器。今天&#xff0c;我要向大家推荐一款特别适合国庆出行的耳机——南卡Runner Pro5骨传导耳机。作为一名热爱旅游的体验者&#xff0c;我强烈推荐南…

2024年主流前端框架的比较和选择指南

在选择前端框架时&#xff0c;开发者通常会考虑多个因素&#xff0c;包括框架的功能、性能、易用性、社区支持和学习曲线等。以下是一些主流前端框架的比较和选择指南。 1. 主流前端框架简介 React 优点: 组件化开发&#xff0c;易于复用和维护。虚拟DOM提高了性能。强大的生…

Java 中创建线程几种方式

目录 概述 一. 继承Thread类 1. 特点 2. 注意事项 3. 代码示例 二. 实现Runnable接口 1. 特点 2. 注意事项 3. 代码示例 三. 实现Callable接口 1. 特点 2. 注意事项 3. 代码示例 概述 在Java中&#xff0c;线程&#xff08;Thread&#xff09;是程序执行的最小单…

Java面试篇基础部分-Synchronized关键字详解

Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。   Java中的每个…

mask controlnet

diffusers/examples/controlnet/README.md at main huggingface/diffusers GitHub🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch and FLAX. - diffusers/examples/controlnet/README.md at main huggingface/diffusershttp…