> 文章列表 > 【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

目录

    • MQTT协议简介
    • 发布/订阅模式简介
    • MQTT协议与发布/订阅模式的联系
    • 基于Mosquitto实现的MQTT服务器
    • Mosquitto安装

MQTT协议简介

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,其最初由IBM开发,现已成为OASIS标准。MQTT协议常用于物联网领域,特别是在传输低带宽、高延迟、不稳定网络条件下的数据,例如传感器数据和遥测数据等。
MQTT协议的优点:

轻量级:MQTT协议的设计十分轻量级,其开销比较小,传输的数据包大小也比较小,这使得MQTT协议非常适合在低带宽、高延迟的网络环境下使用。

可靠性:MQTT协议支持三种服务质量等级(QoS),包括最多一次传输、至少一次传输、恰好一次传输,可以根据应用场景选择不同的服务质量等级来保证数据的可靠性。

灵活性:MQTT协议支持发布/订阅模式,可以让订阅者只订阅自己感兴趣的主题,这种灵活性使得MQTT协议非常适合在大量分布式设备的场景下使用。

易于实现和集成:MQTT协议的规范十分简单、清晰,易于实现和集成到各种不同的应用和系统中。

安全性:MQTT协议可以通过TLS/SSL协议进行加密传输,保证数据传输的安全性。
总之,MQTT协议是一种非常适合在物联网领域使用的协议,其优点在于轻量级、可靠性强、灵活性高、易于实现和安全性好等方面。

发布/订阅模式简介

发布/订阅(Publish/Subscribe)模式是一种消息传递模式,也叫做观察者模式。在这种模式中,消息发送者(发布者)将消息发送到一个或多个主题(Topic)中,而消息接收者(订阅者)则订阅一个或多个主题,接收这些主题中的消息。发布者和订阅者之间没有直接的联系,而是通过主题中介来进行通信。
发布/订阅模式可以用于解耦消息的发送和接收,使得系统中的不同模块之间可以进行松耦合的通信,从而提高系统的可扩展性和灵活性。例如,一个传感器网络中的传感器可以将采集到的数据发布到一个特定的主题中,而数据处理模块则可以订阅该主题,接收和处理这些数据。

发布/订阅模式适用于以下场景:

分布式系统:当系统中的不同模块分布在不同的节点中时,发布/订阅模式可以方便地实现模块之间的通信,而不需要关注节点间的具体实现方式。

实时数据处理:当需要处理高频率、实时产生的数据时,发布/订阅模式可以使得数据的发送和接收之间的延迟最小化,提高数据处理的效率。

事件驱动系统:当需要将事件和事件处理程序分离开来时,发布/订阅模式可以方便地实现事件的发布和订阅,同时也避免了事件处理程序之间的依赖。
总之,发布/订阅模式是一种非常适合解耦消息发送和接收的通信模式,可以提高系统的可扩展性和灵活性,适用于分布式系统、实时数据处理和事件驱动系统等场景。

MQTT协议与发布/订阅模式的联系

MQTT协议是一种基于发布/订阅(Publish/Subscribe)模式的通信协议。在MQTT中,客户端通过订阅主题(Topic)来接收消息,而通过发布消息到某个主题中来发送消息。
MQTT协议支持多个客户端同时订阅同一个主题,当有消息发布到该主题中时,所有订阅该主题的客户端都会收到该消息。这种发布/订阅的通信方式能够实现消息的异步传递,而且还能够支持消息的过滤和分发,从而可以实现更加灵活和高效的通信方式。
因此,MQTT协议和发布/订阅模式是密切相关的。MQTT协议的实现基于发布/订阅模式,而且MQTT协议也是发布/订阅模式的一种实现方式。MQTT协议的应用场景和发布/订阅模式的应用场景也非常相似,都适用于分布式系统、实时数据处理和事件驱动系统等场景。

基于Mosquitto实现的MQTT服务器

Mosquitto是一种轻量级的MQTT消息代理和服务器,由Eclipse Foundation开发和维护。Mosquitto支持MQTT协议3.1和3.1.1版本,可以在各种平台和系统上运行,包括Linux、Windows、macOS等。Mosquitto提供了基本的MQTT代理功能,如发布/订阅模式的消息传递、QoS消息传递、保持活动状态等,同时还提供了一些高级功能,如SSL/TLS加密、ACL访问控制、WebSockets支持等。
Mosquitto具有以下特点:

轻量级:Mosquitto是一个轻量级的MQTT代理和服务器,不会占用太多资源。

易于安装和配置:Mosquitto的安装和配置非常简单,可以快速部署和使用。

易于使用:Mosquitto提供了易于使用的命令行工具和MQTT库,方便用户进行MQTT通信测试和调试。

可扩展性:Mosquitto支持各种MQTT客户端和代理的集成,具有良好的可扩展性。

安全性:Mosquitto支持SSL/TLS加密和ACL访问控制,可以提高MQTT通信的安全性。
总之,Mosquitto是一个轻量级、易于使用、具有良好可扩展性和安全性的MQTT消息代理和服务器,适用于各种MQTT应用场景,如物联网、实时数据处理和事件驱动系统等。

【MQTT协议】使用c++实现mqtt协议(Mosquitto源码编译)

Mosquitto安装

1.选择指定版本,在官网下载安装包并解压,链接:
[https://codeload.github.com/eclipse/mosquitto/zip/refs/tags/v2[git地址]
2.安装必要依赖库(这里是centos环境)openssl

yum install openssl openssl-devel

3.检测config.mk文件,为编译配置文件,默认自带cjson附加包。
对于具体安装目录:改为

prefix?=/usr/local/mosquitto

同时应事先创建此目录

mkdir /usr/local/mosquitto

此时继续安装cjson:
#从github下载cJSON代码

git clone https://github.com/DaveGamble/cJSON.git
cd cJSON
make
make install

安装后输出:

mkdir -p /usr/local/lib /usr/local/include/cjson
cp -a cJSON.h /usr/local/include/cjson
cp -a libcjson.so libcjson.so.1 libcjson.so.1.7.15 /usr/local/lib
cp -a cJSON_Utils.h /usr/local/include/cjson
cp -a libcjson_utils.so libcjson_utils.so.1 libcjson_utils.so.1.7.15 /usr/local/lib

由于采用了源码编译,需要安装:

  • xsltproc (only if building from git)
  • docbook-xsl (only if building from git)
    命令如下:
 yum  install libxsltyum  install  docbook-style-xsl

返回Mosquitto源码文件夹下,输入make命令进行编译:

make
make install

则在/usr/local/mosquitto安装目录下出现了:
bin include lib sbin share文件夹
对应的可执行命令所在目录为/usr/local/mosquitto/sbin/

/usr/local/mosquitto/sbin/mosquitto -h

可用下列命令启动mqtt服务器并指定端口:

mosquitto -p 9999

输出:

1681270517: Warning: Unable to drop privileges to 'mosquitto' because this user does not exist. Trying 'nobody' instead.
1681270517: mosquitto version 2.0.11 starting
1681270517: Using default config.
1681270517: Starting in local only mode. Connections will only be possible from clients running on this machine.
1681270517: Create a configuration file which defines a listener to allow remote access.
1681270517: For more details see https://mosquitto.org/documentation/authentication-methods/
1681270517: Opening ipv4 listen socket on port 9999.
1681270517: Opening ipv6 listen socket on port 9999.
1681270517: Error: Cannot assign requested address
1681270517: mosquitto version 2.0.11 running

再使用Mosquitto客户端编程实现mqtt协议客户端即可。