paho.mqtt.c 库的使用(异步客户端)

本文详细介绍了Paho MQTT C库在异步模式下使用的回调函数,包括连接成功、连接失败、数据接收、发送消息和连接断开等关键回调的实现和应用场景。通过这些回调,开发者可以实现MQTT客户端的连接管理、消息发布与订阅等功能,确保了在物联网设备通信中的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#include "MQTTAsync.h"
 
MQTTAsync mqttClient;
static const char *subTopic = "xxx";  //设备订阅的主题
static const char *pubTopic = "xxx";  //设备发布的主题


int sendMessage(char *data, int qos) //发送数据
{
    int rc;
    MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
    MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
 
    opts.context = mqttClient;
    //opts.onSuccess = NULL; /*发送成功回调*/
    //opts.onFailure = NULL; /*发送失败回调*/
    pubmsg.payload = data;
    pubmsg.payloadlen = strlen(data);
    pubmsg.qos = qos;
    printf("mqtt send: %s\n", (char *)pubmsg.payload);
    //尝试发送数据,想要知道消息是否发送成功,需要设置 opts 中的相关回调
    if ((rc = MQTTAsync_sendMessage(mqttClient, pubTopic, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
    {
        printf("MQTTAsync_sendMessage() fail, error code:%d\n", rc);
    }
 
    return 0;
}

void onConnectCallCBack(void *context, char *cause) //连接成功回调
{
    printf("Connection successful.\n");
    int rc, qos;
    MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
 
    qos = 0;
    opts.context = mqttClient;
    //opts.onSuccess = NULL; /*订阅成功回调*/
    //opts.onFailure = NULL; /*订阅失败回调*/
    if ((rc = MQTTAsync_subscribe(mqttClient, subTopic, qos, &opts)) != MQTTASYNC_SUCCESS) //尝试订阅主题
    { 
        printf("MQTTAsync_subscribe() fail, error code:%d\n", rc);
    }
}
 
void onConnectFailure(void *context, MQTTAsync_failureData *response) //连接失败回调
{
    printf("connection fail, error code: %d, error message:%s\n", response ? response->code : 0, response ? response->message : 0);
}
 
void connlost(void *context, char *cause) //连接断开回调
{
    printf("disconnect, cause: %s\n", cause);
}
 
int msgarrvd(void *context, char *pubTopic, int topicLen, MQTTAsync_message *message) //接收数据回调
{
    char buf[message->payloadlen + 1] = {0};
 
    memcpy(buf, message->payload, message->payloadlen);
    printf("mqtt recv: %s\n", buf);
    MQTTAsync_freeMessage(&message);
    MQTTAsync_free(pubTopic);
 
    return 1;
}
 
void mqtt()
{
    int rc;
    const char *serverUrl = "xxx";  //服务器地址
    const char *clientId = "xxx";  //客户端标识符
    const char *userName = "xxx";  //用户名
    const char *password = "xxx";  //密码
 
    MQTTAsync_create(&mqttClient, serverUrl, clientId, MQTTCLIENT_PERSISTENCE_NONE, NULL);  //创建mqtt客户端
    MQTTAsync_setCallbacks(mqttClient, NULL, connlost, msgarrvd, NULL); //设置连接断开和接受数据回调
    MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;  //初始化结构体
    conn_opts.cleansession = 1;
    conn_opts.username = userName;
    conn_opts.password = password;
    //conn_opts.onSuccess = onConnect;  /*连接成功回调,此处设置的回调只在第一次连接成功时调用,SDK内部自动重连时不会调用;*/
    conn_opts.onFailure = onConnectFailure; //连接失败回调
    conn_opts.context = mqttClient;
    conn_opts.automaticReconnect = true;    //开启断开自动重连
    conn_opts.minRetryInterval = 3; //最小重连间隔时间(秒),每次失败重连间隔时间都会加倍
    conn_opts.maxRetryInterval = 60;    //最大重连间隔时间(秒)
    MQTTAsync_setConnected(mqttClient, NULL, onConnectCallCBack);   //设置连接成功回调,不管是第一次连接成功还是重连成功都会调用此回调
    if ((rc = MQTTAsync_connect(mqttClient, &conn_opts)) != MQTTASYNC_SUCCESS)  //尝试连接
    {
        printf("MQTTAsync_connect() fail, error code:%d\n", rc);
    }
}

关于各回调函数的详细介绍:

PahoMQTT-c:异步模式下各回调函数的使用场景 - 知乎 (zhihu.com)

### 使用 Paho MQTT C 的方法 为了使用 Paho MQTT C ,在安装过程中需指定该路径(`CMAKE_PREFIX_PATH`),如果未安装在标准位置的话[^1]。这确保编译器能够找到必要的头文件和链接。 #### 安装依赖项 通常情况下,Paho MQTT C 需要特定版本的 OpenSSL 或其他 TLS/SSL 支持来提供安全连接功能。这些依赖关系应在构建之前解决。 #### 构建配置选项 可以选择是否构建文档 (`PAHO_BUILD_DOCUMENTATION`) 和示例应用程序 (`PAHO_BUILD_SAMPLES`) 来辅助开发过程。 #### 连接至MQTT代理并发送消息 一旦成功安装了Paho MQTT C,则可以通过编写简单的程序实现与MQTT服务器通信的功能。下面是一个基本的例子展示如何通过Python版Paho客户端向Azure IoT Hub发送遥测数据: ```python import paho.mqtt.client as mqtt import ssl def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") client = mqtt.Client() client.on_connect = on_connect iot_hub_name = "<YourIoTHubName>" device_id = "<YourDeviceID>" sas_token = "<YourSASToken>" hostname = f"{iot_hub_name}.azure-devices.net" port = 8883 username = f"{iot_hub_name}.azure-devices.net/{device_id}/?api-version=2021-04-12" password = sas_token client.username_pw_set(username=username, password=password) client.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) client.connect(hostname, port, keepalive=60) client.loop_start() topic = f'devices/{device_id}/messages/events/' payload = '{"temperature": "75", "humidity": "90"}' client.publish(topic, payload=payload, qos=1) client.disconnect() ``` 此脚本展示了怎样设置TLS加密参数以及认证信息以便于同Azure IoT Hub建立安全可靠的通讯链路[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值