Async.MQTT5:新的 C++20 MQTT 客户端库

本文目录
  1. 1. Async.MQTT5
  2. 2. 特点
  3. 3. 为什么选择它?
  4. 4. 总结

Async.MQTT5是一个基于Boost.Asio的C++20 MQTT客户端,专门为发布或接收与MQTT 5.0兼容的代理的消息而设计。这是一个全面实施MQTT 5.0协议标准的客户端,完全支持QoS 0、1和2级别的消息发布和接收。

Async.MQTT5

MQTT协议广泛用于现实世界的多种通信场景,主要作为IoT设备数据传输的可靠通信协议。虽然MQTT协议本身相对简单,但将其整合到应用程序中可能相当复杂,尤其是在断开/重连序列后消息重传的实现方面。

Async.MQTT5旨在为应用开发者提供一个非常简单的异步C++接口。内部客户端实现管理网络和MQTT协议细节。值得注意的是,客户端不暴露连接函数(或异步连接函数);相反,网络连接性、MQTT握手和消息重传都在客户端内部自动处理。

Async.MQTT5接口与Boost.Asio的异步模型无缝对接。客户端的异步函数与Boost.Asio支持的所有完成令牌兼容。

仓库地址:https://github.com/mireo/async-mqtt5

特点

Async.MQTT5是一个设计理念为用户只应专注于应用逻辑,而不是网络复杂性的库。该库试图通过以下一系列关键特性来提升开发体验:

  • 完整的TCP、TLS/SSL和WebSocket支持
  • 用户友好的简洁性:提供尽可能简单而不损功能的界面。
  • 优先考虑效率:尽可能高效地利用网络和内存资源。
  • 最小内存占用:确保在IoT设备典型的资源受限环境中优化性能。
  • 自动重新连接:在断开连接的情况下自动尝试重新建立连接。
  • 完全符合Boost.Asio规范:接口和实现策略基于Boost.Asio的基础。Boost.Asio和Boost.Beast的用户将不会在理解和整合Async.MQTT5时遇到问题。此外,Async.MQTT5与Boost.Asio生态系统中的任何其他库都能很好地整合。
  • 自定义分配器:支持自定义分配器,允许对内存资源进行额外的灵活性和控制。Async.MQTT5将使用来自异步函数的处理器关联的分配器来创建库实现中所需的对象实例。
  • 每项操作的取消:所有异步操作都支持Asio的每项操作取消。
  • 完成令牌:所有异步函数都支持CompletionToken,允许使用回调、协程、futures等多种方式灵活使用。
  • 完全实现MQTT 5.0规范
  • 支持QoS 0、QoS 1和QoS 2
  • 自定义认证:Async.MQTT5定义了一个接口,用于执行增强认证的自定义认证器。
  • 高可用性:Async.MQTT5支持列出同一集群中多个客户端可以连接的代理。在与一个代理的连接失败时,客户端会切换到列表中的下一个。
  • 离线缓冲:离线时,它会自动缓冲所有连接恢复时要发送的数据包。

使用该库 下载Boost,并将其添加到您的包含路径中。 如果使用SSL,请下载OpenSSL,链接库并将其添加到包含路径中。 另外,您可以将Async.MQTT5的包含文件夹添加到包含路径中。 您可以使用以下命令行在Linux上编译以下示例:

$ clang++ -std=c++20 <source-cpp-file> -o example -I<path-to-boost> -Iinclude -pthread

使用和API 详细文档在这里。

以下示例演示了配置客户端并使用QoS 0发布“Hello World!”应用消息的简单场景。

#include <iostream>

#include <boost/asio/io_context.hpp>
#include <boost/asio/detached.hpp>
#include <boost/asio/ip/tcp.hpp>

#include <async_mqtt5.hpp>

int main() {
    boost::asio::io_context ioc;

    using client_type = async_mqtt5::mqtt_client<boost::asio::ip::tcp::socket>;
    client_type c(ioc, "");

    c.credentials("<your-client-id>", "<client-username>", "<client-pwd>")
        .brokers("<your-mqtt-broker>", 1883)
        .run();

    c.async_publish<async_mqtt5::qos_e::at_most_once>(
        "<topic>", "Hello world!",
        async_mqtt5::retain_e::no, async_mqtt5::publish_props {},
        [&c](async_mqtt5::error_code ec) {
            std::cout << ec.message() << std::endl;
            c.async_disconnect(boost::asio::detached); // disconnect and close the client
        }
    );
    
    ioc.run();
}

