物联网MQTT协议分析和开源Mosquitto部署验证

在《物联网核心协议消息推送技术演进》一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信、Ajax轮询、Websocket、MQTT、CoAP等,其中MQTT协议为IBM制定并力推,其具有开放、简单、轻量级以及易于实现的特点使得其即便在资源受限的环境中也能得到很好的使用,比如运行在资源紧缺型的嵌入式系统中或网络带宽非常昂贵的环境中,除此之外,它也被广泛用于遥感勘测、智能家居、能源监测和医疗应用程序等各个领域,是物联网的重要组成部分,将来可能会成为物联网的事实标准。

本篇文章将帮助读者认识MQTT协议以及在Linux环境下部署MQTT的开源实现Mosquitto进行体验验证,在后续文章中将展开对其源码框架的分析,为构建物联网平台做好铺垫。

一、MQTT协议分析

1.1、MQTT协议简介

MQTT(MessageQueueing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是由IBM公司推出的一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。由于其开放、简单和易于实现所以能够应用在资源受限的环境中,对于M2M和物联网应用程序来说是一个相当不错的选择。

1.2、发布者/订阅者

MQTT采用代理的发布/订阅模式实现了发布者和订阅者的解耦(decouple),因此,在MQTT协议中有三种角色:代理服务器、发布者客户端以及订阅者客户端,其中发布者和订阅者互不干扰,也就是说发布者和订阅者互不知道对方的存在,它们只知道代理服务器,代理服务器负责将来自发布者的消息进行存储处理并将这些消息发送到正确的订阅者中去。这种解耦体现在以下3个方面上:

·空间解耦:发布者和订阅者不必知道对方的存在,例如对方的IP地址或者端口;

·时间解耦:发布者和订阅者不必同时建立连接;

·同步解耦:发布者和订阅者在发布消息或接收消息的时候不需要同步;

1.3、MQTT的消息类型

MQTT的三种角色通过14种不同的消息类型进行交互:

1.CONNECT控制报文用于客户端请求与服务器建立连接,应用层的连接而不是TCP/IP连接,CONNECT控制报文的发送在TCP/IP建立连接后;

2.CONNACK控制报文用于服务器向请求连接的客户端回发连接确认;

3.PUBLISH控制报文用于发布指定主题名的应用信息;

4.PUBACK/PUBREC/PUBREL/PUBCOMP控制报文用于针对不同服务质量的应用信息的回应;

5.SUBSCRIBE控制报文用于订阅者向服务器发送一个主题过滤器列表,用于表示客户端想要订阅的主题;

6.SUBACK控制报文用于SUBSCRIBE控制报文的响应;

7.UNSUBSCRIBE控制报文用于向服务器发送一个主题过滤器列表,用于表示客户端想要取消订阅的主题;

8.UNSUBACK控制报文用于UNSUBSCRIBE控制报文的响应;

9.PINGREQ/PINGRESP控制报文作为客户端和服务器间的心跳包;

10.DISCONNECT控制报文用于客户端在断开前告诉服务器其将断开连接;

1.4、主题(topic)

使用主题是服务器为每一个客户端管理应用信息所采用的一种方式,一个主题名可以由多个主题层级(topic level)组成,每一层通过’/’斜杠分隔开,当客户端指定的主题过滤器包含通配符时,即客户端想一次订阅多个具有类似结构的主题时,主题层级分隔符就很有用了。

主题通配符只可用在主题过滤器中,在发布应用消息时的主题名不允许包含通配符,主题通配符有两种:

单层通配符:’+’,它会匹配某一个主题层级中的所有主题;

多层通配符:’#’,它会匹配多个主题主题层级的主题;

例如:如果客户端订阅时的主题过滤器为”grade/subject/math/#”,它会收到使用下列主题名发布的消息:

     “grade/subject/math”

    “grade/subject/math/student1”

    “grade/subject/math/student1/lastterm”

1.5、服务质量等级(QosLevels)

MQTT提供三种Qos的消息传递质量:

a.最多一次(Atmost once delivery):QoS=0,协议对此等级应用信息不要求回应确认,也没有重发机制,这类信息可能会发生消息丢失或重复,取决于TCP/IP提供的尽最大努力交互的数据包服务。

b.最少一次(Atleast once delivery):QoS=1,确保信息到达,但消息重复可能发生,发送者如果在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送,且控制报文中DUP标志位置1。

c.仅仅一次(Exactlyonce delivery):QoS=2,最高级别的服务质量,消息丢失和重复都是不可接受的。

1.6、支持MQTT协议的服务器和客户端

当前流行的开源代理服务器(MQTT Broker)的实现有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca等,MQTT客户端也有不同操作系统和编程语言下的实现,流行的客户端库(MQTT ClientLibraries)有:Eclipse Paho(支持C,C++, JavaJavaScriptPython, Go, C#), M2MQTT(C#), Fusesource MQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等,通过以上库而开发出的MQTT客户端应用程序有:mosquitto_pub/mosquitto_sub(可运行于Linux, Windows, MacOSX操作系统), HiveMQWebsocket Client(Web browser), MyMQTT(Android), MQTTLens(Google Chrome)等等。

 

二、Mosquitto部署验证

2.1、Ubuntu下安装Mosquitto

1.源码包下载:http://mosquitto.org/files/source/

版本:mosquitto-1.4.tar.gz

解压:tar -zxvf mosquitto-1.4.tar.gz

进入目录:cd mosquitto-1.4

2.编译安装

打开配置文件,去掉暂且不需要的功能:

vi config.mk

如:WITH_TLS,WITH_TLS_PSK, WITH_SRV, WITH_WEBSOCKETS, WITH_SOCKS, WITH_UUID等

保存退出:wq

安装mosquitto

make

make install

2.2、启动mosquitto服务器

mosquitto默认以mosquitto用户启动,所以首先创建mosquitto用户:

adduser mosquitto

启动代理服务器:mosquitto -c/etc/mosquitto/mosquitto.conf.example

在启动服务器过程中有可能遇到以下错误:找不到libmosquitto.so.1文件,解决方法是添加链接库路径:

vi/etc/ld.so.conf.d/liblocal.conf

/usr/local/lib64

/usr/local/lib

退出文件后刷新:ldconfig

重新执行:mosquitto -c /etc/mosquitto/mosquitto.conf.example

2.3、启动订阅者客户端mosquitto_sub,订阅test主题

mosquitto_sub客户端应用程序位于/mosquitto-1.4/client目录下,执行./mosquitto_sub-t test, -t表示主题过滤器属性,后面带指定的主题过滤器。

2.4、启动发布者客户端mosquitto_pub,并且多次发布主题信息

./mosquitto_pub-t test -l

其中-t表示发布的主题名,主题名中不允许包含通配符,-l是指通过标准输入的方式输入将要发布的应用信息,更多的属性可通过:./mosquiito_pub --help了解,也可通过官网了解:

http://mosquitto.org/man/mosquitto_pub-1.html

发布者发布应用信息:

2.5、发布者通过键入”Ctrl+D”向服务器发送DISCONNECT控制报文,然后正常退出

如果通过”Ctrl+C”终止客户端程序(异常网络断开),服务器将提示:Scoket error

本篇文章初步讲述了MQTT协议及以其中的一种实现为例进行部署和体验,协议的详细具体内容如控制报文格式等,读者可自行到官网下载文档查阅,也可以关注嵌入式企鹅圈来获取共享资源。

时间: 06-03

物联网MQTT协议分析和开源Mosquitto部署验证的相关文章

MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]--相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]--在RESTful架构的物联网

