前言: 本文内容均以实战出发,像MQTT概念这种基础内容建议大家自行百度。
推荐资料: mica-mqtt文档
一、MQTT简单介绍
作为当今物联网的主流协议,MQTT的使用范围非常广,如果你想了解甚至是从事物联网行业,MQTT是避不开的。
1.1 clientId
看名字不难看出,clientId
就是客户端的ID
,服务端可以通过clientId判断出对应的是哪台设备。
ID就意味着唯一,所以请在定义clientId时保证它的唯一性,如果重复,可能导致两个设备互踢下线的情况。
- 唯一性: 保证clientId的唯一,才能做到对设备的唯一识别;
- 长度限制: 根据不同的MQTT,一般都有长度限制,有限制23个字符的,有64个字符的。所以,建议大家不要超过
20
个字符。 - 别用特殊字符: 这个其实大家都懂吧,别那么有个性,容易出奇奇怪怪的问题。尽量用
大小写字母
、数字
、_
、-
,这四种就行,实测没毛病。
1.2 Topic
Topic是MQTT中很重要的概念,消息的分类标签,客户端通过订阅或发布特定的主题来进行消息交互。大家可以把它简单理解为我们代码里API接口(就是controller写的那个),都是以斜杠/
分隔。当然,如果你是Kafka之类MQ消息队列的使用者,对Topic的概念应该不陌生。下面举个例子。
名称 | Topic地址 |
---|---|
实时数据 | /mqtt/xxx/xxx/live |
历史数据 | /mqtt/xxx/xxx/history |
告警事件 | /mqtt/xxx/xxx/event |
下发控制 | /cloud/xxx/xxx/switch |
中间的两层xxx一般是设备的编号信息。👆上面只是举例Topic的格式,并不是说所有的MQTT设备都有这些Topic。
1.2.1 Topic应用场景
- 实时监控: 通过订阅相关Topic,实时接收设备状态和数据,实现对设备的实时监控;
- 远程控制: 通过发布命令到特定Topic,实现对远程设备的控制和操作;
- 报警通知: 当设备检测到异常情况时,通过发布报警消息到指定Topic,及时通知相关人员或系统;
- 数据采集: 通过订阅数据Topic,集中采集和处理来自多个设备的数据。
1.2.2 Topic命名习惯
以下信息主要是以标准网关为例,并不是强制要求。
一般标准的Topic格式有以下特征:
- 统一的开头: 一般第一层是传输方向,比如上面表格的例子。以
/mqtt
开头为设备上报到服务端,以/cloud
开头为服务端下发到设备控制; - 统一的结尾: 一般最后一层是传输方向,比如上面表格的例子。以
/live
结尾为设备上报实时数据,以/history
结尾为设备上报历史数据; - 自带设备编号: Topic的中间部分一般是网关的pkey、sn或者clientId。
当然,我们是可以在MQTT服务中自定义Topic,格式可以根据大家的个人习惯。但是希望大家每种功能都定义一个Topic,而不是在消息体内用type
之类的字段来区分。
1.2.3 Topic通配符
以上面表格为例,一般Topic中间会有代表设备编号或clientId,不可能每个设备都写个订阅,一般都以通配符表示。以表格第一行的/mqtt/xxx/xxx/live
Topic为例,我们简单演示两种通配符的使用。
- 匹配多层的
#
:#
可以模糊匹配多层,比如:我们可以用/mqtt/#/live
表示上面的例子; - 匹配单层的
+
:+
可以模糊匹配单层,比如:我们可以用/mqtt/+/+/live
表示上面的例子。
1.2.4 Topic共享订阅
这个功能一般是在服务端分发数据的时候时候,这个功能非常好用。后面会有单独的篇幅介绍,不了解的谨慎使用。
一般而言多个客户端订阅同一个Topic,那么所有的客户端都会收到Topic的消息。但是,有时候我们只想有一个客户端收到数据。比如,数据量非常大时,我想用多个客户端来分担压力,这个时候就需要用到共享订阅。
简单来说,共享订阅类似Nginx的负载均衡,服务端会把数据随机分到到一个客户端。
1.2.4.1 单组共享订阅
订阅Topic加上前缀 $queue/
(请注意后面有个/
),当多个客户端订阅了Topic $queue/xxx
,发布者发布到 Topicxxx
时 ,则只有一个客户端会接收到消息。
1.2.4.1 分组共享订阅
订阅Topic加上前缀 $share/<group>/
(请注意后面有个/
,中间<group>
是分组的意思,可以用随便什么字符表示),当客户端订阅了Topic $share/aaa/xxx
、$share/bbb/xxx
,发布者发布到 Topicxxx
时 ,则每个分组中只有一个客户端会接收到消息。
相信大家肯定注意到共享订阅前缀最后的 /,所以如果你的Topic是以/开头,那么会出现两个/,比如Topic是/mqtt/xxx/xxx/live,共享订阅Topic就是$queue//mqtt/xxx/xxx/live,这样看起来比较奇怪。所以,一般自定义的共享订阅,我开头的/是不写的。大家一定注意⚠️!!!!!!!!!
1.3 QoS
这个其实挺重要的,但是我们物联网一般也不需要单独设置,大家可以参考下mica-mqtt
的文档了解下就行:mica-mqtt
1.4 消息体
MQTT传输的消息,一般收到是字节数组byte[]
,转成字符串就行,就能获取到真正的信息。
二、MQTT常用工具
工具的使用后面会单开一章,有些会有特殊用法。
2.1 EMQX
理论上说,EMQX不能说是一个工具,它是一个平台或者说一个系统。有开源版,也有更强的云服务和企业版,但是一般的小中型物联网平台,开源版足够了。
EMQX文档地址:EMQX文档
虽然EMQX很出名,使用的用户很多,但是正因如此。强烈建议大家不要把EMQX作为数据接收服务,暴露在公网,很可能因为EMQX的某些可能存在的漏洞影响整个平台。
2.1 MQTTX
通过网盘分享的文件:emqx-5.3.2-windows-amd64.zip
链接: https://pan.baidu.com/s/1BYmqQQaPHkshyf-vkFK5Sw?pwd=hpua 提取码: hpua
–来自百度网盘超级会员v9的分享