MQTT(MessageQueuing Telemetry Transport,消息队列遥测传输)是由IBM开发的一个即时通讯协议,是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。而Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。它可以移植到手机、小型嵌入式设备中实现设备之间的连接、消息发布和订阅等功能。MQTT协议将通信终端之间的关系统一到服务程序中进行管理,可极大减轻客户端的开发和维护工作。在物联网时代,受到了广泛的欢迎,甚至有可能成为未来物联网的重要组成部分。
关于MQTT协议的更详细的介绍,可参考官网:http://mqtt.org/
一、出版、订阅模式基本原理
出版、订阅模式定义了如何向一个节点(topic)发布和订阅消息,主题可以认为是消息传输的中介,发布者(publisher)发布消息到主题,订阅者(subscriber)从主题订阅消息。这种模式是消息发布这和消息订阅者保持独立,两者不需要打交道即可保证消息的传输。
1、传统的TCP协议
在TCP协议中,如果A要发送 消息给B,只需要知道对方的IP地址和端口号即可,每一个TCP连接都必须至少包含以下5个元素:
<源IP :源端口 :目的IP :目的端口 :协议(protocol)>
在一条连接建立之后,需要保持一段时间,以便下次传输使用。实际开发中,终端的数目可能是多个,它们也可能互相之间建立连接并维持一段时间的通信。
多对多通信的例子
在多对多终端通信时,每个终端所需维持的通信数量可能非常庞大,尤其对于一些小型嵌入式设备,可能需要创建出多个线程或者进程来处理各种连接事务,容易出现各种状况,非常不利于开发和维护,性能可能也得不到满足。
2、出版、订阅模式
出版、订阅模式可以解决上述问题。通过增加一个中间层,用来维护这种多对多的关系,这个中间层通常称之为服务器。通过增加中间层服务器,每个客户端只需维持自己同客户端的连接即可,客户端之间的关系交由中间层服务器来管理和维护,这种设计模式将复杂的客户端联系从客户端中剥离出来,非常方客户端的开发和维护。
mosquitto就是一种实现该方式的程序,在内部,将客户端之间的关系通过一颗订阅树来维持。
二、mosquitto安装体验
环境:Ubuntu
1、下载源代码:
可以从官网:http://mosquitto.org/download/ 下载mosquitto-1.4.tar.gz
2、解压、编译、配置
解压缩:tar -xzvf mosquitto-1.4.tar.gz
cd mosquitto-1.4
修改 config.mk 文件,去掉ssl的配置(加个#注释掉):
#WITH_TLS:=yes
#WITH_TLS_PSK:=yes
make
make install 安装
PS:
在make过程中可能提示缺乏uuid-dev,启用lib-uuid支持,表明要支持为每个连接的客户端生成唯一的uuid,解决方法:
(1)sudo apt-get install uuid-dev , 再make
(2)如果使用的Ubuntu比较老,很可能安装不成功,先去官网服务器下载libuuid-1.0.3.tar.gz源码:http://nchc.dl.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz
解压:tar -xavf libuuid-1.0.3.tar.gz , 配置:./configure , make ,make install ,之后再编译安装mosquitto-1.4即可成功。
3、体验
一个完整的MQTT示例包括一个代理器,一个发布者和一个订阅者。测试分为以下几个步骤:
【1】启动服务mosquitto。 【2】订阅者通过mosquitto_sub订阅指定主题的消息。 【3】发布者通过mosquitto_pub发布指定主题的消息。 【4】代理服务器把该主题的消息推送到订阅者。在linux中打开三个控制台,分别代表代理服务器、发布者和订阅者。
(1)第一个控制台:启动代理服务器:
mosquitto -v (-v)--打印调试信息
(2)第二个控制台:订阅主题(-t 名为sensor的主题)
mosquitto_sub -v -t sensor mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
此处有个运行错误:找不到libmosquitto.so.1文件。这是由于目录默认是生成到/usr/local/lib目录了,应该拷贝到/usr/lib目录,建立连接文件:
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
(3)第三个控制台:发布主题(名为sensor)
mosquitto_pub -t sensor -m 12 (-m 指定消息内容)
此时,订阅者(第二个控制台)即可收到消息:
而代理服务器控制台中会出现——连接、消息发布和心跳等调试信息。通过代理服务器的调试输出可以对MQTT协议的相关过程有所了解。
在本例中,发布者、代理和订阅者均为localhsot,但是在实际的情况下三种并不是同一个设备,在mosquitto中可通过-h(--host)设置主机名称(hostname)。