Async.MQTT5:新的 C++20 MQTT 客户端库
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平台的最新编译器上进行了测试,保证了其广泛的兼容性和稳定性。
回复