Document

搭建自己的MQTT服务器、实现设备上云(Windows+EMQX)

搭建自己的MQTT服务器、实现设备上云(Windows+EMQX)

 

一、EMQX介绍

1.1 EMQX介绍

EMQX是一款大规模可弹性伸缩的云原生分布式物联网MQTT消息服务器。它是完全开源的,基于Apache 2.0许可证,且自2013年起已经有200+的开源版本迭代。EMQX提供了三种服务:云服务版本、商业版和开源版。

作为一款MQTT消息服务器,EMQX支持MQTT 5.0和3.x协议标准,具有更好的伸缩性、安全性和可靠性。在性能上,单节点支持500万MQTT设备连接,集群可扩展至1亿并发MQTT连接。同时,它能支持每秒实时接收、移动、处理与分发数百万条的MQTT消息,消息分发与投递时延低于1毫秒。

EMQX还有一些高级特性,如采用Masterless的大规模分布式集群架构,实现系统高可用和水平扩展。此外,它还内置了强大的规则引擎,支持一站式数据提取、过滤与转换,并能灵活集成SQL、NoSQL、时序数据库,及Kafka等流处理中间件。

EMQX支持跨平台部署,可以在Linux、Windows、MacOS、ARM嵌入系统等平台进行部署。生产环境下,推荐在CentOS、Ubuntu、Debian等Linux发行版上进行部署,不建议使用Windows。

帮助文档:https://www.emqx.io/docs/zh/v5.2/

1.2 MQTT核心概念

MQTT(消息队列遥测传输)是物联网(Internet of Things)中最常用的轻量级消息协议。该协议基于发布/订阅(pub/sub)模式进行消息通信,允许设备和应用程序实时交换数据,使用简单有效的消息格式,最大限度地减少网络开销并降低功耗。

作为MQTT消息平台,EMQX Enterprise为完整的MQTT消息功能提供全面支持。

1.3 发布/订阅模式

该协议是事件驱动的,并使用发布/订阅模式连接设备。与传统的客户端/服务器模式不同,它是一种消息传递模式,其中发送方(发布者)不直接将消息发送给特定的接收方(订阅者)。相反,发布者将消息分类为不同的主题,订阅者订阅他们感兴趣的主题。当发布者向主题发送消息时,MQTT代理路由并过滤所有传入消息,然后将其传递给对该主题表达兴趣的所有订阅者。

发布者和订阅者彼此解耦,不需要知道对方的存在。他们之间的唯一连接基于预定的消息协议。发布/订阅模式支持灵活的消息通信,因为可以根据需要动态添加或删除订阅者和发布者。它还使消息广播、多播和单播的实现更加容易。

1.4 MQTT服务器

MQTT服务器充当发布客户端和订阅客户端之间的代理,将所有收到的消息转发给匹配的订阅客户端。因此,有时服务器被直接称为MQTT代理。

1.5 MQTT客户端

客户端是指可以使用MQTT协议连接到MQTT服务器的设备或应用程序。它们既可以充当发布者和订阅者,也可以单独担任这两个角色中的任何一个。在MQTT通信中,客户端可以向服务器发布消息,同时也可以订阅一个或多个主题以接收来自其他客户端的消息。通过这种方式,MQTT客户端能够在物联网环境中实现高效、实时的数据传输和交互。

1.6 主题与通配符

在MQTT中,主题是用于识别和区分不同消息的,构成了MQTT消息路由的基础。发布者在发布消息时可以指定消息的主题,而订阅者可以选择订阅感兴趣的主题以接收相关消息。

为了实现一次订阅多个主题的目标,订阅者在订阅主题时可以使用通配符。MQTT提供了两种类型的主题通配符,单级通配符和多级通配符,以满足不同的订阅需求。

  • 单级通配符:用于匹配主题中的一个级别。
  • 多级通配符:用于匹配主题中的多个级别。

通过使用这两种通配符,订阅者可以灵活地订阅一系列相关的主题,而不仅仅是一个具体的主题。

1.7 服务质量(QoS)

