MQTT协议及通信测试

1.MQTT协议介绍

1.1简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。

该协议将消息的发布者(publisher)与订阅者(subscriber)进行分离,因此可以在不可靠的网络环境中,为远程连接的设备提供可靠的消息服务,使用方式与传统的MQ有点类似。

MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT

MQTT协议有三种设备,订阅者,发布者,和MQTT代理。(订阅者和发布者都属于客户端)

1.2相关名词

Qos(服务质量等级)

QoS 是消息的发送方(Sender)和接受方(Receiver)之间达成的一个协议:

QoS0 代表,Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;

QoS1 代表,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;

QoS2 代表,Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。

dup

重复消息的标志,应该是库能够自动完成的机制,也可以手动修改,但规范里明确的说此标志不能做为判断重复消息的依据

retainde

retain消息可以在订阅方离线时保存,重新上线订阅后既能收到retain消息,但broker端每个主题下只能保存一条retain消息,如果你pub的消息都携带retain标志,broker端就会不停的覆盖,只保留最后一条.

应用的场合:你希望sub方订阅成功后立马执行的控制命令

1.3MQTT多主题订阅

mqtt 的主题一个层级的概念. 我们订阅多个主题就需要用到这个技术点。功能是在主题中引入层次。层次又分主题层级分隔符,多层通配符和单层通配符。需要注意的一点是: 这些层级不能用在发布消息的 Publish 接口中

层级分类

主题层级分隔符: /

多层通配符: #

单层通配符: +

主题层级分隔符

"/" 被用来分割主题树的每一层,并给主题空间提供分等级的结构。当两个通配符在一个主题中出现的时候,主题层次分隔符的使用是很重要的。

例如:

// 主题Topic1: 分了三层/test/child/aaa
// 主题Topic2: 分了四层/test/child/aaa2/bbb2

多层通配符

多层通配符"#"是一个匹配主题中任意层次数的通配符。

例如:

订阅主题: /test/child/#

我们将收到这些主题发送来的消息:

/test/child
/test/child/aaa
/test/child/ccc
/test/child/aaa/bbb
/test/child/aaa/bbb/ddd

多层通配符可以理解为大于等于0的层次。

多层通配符只可以确定当前层或者下一层

单层通配符

单层通配符 "+" 只匹配主题的一层

例如:

订阅主题: /test/child/+

我们将收到这些主题发送来的消息:

注意:接收不到 /test/child 主题发送的消息

/test/child/aaa
/test/child/bbb
/test/child/ccc

小结

订阅的主题名可以当成层级目录来理解。主题层级就类似于目录层级,多层通配的#可以表示任意的目录层级,单层通配符的+表示只在当前层级可哟使用任意名字来通配。

只要符合这些通配符通配范围内的主题层级名就都会被接收。

可以参考https://www.cnblogs.com/shuiche/p/12630606.html。

2.MQTT通信实验

实验思路,利用MQTT Broker在电脑本地建立一个MQTT服务器,然后使用MQTT.fx客户端连接这个服务器然后两个客户端一个发布一个订阅。

2.1搭建MQTT服务器(emqx)

1.下载MQTT Broker。

从https://www.emqx.io/cn/mqtt/public-mqtt5-broker下载MQTT Broker。

因为使用的windows系统,下载对应版本工具:emqx-windows-v4.1-rc.2.zip

另外,上述链接的访问出现问题可以直接百度搜索emqx-windows-v4.1-rc.2.zip,一般都可以搜到并下载。

下载后目录如下图所示

2.打开CMD,进入bin文件,启动emqx服务器并查看运行状态

C:\Users\JYC>H:

H:\>cd 2345Downloads\emqx\bin

H:\2345Downloads\emqx\bin>emqx start

H:\2345Downloads\emqx\bin>emqx_ctl status

3.进入MQTT服务器控制台

确保emqx已正常运行后,可在浏览器中输入:http://127.0.0.1:18083

用户名:admin

密码:public

如果密码不对可以在/etc/plugins/emqx_auth_username.conf里面查看或者修改用户名和密码

如果要修改服务器端口,需要在/etc/emqx.conf里面修改,找到Listeners即可配置端口,然后再重启服务即可

2.2MQTT客户端

1.下载安装MQTT.fx工具

可到官网  Download 下载想要的版本

2.设置MQTT连接的参数

点击设置图标按钮

点击左下角的+号新建连接

设置当前客户端的名字和连接的类型,可以不修改使用默认的

设置地址为127.0.0.1,因为开启的MQTT服务在本地开启的

设置服务器的端口,可以不修改

设置Client ID,随便设置,但是同一服务器下的设备的ID不能一样

Connection Timeout 超时时间设置(s),默认即可

Keep Alive Interval 心跳包间隔时间(s),默认即可

若有账户要求,切换到User Credentials设置用户名和密码即可

修改好参数以后点OK或者Apply都可以

3.然后返回到主界面,切换到自己刚刚建立的链接并点击Connect建立连接

4.订阅消息

按下图所示步骤设置订阅主题为topic0,Qos(服务质量等级)选择Qos0

设置好后,点击"topic0"后面的Subscribe按键。

此时订阅成功

5.发布消息

切换到PUblic界面,发布一条上一步中订阅的主题为“topic0”的消息;消息内容为“topic0 hahaha”;Qos同样设置为Qos0。

设置完后点Publish即可

6.查看已订阅消息

切换到Subscribe界面,右边可以看到发布的消息

对于订阅和发布消息必须是一个订阅(接收消息)一个发布(发送消息),如果想要实现双工,一个设备就要同时进行发布和订阅(两个主题)

猜你喜欢

转载自blog.csdn.net/qq_38579670/article/details/122477278