MQTT 介绍

MQTT 协议介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它是一种轻量级的、基于代理的“发布/订阅”模式的消息传输协议。其具有协议简洁、小巧、可扩展性强、省流量、省电等优点,而且已经有 PHP,JAVA,Python,C,C#,Go 等多个语言版本,还有微信小程序版,基本可以使用在任何平台上,几乎可以把所有联网物品和外部连接起来,所以特别适合用来当做物联网的通信协议,实用的场景有遥感数据、汽车、智能家居、智慧城市、医疗医护等等。

MQTT 特点

MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

  1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

  2. 对负载内容屏蔽的消息传输;

  3. 使用 TCP/IP 提供网络连接;

  4. 有三种消息发布服务质量:

    • “至多一次”(qos = 0),消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    • “至少一次”(qos = 1),确保消息到达,但消息重复可能会发生。
    • “只有一次”(qos = 2),确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
  5. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

  6. 使用 Last Will (遗嘱)和 Testament 特性通知有关各方客户端异常中断的机制;

消息模型

MQTT 是一种基于代理的发布/订阅的消息协议。与请求/回答这种同步模式不同,发布/订阅模式解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系。一个发布者可以对应多个订阅者,当发布者发生变化的时候,他可以将消息一一通知给所有的订阅者。这种模式提供了更大的网络扩展性和更动态的网络拓扑

消息模型

主题与通配符

主题名称(Topic name)用来标识已发布消息的信息的渠道。订阅者用它来确定接收到所关心的信息。它是一个分层的结构,用斜线“/”作为分隔符(这个有点类似于restful风格)。主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而#只能出现在主题最后表示过滤任意级别的层级。值得注意的是MQTT允许使用通配符订阅主题,但是并不允许使用通配符广播。

举个例子:

`building-b/floor-5`:代表B楼5层的设备。

`+/floor-5`:代表任何一个楼的5层的设备。

`building-b/#`:代表B楼所有的设备。

遗嘱

当一个客户端断开连接的时候,它希望客户端可以发送它指定的消息。该消息和普通消息的结构相同。通过设置该位并填入和信息相关的内容即可(后面会有介绍)。

消息类型

消息类型 类型 编码说明
reserved 0 保留
connect 1 客户端到服务端的连接请求
connACK 2 服务端对连接请求的响应
publish 3 发布消息
puback 4 新发布消息确认,是 QoS 1 给 PUBLISH 消息的回复
pubRec 5 QoS 2 消息流的第一部分,表示消息发布已记录
pubRel 6 QoS 2 消息流的第二部分,表示消息发布已释放
pubComp 7 QoS 2 消息流的第三部分,表示消息发布完
subscribe 8 客户端订阅某个主题
subBack 9 对于 SUBSCRIBE 消息的确认
unsubscribe 10 客户端终止订阅的消息
unsubBack 11 对于 UNSUBSCRIBE 消息的确认
pingReq 12 心跳
pingResp 13 确认心跳
disconnect 14 客户端终止连接前通知 MQTT 代理
reserved 15 保留

MQTT 服务端-mosquito

MQTT 服务端还有,Apache Apollo 是一个代理服务器,其是在 ActiveMQ 基础上发展而来的,可以支持多种协议,如: STOMP、AMQP、MQTT、SSL 等。查看原文可看到介绍。

Mosquitto 是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。

安装

windows 下安装可参考这篇文章:How to Install The Mosquitto MQTT Broker on Windows

主要问题是:缺少 Win32OpenSSL 的 SSLEAY32.dll,LIBEAY32.dll,在其提供的下载链接,也没有找到这两个文件。最后在电脑中其他文件夹(如 QQ 的文件夹)中找到这两个文件,并把这两个文件的文件名改成大写,放在 Mosquitto 的安装目录中,并重新安装解决了问题。

因为下文中需要使用 mosquitto_sub.exe,mosquitto_pub.exe,进行发布接收测试,所以这里需要下载 pthreadVC2.dll

安装完成后,在 windows 服务中找到 mosquitto 并启动 mosquitto 服务,可以将起设置为自动启动。也可以使用命令 sc start mosquitto 启动服务。

测试

订阅主题

mosquitto_sub -v -t topicTest01

-v:打印更多调试信息

-t:指定主题,此处为 topicTest01

发布内容

新打开一个 cmd 窗口

mosquitto_pub -t topicTest01 -m TestMessage

-t:指定主题

-m:指定消息内容

测试结果

发布消息后,在订阅主题的窗口中订阅这收到了主题为 topicTest01 的 TestMessage 消息。

启动

如果不想让 mosquitto 作为 windows 服务启动,可以手动启动。

使用 mosquitto -h 命令查看帮助

PS D:\mosquitto> .\mosquitto -h
mosquitto version 1.4.15 (build date 23/03/2018 10:26:57.31)

mosquitto is an MQTT v3.1.1/v3.1 broker.

Usage: mosquitto [-c config_file] [-d] [-h] [-p port]

 -c : specify the broker config file.
 -d : put the broker into the background after starting.
 -h : display this help.
 -p : start the broker listening on the specified port.
      Not recommended in conjunction with the -c option.
 -v : verbose mode - enable all logging types. This overrides
      any logging options given in the config file.可以查看到更多的日志信息

See http://mosquitto.org/ for more information.

配置文件 mosquitto.conf

默认配置文件 mosquitto.conf,在启动时可以使用命令 mosquitto -c 配置文件 更改要使用的配置文件。

配置文件里面有很多配置项,基本只用修改以下两个,其余默认即可。

# 服务绑定的 IP 地址
bind_address 127.0.0.1

# 服务绑定的端口号
port 1883

设置帐号和密码

https://www.jianshu.com/p/4b545332b495

修改配置文件

# 禁止匿名登录
allow_anonymous false

# 设置帐号密码文件
password_file 帐号密码文件全路径(pwfile.example)



# 设置a cl 文件
acl_file acl文件路径(aclfile.example)

帐号密码文件编写(pwfile.example)

admin:123

编写格式:用户名:密码(可以多行)上图例子就是帐号 admin,密码 123

编写完毕后,需要执行命令 mosquitto_passwd -U 帐号密码文件全路径,对帐号密码进行TLS加密才会生效

cal 文件编写(aclfile.example)

# ACL权限配置,常用语法如下:
# 用户限制:user
# 话题限制:topic [read|write]
# 正则限制:pattern write sensor/%u/data

# This affects access control for clients with no username.
topic read $SYS/#

# This only affects clients with username "roger".
user roger
topic foo/bar

user admin
topic write chat/#
user admin
topic read chat/#

# This affects all clients.
pattern write $SYS/broker/connection/%c/state

编写格式: user 用户名 topic read/write 具体的主题(可使用通配符)

参考

https://www.jianshu.com/p/3d5b487c6860
https://www.jianshu.com/p/4b545332b495
How to Install The Mosquitto MQTT Broker on Windows


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:MQTT 介绍

文章字数:2k

本文作者:Bin

发布时间:2018-09-14, 16:06:22

最后更新:2019-08-06, 00:54:14

原始链接:http://coolview.github.io/2018/09/14/MQTT%20%E4%BB%8B%E7%BB%8D/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录