MQTT定义了三个级别的QoS,以提供不同级别的消息可靠性。每个消息在发布时可以独立设置自己的QoS。

  • QoS 0:最多传递一次消息,可能会丢失;
  • QoS 1:至少传递一次消息,保证到达,但可能会重复;
  • QoS 2:精确传递一次消息,保证到达且不重复。

随着QoS级别的增加,消息传输的复杂性也增加。需要根据实际情况选择合适的QoS级别。

在选择QoS级别时,需权衡消息传递的可靠性和网络资源的消耗。例如,在网络资源有限但对消息可靠性要求不高的情况下,可以选择QoS 0;而在对消息可靠性要求较高,且能容忍一定网络资源消耗的场景中,可以选择QoS 1或QoS 2。

二、Windows下安装EMQX

2.1 官网地址

链接:https://www.emqx.io/downloads?os=Windows

2.2 下载EMQX

【1】点击下载压缩包。

image-20231107141257677

【2】下载后解压。

image-20231107141403129

2.3 打开PowerShell命令行

鼠标右键点击Windows左下角的windows图标,弹出对话框,选择 Windows PowerShell,打开命令行窗口。

image-20231107141620856

image-20231107141454298

2.4 启动EMQX

【1】进入到刚才EMQX解压的目录。

image-20231107141752015

【2】在 Windows PowerShell命令行窗口,输入cd命令切换路径。

cd C:\Users\11266\Downloads\emqx-5.3.0-windows-amd64

image-20231107142102289

【3】输入命令启动EMQX

.\bin\emqx start

启动的时候会弹出防火墙提示窗口,记得点击 允许访问 。

image-20231107142237380

启动成功的提示如下:

PS C:\Users\11266\Downloads\emqx-5.3.0-windows-amd64> .\bin\emqx start
EMQX_NODE__DB_ROLE [node.role]: core
EMQX_NODE__DB_BACKEND [node.db_backend]: mnesia
PS C:\Users\11266\Downloads\emqx-5.3.0-windows-amd64>

image-20231107142332199

2.5 EMQX常用的命令

PS C:\Users\11266\Downloads\emqx-5.3.0-windows-amd64> .\bin\emqx
usage: emqx (install|uninstall|start|stop|restart|console|ping|ctl|list|remote_console|attach)
    
.\bin\emqx start    启动
.\bin\emqx stop     停止
.\bin\emqx restart  重启 

三、配置EMQX服务器

3.1 登录EMQX内置管理控制台

EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。

在浏览器里输入: http://127.0.0.1:18083 就可以访问EMQX的后台管理页面。可以管理以连接的客户端或检查运行状态。

image-20231107142801182

默认用户名和密码:

用户名:admin
密码:public

第一次登录会提示你修改新密码,如果不想设置,也可以选择跳过。

登录成功的页面显示如下:

image-20231107142950152

3.2 MQTT配置

http://127.0.0.1:18083/#/mqtt/general

这里可以配置MQTT的一些参数,根据自己的需求进行配置。

image-20231107144529825

3.3 测试MQTT通信

http://127.0.0.1:18083/#/websocket

新建一个客户端,点击连接。

image-20231107152330895

连接之后,然后点击订阅,和发布,如果下面消息能正常的接收。说明MQTT服务器通信是已经正常,没问题了。

并且在这个页面也可以看到主题发布主题订阅的格式。

image-20231107152608232

3.4 MQTT客户端登录服务器测试

接下来就打开我们自己的MQTT客户端登录MQTT服务器进行测试数据的通信。

端口选择: 1883

根据软件参数填入参数,登录,进行主题的发布和订阅。

说明: 目前还没有配置客户端认证,现在只要IP和端口输入正确,MQTT三元组可以随便输入,都可以登录上服务器的,服务器没有对三元组做校验。

EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。

image-20231107152927778

http://127.0.0.1:18083/#/clients

然后打开EMQX的管理后台,可以看到我们的设备已经登录服务器了,名字为test1

image-20231107153020452

在订阅主题的页面也可以看到我们客户端设备订阅的主题。

