分享

物联网高层通讯协议揭秘1:MQTT

 心不留意外尘 2016-09-07

http://blog.sina.com.cn/s/blog_a27e792f0102vxb7.html

2015

为了便于读者快速确认本文是否合您口味,将目录列示如下:

MQTT是什么?
MQTT为什么会诞生?
MQTT牛什么牛??
MQTT?背后的大佬??
MQTT怎么玩?——服务器端
MQTT怎么玩?——客户端
MQTT怎么玩?——云部署
MQTT宁有种乎?
在线资源?

什么是MQTT

MQTT 是 Message Queuing Telemetry Transport 的缩写,中文翻译为:消息队列遥测传输。一直没人解释什么是“遥测”,大家也呵呵一下就似懂非懂过去了。实际上遥测就是远程测量的意思,对于路途遥远的(比如卫星上的信息)、环境恶劣的(比如核反应堆的信息),不得不进行远程测量。同样的,我们现在考虑的物联网环境中,大量分布式存在的传感器,也自然以远程测量为宜。所以这个MQTT单从字面意义上就可以看出为物联网量身定做的理念来。

该协议面向M2M和物联网的连接,采用轻量级的“发布和订阅”消息传输机制。一般有三方参与,发布方、订阅方(可以有多个实体)、代理方。三方会有一个共同的主题作为整个通讯的识别基础,然后当发布方将信息发送给代理后,代理方会推送给所有订阅了该主题的客户端。要想感受这种体验,可以想想微信上订阅号的行为方式——公众号就是发布方,他将当天的信息发送给微信的服务器,微信服务器则将该信息推送给所有订阅了该公众号的用户,在这个例子里面,公众号ID就类似于MQTT的订阅主题。

MQTT是怎么诞生的

早在1999年,IBM的Andy Stanford-Clark博士以及Arcom公司ArlenNipper博士就提出了 MQTT 即时通讯协议。在这个协议之前,物联网应用中的主流做法是不断轮询传感器才能得到想要的数据,这种做法耗时、耗电,简单而粗暴。两位博士正是在这种背景下提出了MQTT——一个真正支持推送的物联网传输协议。

MQTT牛什么牛

MQTT协议是为大量“计算能力有限,带宽较低、工作在不可靠网络中”的远程传感器和控制设备而设计的通讯协议,它的特点也因此而非常鲜明:

1、使用发布/订阅消息模式,所以天然支持一对多的发布形式,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量“至多一次”——可能丢失但不敏感;“至少一次”——确保消息到达但可能重复;“只有一次”——确保消息到达一次,且不重复;
5、小传输,小开销(头部固定为 2 字节),协议交换最小化,降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

和CoAP等其他物联网协议相比,MQTT的最大优势在于其公共订阅消息队列机制以及多对多广播能力。有了指向MQTT代理端的长效TCP连接的支持,以有限带宽进行消息收发变得简单而轻松。

MQTT?得到了谁的支持

结构化信息标准促进组织OASIS在2013年就宣布将MQTT作为新兴的物联网消息传递协议的首选标准。同时,该标准出自IBM,一堆的盟友已经加入到支持的行列。下文中可以看到服务器侧的产品已经非常丰富,这些信息足以显示出其受欢迎的程度。

MQTT怎么玩?——服务器端

先来介绍一个“懒汉”方案。如果不想自己搭建服务器,可以采用Eclipse为了支持MQTT发展而设立的公共MQTT服务器:test.mosquitto.org。访问十分方便,对设计物联网应用很有帮助。

其他可以自己搭建的服务端,或者叫代理(Broker),有很多产品,参见下图。这些服务端有重有轻,有些是开源的,有些是企业的收费产品。

MQTT服务器/代理


下面这一节讲述了如何利用Mosquitto软件来构造MQTT通讯实验。内容参考了?CSDN上署名为xukai871105的博文《MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用》。

Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。一个完整的MQTT示例包括一个代理器,一个发布者和一个订阅者。测试分为以下几个步骤:

