一、这是个什么玩意
一看名字这玩意首先是个协议,就像之前说过的其他协议一样。协议主要的目的就是为了保证双方之间能够正常的沟通。该协议属于应用层协议(关于网络各个分层及对应的协议参考下图,但本篇不做详细的介绍)。以下都是个人的拙见,求亲喷。什么是应用层协议呢,从名字来看是针对具体应用的,而和应用强相关的就是载荷数据的组织,应用层协议都是为了解决特定问题而产生的一套方案,这些可以简单称之为报文格式。除了这点外,还有重要的一点就是服务端的处理逻辑,这两点也是应用层协议和传输层协议的主要差别。传输层协议就不关注数据怎么来的和怎么个传输,只负责传输这一件事。从这两个角度出发来了解下MQTT。
MQTT 是 Message Queuing Telemetry Transport 的缩写,中文翻译为:消息队列遥测传输。一直没人解释什么是“遥测”,大家也呵呵一下就似懂非懂过去了。实际上遥测就是远程测量的意思,对于路途遥远的(比如卫星上的信息)、环境恶劣的(比如核反应堆的信息),不得不进行远程测量。同样的,我们现在考虑的物联网环境中,大量分布式存在的传感器,也自然以远程测量为宜。所以这个MQTT单从字面意义上就可以看出为物联网量身定做的理念来。(上面参考于http://blog.sina.com.cn/s/blog_a27e792f0102vxb7.html,再次感谢)
先说下MQTT协议的背景知识,了解了协议的产生背景和应用场景后可以帮助大家更方便的学习掌握。
MQTT,是目前物联网的主要协议,还有个COAP(后续再说),目前很多大厂的服务端平台都支持MQTT。1999年,IBM的Andy Stanford-Clark博士和Arcom公司ArlenNipper博士提出的MQTT 即时通讯协议。在没有MQTT协议之前,物联网的应用中的大多做法是轮询传感器来获取想要的数据,这种做法有个缺点就是耗电,响应不及时等。基于这种背景下两位博士提出了MQTT——一个支持订阅和推送的物联网传输协议。因此MQTT协议主要针对的是一些“小”设备,即计算能力有限,所处环境不确定等,就像比如一些远程传感器或控制设备等等。
本篇只是大体介绍MQTT,具体的协议还得看MQTT的协议文档,这个从百度搜下很多的。
MQTT协议的所有报文:
名字
|
值
|
流向
|
描述
|
CONNECT
|
1
|
C->S
|
客户端请求与服务端建立连接
|
CONNACK
|
2
|
S->C
|
服务端确认连接建立
|
PUBLISH
|
3
|
C
óS
|
发布消息
|
PUBACK
|
4
|
C
óS
|
收到发布消息确认
|
PUBREC
|
5
|
C
óS
|
发布消息收到
|
PUBREL
|
6
|
C
óS
|
发布消息释放
|
PUBCOMP
|
7
|
C
óS
|
发布消息完成
|
SUBSCRIBE
|
8
|
C->S
|
订阅请求
|
SUBACK
|
9
|
S->C
|
订阅确认
|
UNSUBSCRIBE
|
10
|
C->S
|
取消订阅
|
UNSUBACK
|
11
|
S->C
|
取消订阅确认
|
PING
|
12
|
C->S
|
客户端发送
PING(
连接保活
)
命令
|
PINGRSP
|
13
|
S->C
|
PING
命令回复
|
DISCONNECT
|
14
|
C->S
|
断开连接
|
MQTT协议主要点:
1、该协议需要两个角色:客户端和服务端
2、MQTT是基于TCP长连接,首先是先跟MQTT服务器建立TCP连接,然后发送登录请求,要保持长连接,还要定时发心跳包跟服务保持连接。
3、MQTT协议中有三种身份:发布者(Publish)
、代理(Broker)
(服务器)、订阅者(Subscribe)
。使用发布/订阅消息模式,继而支持一对多的发布形式。如下图所示:
发布者和订阅者可以看做是客户端,代理看做是服务端,消息发布者
可以同时是订阅者
。
订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
主题名(Topic Name)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
主题筛选器(Topic Filter)
一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
负载(Payload)
消息订阅者所具体接收的内容
该部分参考于https://www.cnblogs.com/jiangzhaowei/p/7794640.html,再次感谢。
4、MQTT传输的消息最小化,协议头部只有2字节,减小网络流量。
5、对传输消息有三种服务质量(QoS):
最多一次
,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1至多一次
,这一级别会确保消息到达,但消息可能会重复。即:>=1只有一次
,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别6、MQTT除了基于TCP/IP外,还可以基于TLS协议来保证安全性。TLS协议属于会话层的协议(在数据或增加逻辑来保证安全),比TCP传输层高一层(只负责传输),TLS保证了数据的完整性(哈希)和安全性(加密)。
7、主题层级分隔符/,多层通配符#,单层通配符+等等,这些概念了解下,具体参考协议文档。
8、和CoAP等其他物联网协议相比,MQTT的最大优势在于其公共订阅消息队列机制以及多对多广播能力。有了指向MQTT代理端的长效TCP连接的支持,以有限带宽进行消息收发变得简单而轻松。
总之,MQTT是一种基于发布/订阅
(publish/subscribe
)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT缺点或称为不适用的地方:
1.MQTT基于长连接,影响了设备进入休眠。如果相关设备在运行中多数处于休眠状态,也可以选择另一种MQTT协议
MQTT-S,其利用UDP取代原始协议中的TCP。 MQTT-S 可用于非 TCP/IP 网络,本篇暂不介绍,可参看具体协议了解。
2. MQTT缺少基础协议层面的加密机制。MQTT被设计为一种轻量化协议,而内置加密的方式会给传输连接增加很大负担。虽然我们也能够在应用程序层级添加定制化安全机制,但这可能需要进行大量的调整工作。
二、有毛用啊
之前也说过了,协议就是为了双方两端之间能够正常通信,彼此之间能够听懂对方说的话。只不过该协议和之前介绍过的I2C和SPI有点差别,那两种协议之间的两端大都是芯片或模块。而MQTT属于应用层协议,面对具体的应用场景了,它双方的两端就会抽象更高一层,这两端的角色还有点差别,可以简单理解为客户端和服务端,客户端可以是比如一个具体一定功能并可以独立运作的设备,也可以是一个在电脑上运行的客户端软件等等,服务端是客户端能够连接成功的云端,但是不管怎么样,这两端都得支持MQTT协议(废话)。
三,怎么用啊
MQTT客户端:
通过上面的介绍,其实已经可以知道怎么用了。先实现协议的两端都支持MQTT协议。服务端这边本篇不介绍(主要也不懂),我是这么调试学习的,
1、从官网下载MQTT的代码,在本地移植到VS2010上(下载针对嵌入式的,我们最终是为了移植到单片机上,https://github.com/eclipse/paho.mqtt.embedded-c)
2、下载mqtt客户端模拟软件mqtt.fx或者paho(https://blog.csdn.net/nicholaszao/article/details/79211965 mqttfx安装使用)
3、服务端采用m2m.eclipse.org这地址
上面在正常通信下,在mqttfx客户端订阅主题,然后vs2010编译生产客户端也订阅相同主题,然后发布消息,看下mqttfx能够收到,或者mqttfx端发送消息,看下vs2010端能不能正常收到,这些都是在验证MQTT协议最重要的特性,发布和订阅。上面验证没问题的话,然后将mqtt源码再移植到具体的单片机上。推荐:为了更好的学习,可以用Wireshark。
我打算这么测下,在mqttfx客户端和vs2010编译客户端都订阅ledtest主题,然后再mqttfx客户端发布ledtest消息,看下这两个客户端是否都能收到该订阅消息。
第一步移植就不多说了,主要是编译问题,然后自己写个测试程序跑起来。
第二步主要是使用mqttfx软件,也很简单,如下图,配置好服务端地址和端口,然后点击connect按钮,就可以正常连接。
然后点击1处的Subscribe按钮,在下面输入ledtest,然后点击2处的Subscribe按钮,这样就在左侧窗口这里输出本客户端订阅的消息。
然后把VS2010的自己写的测试程序也运行,该测试程序也订阅了ledtest这个主题,并只处理携带的参数为on和off的情况。运行后如下图:
然后再点击mqttfx客户端1处的Publish按钮,在下图位置输入ledtest和on/off,右侧选择QoS0,最后分别点击2处的Publish按钮
然后观察自编译客户端和mqttfx客户端
上图表明收到了4次的订阅消息,2次on和2次off
上图说明mqttfx客户端也收到了4次订阅的消息,最下面的框显示具体的参数值。
这样的话协议能够跑通,关于MQTT其他特性的测试,比如QoS服务质量的特性测试,大家可以再试下。
下面是wireShark的抓图数据
其实现在国内已经在独立自主开发国产的物联网操作系统了,真正的国产,不是基于Linux克隆修改的,目前系统名字叫做HelloX,这是牛人的博客(https://blog.csdn.net/hellochina15/article/details/52838600),我也是通过该博客了解到HelloX的,希望大家联合起来支持国产操作系统。
MQTT服务端(或者叫代理(Broker)(简单说下,我也不懂)):
1、mosquitto这个软件是用了搭建mqtt服务端的服务(https://blog.csdn.net/xukai871105/article/details/39252653)
2、如果不想自己搭建服务器,除了上面说的那个地址,也可以采用Eclipse为了支持MQTT发展而设立的公共MQTT服务器:test.mosquitto.org