image-20231107153156526

3.5 客户端认证配置

EMQX 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。

在正式产品里肯定是要启用认证的,不然任何设备都能接入。

下面就介绍如何配置 客户端认证。

http://127.0.0.1:18083/#/authentication

【1】打开客户端认证页面

image-20231107160746380

【2】选择密码认证

image-20231107160844450

【3】选择内置数据库

image-20231107160916912

【4】设置认证方式(都可以默认,不用改),直接点击创建。

image-20231107161002220

【5】创建成功后,点击用户管理

image-20231107161043692

【6】添加用户

image-20231107161154596

image-20231107161254779

【7】添加成功

image-20231107161317252

【8】添加完毕之后,打开MQTT客户端可以进行测试。

登录的时候,MQTT用户名和密码必须输入正确,按照上一步添加的信息进行如实填写,否则是无法登录服务器的。

image-20231107161438124

3.6 客户端授权配置

客户端授权页面可以配置每个客户端(设备)的主题发布,订阅权限。限制它是否可以发布主题,订阅主题。 如果有需要就可以进行配置。

http://127.0.0.1:18083/#/authorization/detail/built_in_database?tab=users

【1】创建数据源

image-20231107153705954

【2】选择内置数据库

image-20231107153725972

【3】完成创建

image-20231107153746654

【4】点击权限管理

image-20231107153810651

【5】选择客户端ID,点击添加

image-20231107153902413

【6】配置权限

image-20231107161803875

3.7 数据转发(集成)

在集成选项里,可以对设备数据处理。 比如:转发到自己的HTTP服务器,转发到自己其他的MQTT服务器,创建规则,某些事件触发某些动作等等。

image-20231107225638965

选择数据桥接。

可以把数据发送端自己的HTTP服务器,或者发送到其他的MQTT服务器。

image-20231107225815739

选择HTTP服务 (如果自己有HTTP服务器,可以将数据转发给自己的HTTP服务器)。

image-20231107225942506

四、MQTT客户端消息互发测试

4.1 添加2个设备

为了方便测试设备间互相订阅主题,数据收发,在客户端认证页面至少添加2个设备。我这里分别添加了test1test2

image-20231107163706657

4.2 设备间测试

设备A订阅设备B的主题,设备B订阅设备A的主题,实现数据互发。

image-20231107164156741

设备A的MQTT信息:

MQTT服务器地址:127.0.0.1
MQTT服务器端口号:1883
MQTT客户端ID:AAA
MQTT用户名:test1
MQTT登录密码:12345678

订阅主题:BBB/#
发布主题:AAA/1
发布的消息:{ "msg": "我是AAA设备" }

设备B的MQTT信息:

MQTT服务器地址:127.0.0.1
MQTT服务器端口号:1883
MQTT客户端ID:BBB
MQTT用户名:test2
MQTT登录密码:12345678

订阅主题:AAA/#
发布主题:BBB/1
发布的消息:{ "msg": "我是BBB设备" }

4.3 MQTT实时图传测试

下面演示,利用MQTT协议进行图像传输。

这是打包好的APP,0积分可以下载,下载下来就可以测试图传:
https://download.csdn.net/download/xiaolong1126626497/88512661

这是MQTT协议图传上位机的Qt源码,如果需要源码的可以到这里下载:
https://download.csdn.net/download/xiaolong1126626497/87614468

这是Qt的工程,利用Qt开发的图传软件,分别为发送端和接收端。

image-20231107172033585

运行效果: 进行图传效果是非常的好。 报文最大一次可以发送 256MB

image-20231107172328140

五、单片机设备上云

只要是MQTT客户端能正常上云通信了,那么单片机也是一样的。

目前是介绍本地部署,如果想在云端部署,直接买一个ECS云服务器,购买一个公网IP地址就可以了,在云端服务器部署好EMQX就可以正常像阿里云IOT、OneNet、华为云IOT之类的服务器一样使用了。

posted @ 2024-07-30 10:01  从未被超越  阅读(21)  评论(0编辑  收藏  举报