为什么选择它?

如果以下任何一种情况适用于您,则Async.MQTT5可能适合您:

  • 您的应用程序使用Boost.Asio并需要集成MQTT客户端。
  • 您需要异步访问MQTT代理。
  • 您正在开发需要连接到MQTT代理的高级组件。
  • 您需要一个可靠且有韧性的MQTT客户端,可以自动管理所有与网络相关的问题。

如果以下情况使用,则可能不适合您:

  • 您仅需要同步访问MQTT代理。
  • 您连接的MQTT代理不支持MQTT 5版本。

需求 Async.MQTT5是一个仅头文件的库。要使用Async.MQTT5,需要以下条件:

  • C++20兼容的编译器
  • Boost 1.82或更高版本。除了Asio,我们还使用了Beast、Spirit等其他仅头文件的库。
  • OpenSSL。仅当您通过使用boost::asio::ssl::stream需要SSL连接时。

Async.MQTT5已在以下编译器上进行了测试:

  • clang 14.0(Linux)
  • MSVC 14.37 - Visual Studio 2022(Windows)

总结

Async.MQTT5是一个基于Boost.Asio的专业C++20 MQTT客户端,专为发布或接收与MQTT 5.0兼容代理的消息而设计。这个客户端提供了MQTT 5.0协议标准的全面实现,并全面支持QoS 0、1和2的消息发布和接收。

Async.MQTT5的目的是为应用开发者提供一个非常简单的异步C++接口,以简化MQTT协议的集成和使用。它自动处理网络连接、MQTT握手和消息重传,使用户可以专注于应用逻辑。

Async.MQTT5提供了包括TCP、TLS/SSL和WebSocket支持、最小内存占用、自动重新连接等特性,使其在IoT设备环境中表现出色。此外,它支持自定义分配器和每项操作的取消,使其在高度定制化的应用场景中也能灵活应用。

使用Async.MQTT5,您只需下载Boost和(如需SSL支持)OpenSSL,并将它们添加到包含路径中。它是一个头文件库,不需要额外的编译步骤。

Async.MQTT5适用于需要集成MQTT客户端的Boost.Asio应用程序,或那些需要稳定、自动管理网络问题的高级MQTT客户端的场景。然而,如果您只需要同步访问MQTT代理或使用的MQTT代理不支持MQTT 5版本,它可能不适合您。

最后,Async.MQTT5已经在Linux和Windows平台的最新编译器上进行了测试,保证了其广泛的兼容性和稳定性。

技术术语(共 7 个)—— 点击展开
MQTT轻量级物联网消息传输协议,基于发布/订阅模式,适合低带宽不稳定网络
MQTT 5.0MQTT 协议新版本,新增属性、原因码、共享订阅与流量控制
BrokerMQTT 代理服务器,负责接收发布消息并分发给订阅者
QoS服务质量等级,0 最多一次 / 1 至少一次 / 2 恰好一次
TopicMQTT 主题,消息路由的层级字符串,支持通配符 + 与 #
发布客户端向指定主题发送消息
WebSocket浏览器与 Broker 通过 ws/wss 传输 MQTT 的通道
来源/工具信息 —— 点击展开
来源 MQTT中文网(mqtt.cn) —— 国内领先的MQTT通信协议技术社区 分类 MQTT 客户端库 / MQTT 编程 / 学习 字数 3091 字 · 阅读约 8 分钟 更新 2024-04-15 永久链接 https://www.mqtt.cn/1213.html
推荐工具:MQTT调试助手 微信小程序
MQTT中文网官方推出的MQTT调试工具,支持 MQTT 3.1.1/5.0 实时连接调试、主题订阅、消息收发监控与报文分析。 无需安装,微信搜索「MQTT调试助手」即可使用。 电脑端入口:https://www.mqtt.cn/mqtttool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 mqtt.cn
相关标签
📝 作者声明
本文由 MQTT中文网技术团队 原创撰写,内容基于实际项目案例与技术文档,力求为读者提供准确、实用的参考信息。
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 校验和设备调试,或提交需求获取选型与接入建议。

工程师会员

把这篇文章变成可执行的调试资料

开通后可使用高级报文解析、资料包下载、代码示例、工程案例和优先技术支持,适合真实项目交付。

高级工具不限次
资料包与代码包
完整工程案例库
优先技术支持入口

发表回复