【1】启动服务mosquitto。

【2】订阅者通过mosquitto_sub订阅指定主题的消息。

【3】发布者通过mosquitto_pub发布指定主题的消息。

【4】代理服务器把该主题的消息推送到订阅者。

MQTT原理与操作步骤

如果不想止步于简单的理解,而欲亲自实验全过程,可以通过阅读前文提到的原文链接进行实践操作。

MQTT怎么玩?——客户端

Eclipse有一个开源项目叫Paho,实现MQTT协议客户端。已经实现多种语言的客户端封装,包括对嵌入式的支持,还有一些工具(utilities),以及完善的文档,所以只要按照其实例开发即可。

网上有个非常不错的Demo——《基于MQTT的WiFi物联网血压计设计》,使用的是Paho的MQTT库和Python语言。主要场景如下:“病人一旦启动血压测量,数据由主机的mqtt-paho客户端发布至test.mosquitto.org服务器。只要是订阅了相应病人血压主题的医生,都可以及时掌握病人的血压变化情况。例如,在自己的Android手机上像QQ、微信消息那样及时显示出病人当前的血压情况,甚至可以实现远程诊断。”作者用华科电子的HKB-08B血压模块做示例,该模块支持USB串口(cp2102),可以直接连接在树莓派上。原文附有完整的实例代码和环境说明。

MQTT怎么玩——?云部署

上面介绍的服务器和客户端可以满足物联网极客开发的需要和企业中等规模部署的需求。如果要构建大型的、商用化的云部署方案,则还需要进一步考虑组网、设备管理、账号管理、数据分析等系统性问题。?

AbleCloud宣称“作为国内首家智能硬件PaaS平台,提出了PaaS+MQTT方案,即使用MQTT作为设备接入协议,由PaaS平台提供服务的物联网整体解决方案。设备端使用MQTT客户端接入云平台,设备可以在特定的主题上发布消息,也可以通过订阅特定的主题以接收其他设备或者用户发布的消息,从而实现M2M,M2P,P2M的通信。”

AbleCloud的云架构

根据AbleCloud的介绍,上图中,“MQTT-SN 用于非IP 设备。云网关gateway负责设备的接入,协议适配,这样设备就可以和使用不同传输协议的设备或者终端进行通信,如果要支持海量设备的接入,gateway集群是必须的。设备管理负责设备接入认证,设备与用户绑定,操作授权等相关的功能。账号管理负责用户账号安全认证,授权认证等相关的功能,同时也支持第三方账号安全认证。云服务Cloud Service负责设备业务逻辑。不同的设备厂商都有一套自己的业务逻辑和服务,这种服务可以很容易的运行在云端的docker容器中,使用基于容器的微服务使得应用程序能够更快地进行创建,并且更易于维护,同时又能够得到更高的质量。而数据的存储和分析使用云平台提供的通用的存储服务和大数据分析引擎。用户只要注册账号,绑定设备,就可以通过手机APP,微信或者web等客户端轻松实现与设备的交互。”

MQTT宁有种乎

好了,说了一堆好话,也该说说缺点了。实际上也不能说是缺点,只能说每个协议都有适用的场景,而一些不适用的地方,这里要稍作提醒。

1. MQTT始终存在的连接,限制了设备进入休眠状态的整体时长。如果相关设备在运行中多数处于休眠状态,我们不妨优先选择另一种MQTT协议——MQTT-S,其利用UDP取代原始协议中的TCP。

2. MQTT缺少基础协议层面的加密机制。MQTT被设计为一种轻量化协议,而内置加密的方式会给传输连接增加很大负担。虽然我们也能够在应用程序层级添加定制化安全机制,但这可能需要进行大量的调整工作。

在线资源

MQTT官方首页:http://www./

协议文本:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html?

客户端/代理/服务器开源代码:http:///software

MQTT协议及拓展?:http://blog./archives/102

MQTT 调试工具一枚:http://bashell.sinaapp.com/archives/mqtt-debugger.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多