浏览量: 633 次浏览

MQTT协议介绍与应用

2020年2月3日 0 作者 Nie Hen

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

介绍

MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。官网链接

MQTT是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件,以解决当前繁重的资料传输协议,如:HTTP。

MQTT作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
enter description here

特性
  1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
  2. 对负载内容屏蔽的消息传输。
  3. 使用TCP/IP提供网络连接。
  4. 有三种消息发布服务质量:
    “至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。
    “至少一次”,确保消息到达,但消息重复可能会发生。
    “只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。
  5. 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。
  6. 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
    Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
    Testament:遗嘱机制,功能类似于Last Will。
实现方式

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。
其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

  1. Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  2. payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

客户端可以建立与服务器的连接,订阅主题、接受消息、发布消息等
服务器可以是一个应用程序或一台设备。用于接受来自客户端的网络连接,接受发布的消息、转发订阅相关主题的客户端的消息、等

应用

应用首先需要 MQTT服务器,其次需要客户端
然后要客户端跟服务器进行连接
连接之后就可以 订阅主题 收到该主题发布的信息 ,向特定主题发布信息

MQTT服务器安装

EMQ 是国人开发的 也挺好用的,能够支持连接量比较大的服务
mosquitto 是一个轻量级的服务器 比较小,但是学习也足够了

mqtt服务器 EMQ

(开源物联网 MQTT消息服务器)
EMQ提供了一个后端Web控制台,用户可通过 Web 控制台,查看服务器运行状态、统计数据、客户端(Client)、会话(Session)、主题(Topic)、订阅(Subscription)、插件(Plugin)。
链接

EMQ服务器在Windows搭建
官网下载好相应版本 然后解压
使用命令行进入到解压路径下 输入

bin\emqttd.cmd start

enter description here
然后在浏览器中输入 http://127.0.0.1:18083 即可打开 (默认用户名admin 密码 public)
enter description here

在安装好服务器端之后,我们使用MQTT的客户端对MQTT服务器的基本功能进行相关的测试。MQTT客户端有不少,比如mosquito提供了命令行,通过命令行工具可以方便地进行测试;最简单的方式可能还是通过可视化的界面对其进行测试,比如MQTTBox

mqtt服务器 mosquitto

一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式
下载地址 http://mosquitto.org/download/
选择win64 版本
安装好之后再安装目录下 打开命令行输入

mosquitto.exe -v 开始运行

订阅主题 新建命令行窗口 输入命令

mosquitto_sub -v -t topicTest #-t后面是主题名称

发布信息 新建命令行窗口 输入命令

mosquitto_pub -t topicTest -m TEset # -m 后面是消息内容 -t 后面是发往的主题名

当发布信息后 订阅的主题将能够显示出来发布的内容
enter description here
如果关闭最先打开的窗口 则无法发布消息
enter description here

Ubuntu端 安装使用mosquitto

打开mosquitto服务 sudo service mosquitto start
停止服务 sudo service mosquitto stop
本地的mqtt服务 订阅主题 mosquitto_sub -h localhost -t “mqtt” -v
发布消息 mosquitto_pub -h localhost -t “mqtt” -m “Hello2 MQTT”
公网的mqtt服务 如 test.mosquitto.org
订阅主题 mosquitto_sub -h test.mosquitto.org -t “msg_only_from_me” -v
发布消息到这个主题 mosquitto_pub -h test.mosquitto.org -t “msg_only_from_me” -m “My cat is Luna”
局域网内的mqtt服务器 (设备在同一WiFi下也是在同一局域网 Windows查ip命令 ipconfig Ubuntu查ip命令 ifconfig 可以使用ping ip的方法查看是否在同一局域网)
订阅主题 mosquitto_sub -h 192.168.43.211 -t ‘mqtt’ -v
发布消息 mosquitto_pub -h 192.168.43.211 -t ‘mqtt’ -m ‘hellddo’
enter description here
(同一局域网内 通过ip加端口可以访问到 该ip设备的服务)

客户端MQTTBox

Windows下载地址

enter description here
打开之后如果没有创建主题 会有一个create MQTT Client按钮

指定连接相关信息,包括连接名称(可以随意输入)、协议(选择mqtt/tcp)和主机地址(安装在本地,MQTT缺省端口为1883,所以输入127.0.0.1:1883)没有设置用户名密码 可以不填,然后单击“Save”保存

enter description here

下面就可以来测试消息发布和订阅了
enter description here =600*400
enter description here =600*400

相应的服务器端也会发生变化

如果使用的不是本地服务器 在host输入服务器的地址
如果服务器需要用户名密码 就在username输入用户名 password输入密码
enter description here