物联网协议测评平台——吊兰使用指南-MQTT协议 Python Paho

在忙了一个周末之后,还是小有成果的.发布了一个简单的物联网平台: http://mqtt.phodal.com,简单地写一下使用指南. CoAP协议 使用Libcoap的话可以用 <code style="box-sizing: border-box; font-family: Consolas, Menlo, Monaco, 'Courier New', monospace; font-size: 1em; padding: 0px; color: inherit; border-top

海鑫智圣:物联网漫谈之MQTT协议

什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端应用系统之间通信的问题. 为什么需要MQTT(或类似)协议 随着智能硬件和移动互联网技术的快速发展,传统的互联网协议越来越难以满足物联网的需要,体现在:移动网络代价昂贵,带宽低.可靠性差:在嵌入设备中运行,处理器和内存资源有限:海量在线设备产生庞大数据,给云端带来很大的网络开销和处理压力. MQTT

如何应用MQTT协议到物联网中(IOT)

传统的web应用可能不需要可靠的消息服务,但当前以物联网为代表的多样终端非常需要一个消息协议来提供服务. 建筑模式来来往往,如果说有一个永恒不变的事情,那就是需要一个可靠的消息传输. 消息队列也许在客户端/服务端世界有过它的盛世高峰,它处理大型机之间的信息交流并与我们的财务网络连接,但是它从来没有离开我们---尽管事实上直接访问api是大多数当前开发的主要特点. 直接访问api在大多数我们的web系统中工作良好,在有限的服务器资源及进程通信的后端.然而当我们转移到微型服务架构以及云---特别是我

物联网传输协议MQTT

MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景.目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统.在12月18日举行的OIOT开放物联网大会上,IBM的徐刚带来了<IBM MQTT:国际标准化物联网推荐协议>的主题分享,本文根据其演讲内容整理而成. M

经典的开源协议分析工具:Wireshark.

2. TCP/IP协议经典书是:W.Richard Stevens 著<TCP/IP详解>三卷书,卷1是协议,卷2是实现,卷3是TCP事务协议等.还有官方的协议文档:RFC当然也可以在网上下载电子书.经典的开源协议分析工具:Wireshark.简单的开源TCP/IP协议栈:LwIP,或者Linux 1.0里包含的协议栈,当然也可以看看FreeBSD的TCP/IP协议栈 704ex 286wo 673av 604ek 659yl 363lh 957mk 564ge 854zm 932ox 711

使用wireshark分析MQTT协议

网络上搜索到两种用wireshark工具分析MQTT协议的方法,都是使用wireshark插件,一种是Wireshark Generic Dissector:另一种是使用lua脚本插件. 一.Wireshark Generic Dissector: 1.下载generic.so,注意版本要严格匹配,放到wireshark的插件目录(Global Plugins folder or Personal Plugins folder,可以通过wireshark的 Help / About Wiresh

基于MQTT协议谈谈物联网开发

1.MQTT协议: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于TCP/IP实现发布/订阅模式的应用层协议,其主要特点有: (1)基于发布/订阅模式,应用程序解耦; (2)基于TCP/IP建立网络连接; (3)协议交换最小化,降低网络流量; 2.基于MQTT协议应用: (1)简单的发布订阅应用: (2)消息系统推送应用: (3)阿里云物联网应用: 由于知识能力受限,无法一一列举基于MQTT协议的各种应用,下面就以上述消息推送

转战物联网&#183;基础篇05-通俗理解MQTT协议的实现原理和异步方式

??网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似不标准的解释,但是更容易理解MQTT的内涵,对MQTT十分精通者请忽略此文. ??在物联网项目中,经常出现的要求是"有限环境".什么意思呢,通俗说就是网络可能不太稳定,带宽也可能很小,网速也比较低,硬件MCU性能也很低,要求在这种情况下也能可靠联网传输信息.看到这里大家就会想到我前面提到的