Paho MQTT C—MQTTAsync 库接口

Paho MQTT C—MQTTAsync 库接口

26 天前 · 来自专栏 MQTT

MQTTAsync 库接口

MQTTAsync 是一个用于 C/C++ 的 MQTT 客户端库,用于实现 MQTT 协议的异步通信。它基于 Eclipse Paho 的 MQTT C 客户端库,提供了一种异步的、非阻塞的方式来实现与 MQTT 代理通信。

使用 MQTTAsync,你可以轻松地创建 MQTT 客户端应用程序并连接到 MQTT 代理(也称为 MQTT 服务器)。它支持发布(publish)和订阅(subscribe)消息的操作,可以在应用程序之间进行可靠的消息传递。

1、MQTTAsync_create() : MQTTAsync.h

MQTTAsync_create() 是 MQTTAsync 库中用于创建 MQTT 客户端的函数。它接受五个参数和一个返回值,用于创建并初始化 MQTTAsync 客户端对象。

int MQTTAsync_create    (   MQTTAsync *     handle,
const char *    serverURI,
const char *    clientId,
int     persistence_type,
void *  persistence_context 

以下是 MQTTAsync_create() 函数的详细说明:

MQTTAsync_create(client, serverURI, clientId, persistence_type, persistence_context)
  • client: 指向 MQTTAsync 客户端指针的指针,用于存储创建的 MQTT 客户端实例的地址。
  • serverURI: 以 null 结尾的字符串,指定客户端将连接的服务器。它应该遵循 protocol://host:port 的格式,其中 protocol 可以是 tcp:// 或 mqtt://(用于非安全的 TCP 连接),ssl:// 或 mqtts://(用于加密的 SSL/TLS 连接),ws://(用于非安全的 WebSockets)或 wss://(用于安全的 WebSockets)。如果所链接的库未连接到 TLS 版本,则仅支持启用了 TLS 的前缀(ssl、mqtts、wss)。host 可以是 IP 地址或主机名。例如,tcp://localhost:1883 表示连接到默认 MQTT 端口上运行的本地服务器。
  • clientId: 客户端连接到服务器时传递给服务器的客户端标识符。它应该是以 null 结尾的 UTF-8 编码的字符串。,用于在 MQTT 代理中识别客户端。
  • persistence_type: 持久化类型,指定客户端的持久化方式。常用的类型有 MQTTCLIENT_PERSISTENCE_NONE(无持久化)、MQTTCLIENT_PERSISTENCE_DEFAULT(默认持久化,使用文件系统)等。MQTTAsync 库提供了几种持久化类型(persistence_type)供选择,常用的类型包括:
  1. MQTTCLIENT_PERSISTENCE_NONE: 表示不使用持久化。在客户端断开连接时,未传递到代理的消息会丢失。
  2. MQTTCLIENT_PERSISTENCE_DEFAULT: 表示使用默认的持久化方式。在 MQTTAsync_create() 中指定该选项后,库将使用文件系统进行持久化。消息将在客户端断开连接时保存到文件系统,并在重新连接时恢复。
  3. MQTTCLIENT_PERSISTENCE_USER: MQTTAsync 库还支持用户自定义持久化方式。你可以实现自己的持久化逻辑,并将其作为 persistence_type 参数传递给 MQTTAsync_create() 函数。


  • persistence_context: 如果使用 MQTTCLIENT_PERSISTENCE_NONE 持久化,则此参数未使用,应设置为 NULL。对于 MQTTCLIENT_PERSISTENCE_DEFAULT 持久化,它应该指向持久化目录的位置(如果设置为 NULL,则使用工作目录作为持久化目录)。对于使用 MQTTCLIENT_PERSISTENCE_USER 持久化的应用程序,设置此参数以指向有效的 MQTTClient_persistence 结构。

示例用法:

MQTTAsync_create(&client, serverURI, clientId, MQTTCLIENT_PERSISTENCE_DEFAULT, NULL);

以上示例创建了一个 MQTTAsync 客户端,使用默认的持久化方式进行消息持久化。这意味着在客户端断开连接时,未传递到代理的消息将保存在文件系统中,在重新连接时会进行恢复。具体要根据你的需求选择适当的持久化类型。如果需要保证消息的持久性,可以选择使用默认的持久化方式或自定义持久化方式。如果不需要持久化,可以选择 MQTTCLIENT_PERSISTENCE_NONE。

2、MQTTAsync_createWithOptions() : MQTTAsync.h

int MQTTAsync_createWithOptions (   MQTTAsync *     handle,
const char *    serverURI,
const char *    clientId,
int     persistence_type,
void *  persistence_context,
MQTTAsync_createOptions *   options 

MQTTAsync_createWithOptions用于创建一个基于给定选项的 MQTT 客户端。

该函数参数前几项与MQTTAsync_create相同,

MQTTAsync_createOptions 结构是在 MQTTAsync.h 头文件中定义的一个数据结构。它包含以下字段:

struct MQTTAsync_createOptions {
    char struct_id[4];
    int struct_version;
    int sendWhileDisconnected;
    int maxBufferedMessages;
    int MQTTVersion;
    int allowDisconnectedSendAtAnyTime;
    int deleteOldestMessages;
    int restoreMessages;
    int persistQoS0;
  1. struct_id :一个长度为4的字符数组,用于标识结构。
  2. struct_version :一个整数,表示结构的版本。
  3. sendWhileDisconnected :一个整数,指定是否可以在断开连接时发送消息。
  4. maxBufferedMessages :一个整数,表示可以缓冲的最大消息数量。
  5. MQTTVersion :一个整数,表示要使用的 MQTT 版本。
  6. allowDisconnectedSendAtAnyTime :一个整数,指定是否允许在任何时候进行断开连接发送。
  7. deleteOldestMessages :一个整数,指示当缓冲区已满时是否删除最旧的消息。
  8. restoreMessages :一个整数,指定是否在重新连接时恢复消息。
  9. persistQoS0 :一个整数,指定是否持久化 Quality of Service (QoS) 0 消息。

该结构的目的是提供异步创建 MQTT 客户端的选项和配置。

返回值:

  • 整数类型的返回值,表示函数执行的状态。 如果成功创建了 MQTT 客户端,则返回 MQTTASYNC_SUCCESS (等于0),否则返回其他错误代码。


3、MQTTAsync_connect() : MQTTAsync.h

int MQTTAsync_connect   (   MQTTAsync   handle,
const MQTTAsync_connectOptions *    options 

MQTTAsync_connect() 是 MQTTAsync 库中用于建立与 MQTT 代理(服务器)连接的函数。它接受两个参数: MQTTAsync 客户端对象和 MQTTAsync_connectOptions 结构体对象,用于指定连接的选项。

以下是 MQTTAsync_connect() 函数的详细说明:

MQTTAsync_connect(client, connectOptions)

参数:

  • client: MQTTAsync 客户端对象,即通过 MQTTAsync_create() 创建的 MQTT 客户端实例。
  • connectOptions: MQTTAsync_connectOptions 结构体对象,用于设置连接的选项。

MQTTAsync_connectOptions 结构体包含了多个字段,常用的字段包括:

  • structVersion: 结构体的版本号。
  • clientId: 客户端标识符,用于在 MQTT 代理中识别客户端。
  • serverURI: MQTT 代理的 URI 地址。
  • username: 可选的用户名,用于连接认证。
  • password: 可选的密码,用于连接认证。
  • keepAliveInterval: 心跳包发送间隔时间。
  • cleanSession: 连接标识,为 1 时表示启用“干净会话”。
  • will: 遗嘱消息的相关设置,如 willFlag、willQoS、willTopic 和 willMessage。

MQTTAsync_connect() 函数的返回值是 MQTTAsync_token,它是与连接操作关联的令牌(token)。你可以使用该令牌来跟踪连接操作的状态,或在异步操作完成时处理回调函数。

MQTTAsync_connect() 是一个函数,它使用指定的选项尝试将之前创建的客户端连接到 MQTT 服务器。它属于 MQTTAsync 库的一部分,提供了一个异步的 MQTT 客户端实现。

函数签名:

int MQTTAsync_connect(MQTTAsync handle, const MQTTAsync_connectOptions* options);

返回值:

  • 如果客户端的连接请求被接受,则返回 MQTTASYNC_SUCCESS
  • 大于 0 的错误代码由 MQTT 协议返回:
    • 1:连接被拒绝 - 不可接受的协议版本。
    • 2:连接被拒绝 - 标识符被拒绝。
    • 3:连接被拒绝 - 服务器不可用。
    • 4:连接被拒绝 - 用户名或密码错误。
    • 5:连接被拒绝 - 未经授权。
    • 6-255:保留供将来使用。


该函数尝试基于提供的选项建立 MQTT 客户端与 MQTT 服务器之间的连接。如果连接请求被接受,客户端将成功连接到服务器。如果有任何错误或连接失败,将通过返回值或设置的失败回调函数进行指示。

注意:在调用 MQTTAsync_connect() 之前,推荐使用 MQTTAsync_setCallbacks() 设置所需的回调函数,以启用异步的消息和状态通知。

示例用法:

MQTTAsync client;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
MQTTAsync_token token;
// 创建 MQTTAsync 客户端
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
// 设置连接参数
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;