搭建自己的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】点击下载压缩包。
【2】下载后解压。
2.3 打开PowerShell命令行
鼠标右键点击Windows左下角的windows图标
,弹出对话框,选择 Windows PowerShell
,打开命令行窗口。
2.4 启动EMQX
【1】进入到刚才EMQX解压的目录。
【2】在 Windows PowerShell
命令行窗口,输入cd命令切换路径。
cd C:\Users\11266\Downloads\emqx-5.3.0-windows-amd64
【3】输入命令启动EMQX
.\bin\emqx start
启动的时候会弹出防火墙提示窗口,记得点击 允许访问 。
启动成功的提示如下:
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>
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的后台管理页面。可以管理以连接的客户端或检查运行状态。
默认用户名和密码:
用户名:admin
密码:public
第一次登录会提示你修改新密码,如果不想设置,也可以选择跳过。
登录成功的页面显示如下:
3.2 MQTT配置
http://127.0.0.1:18083/#/mqtt/general
这里可以配置MQTT的一些参数,根据自己的需求进行配置。
3.3 测试MQTT通信
http://127.0.0.1:18083/#/websocket
新建一个客户端,点击连接。
连接之后,然后点击订阅,和发布,如果下面消息能正常的接收。说明MQTT服务器通信是已经正常,没问题了。
并且在这个页面也可以看到主题发布
和主题订阅
的格式。
3.4 MQTT客户端登录服务器测试
接下来就打开我们自己的MQTT客户端登录MQTT服务器进行测试数据的通信。
端口选择: 1883
根据软件参数填入参数,登录,进行主题的发布和订阅。
说明: 目前还没有配置客户端认证,现在只要IP和端口输入正确,MQTT三元组可以随便输入,都可以登录上服务器的,服务器没有对三元组做校验。
EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
http://127.0.0.1:18083/#/clients
然后打开EMQX
的管理后台,可以看到我们的设备已经登录服务器了,名字为test1
。
在订阅主题的页面也可以看到我们客户端设备订阅的主题。
3.5 客户端认证配置
EMQX 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
在正式产品里肯定是要启用认证的,不然任何设备都能接入。
下面就介绍如何配置 客户端认证。
http://127.0.0.1:18083/#/authentication
【1】打开客户端认证页面
【2】选择密码认证
【3】选择内置数据库
【4】设置认证方式(都可以默认,不用改),直接点击创建。
【5】创建成功后,点击用户管理
【6】添加用户
【7】添加成功
【8】添加完毕之后,打开MQTT客户端可以进行测试。
登录的时候,MQTT用户名和密码必须输入正确,按照上一步添加的信息进行如实填写,否则是无法登录服务器的。
3.6 客户端授权配置
客户端授权页面可以配置每个客户端(设备)的主题发布,订阅权限。限制它是否可以发布主题,订阅主题。 如果有需要就可以进行配置。
http://127.0.0.1:18083/#/authorization/detail/built_in_database?tab=users
【1】创建数据源
【2】选择内置数据库
【3】完成创建
【4】点击权限管理
【5】选择客户端ID,点击添加
【6】配置权限
3.7 数据转发(集成)
在集成选项里,可以对设备数据处理。 比如:转发到自己的HTTP服务器,转发到自己其他的MQTT服务器,创建规则,某些事件触发某些动作等等。
选择数据桥接。
可以把数据发送端自己的HTTP服务器,或者发送到其他的MQTT服务器。
选择HTTP服务 (如果自己有HTTP服务器,可以将数据转发给自己的HTTP服务器)。
四、MQTT客户端消息互发测试
4.1 添加2个设备
为了方便测试设备间互相订阅主题,数据收发,在客户端认证页面至少添加2个设备。我这里分别添加了test1
和test2
。
4.2 设备间测试
设备A订阅设备B的主题,设备B订阅设备A的主题,实现数据互发。
设备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开发的图传软件,分别为发送端和接收端。
运行效果: 进行图传效果是非常的好。 报文最大一次可以发送 256MB
五、单片机设备上云
只要是MQTT客户端能正常上云通信了,那么单片机也是一样的。
目前是介绍本地部署,如果想在云端部署,直接买一个ECS云服务器,购买一个公网IP地址就可以了,在云端服务器部署好EMQX就可以正常像阿里云IOT、OneNet、华为云IOT之类的服务器一样使用了。