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

#include 
#include 
#include 
#include 
#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)

你可能感兴趣的:(c语言,物联网)