MQTT协议、mosquitto安装体验

    xiaoxiao2021-03-25  45

    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)。

    转载请注明原文地址: https://ju.6miu.com/read-25221.html

    最新回复(0)