1. MQTT协议简介
物联网(Internet of Things,IoT)最近曝光率越来越高。虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请求/回答(Request/Response)模式不再合适,取而代之的是发布/订阅(Publish/Subscribe)模式。这就是轻量级、可扩展的MQTT(Message Queuing Telemetry Transport)可以施展拳脚的舞台
-
基于TCP/IP协议
-
轻量级的消息订阅和发布(publish/subscribe)协议
- 主要用于 物联网 — IoT(internet of things) 或 M2M(Machine to Machine) communication,机器端到端通信,比如传感器之间的数据通讯
因为是M2M,需要考虑:
(1)Machine,或者叫设备,比如温度传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等
(2)M2M可能是无线连接,网络不稳定,带宽也比较小
2. 使用场景
MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出的,如今已经成为OASIS规范。由于规范很简单,非常适合需要低功耗和网络带宽有限的IoT场景,比如:
- 遥感数据
- 汽车
- 智能家居
- 智慧城市
- 医疗医护
MQTT协议的架构,用一个示例说明。比如有1个温度传感器(1个Machine),2个小的显示屏(2个Machine),显示屏要显示温度传感器的温度值。
显示器需要先通过MQTT协议subscribe(订阅)一个比如叫 temperature
的topic(主题):
当温度传感器publish(发布)温度数据,显示器就可以收到了:
协议里还有2个主要的角色:
- client,客户端
- broker,服务器端
它们是通过TCP/IP协议连接的。
因为MQTT是协议,所以不能拿来直接用的,就好比HTTP协议一样。需要找实现这个协议的库或者服务器来运行。
3. 基于 MQTT协议的server端
emqtt
http://docs.emqtt.cn/zh_CN/latest/getstarted.html#c1000k
mosquitto
http://mosquitto.org/
http://blog.csdn.net/xukai871105/article/details/39252653
4. 基于 MQTT协议的client端
5. MQTT 功能使用
协议详解
- 协议规范:MQTT V3.1 Protocol Specification (http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html)
-
QoS
QoS在MQTT中有(摘自MQ 遥测传输 (MQTT) V3.1 协议规范):
- “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
- “至少一次”,确保消息到达,但消息重复可能会发生。
- “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
-
接收离线消息
接收离线消息的客户端
- 客户端订阅设置QoS=1
- 客户端连接属性
clean: false
,作用是断开连接重连的时候服务器端帮助恢复session,不需要再次订阅
收到消息的顺序是乱的,为什么会这样,其实很好理解,为了小型受限设备以及网络不稳定的情况,消息是不好保证顺序的。
解决办法是发送的消息带时间戳,接收后再做排序。
另外,担心客户端没有做client.end()
而非正常退出,那么再次连接是否能恢复session,测试了一下,注释client.end()
,没有问题,正常收到多条离线消息。
ssh连接
- 协议实现
- 问题:server怎么处理终端的重复订阅?
参考链接:http://dataguild.org/?p=6817