Skip to content

MQTT连接服务器

本文档介绍了MQTT连接服务器的相关接口

MQTT连接服务器流程

MQTT连接服务器大致流程如下:

查询网络信息

调用接口:

yopen_nw_get_reg_status(uint8_t nSim, yopen_nw_reg_status_info_s *reg_info);

参数:

参数 说明
nsim sim卡卡槽
reg_info 网络状态

示例:

do{
        yopen_nw_get_reg_status(0, &nw_status);// 调用yopen_nw_get_reg_status函数获取网络注册状态,参数0表示sim卡卡槽,&nw_status表示存储网络状态的结构体指针
        yopen_rtos_task_sleep_ms(1000);
        yopen_trace("==========nw_status %d==========", nw_status.data_reg.state);
        if(nw_status.data_reg.state == YOPEN_NW_REG_STATE_DENIED)
        {
            yopen_trace("network reg denied exit !!!!");// 打印网络注册被拒绝信息
        }

    }while(!(nw_status.data_reg.state == YOPEN_NW_REG_STATE_HOME_NETWORK || nw_status.data_reg.state == YOPEN_NW_REG_STATE_ROAMING));//注册到网络退出循环

创建客户端

调用接口:

MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId, int persistence_type, void* persistence_context)

参数:

参数名 说明
handle 客户端句柄
serverURI 服务器地址
clientId 客户端标识
persistence_type 持久化类型
persistence_context 持久化上下文

示例:

struct OptionsS// 定义一个结构体OptionsS,用于存储MQTT连接的相关信息
{
    char* connection;        
    char* clientid;
    char* username;
    char* password;
} options =
{
    "broker.emqx.io:1883",
    "myclientid",
    0,
    0,
};
MQTTClient_create(&aclient, options.connection, options.clientid, 0, NULL);
// 调用MQTTClient_create函数创建MQTT客户端

连接服务器

调用接口:

MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions* options)

参数:

参数 说明
handle 客户端句柄
options 配置选项

示例:

MQTTClient_connect(aclient, &OptionsS);
//调用MQTTClient_connect函数连接MQTT服务器,aclient为客户端句柄,&OptionsS为配置选项

订阅主题

调用接口:

MQTTClient_subscribe(MQTTClient handle, const char* topic, int qos)

参数:

参数 说明
handle 客户端句柄
topic 订阅的主题
qos 服务质量

示例:

MQTTClient_subscribe(aclient, "rec", 0);
// 调用MQTTClient_subscribe函数订阅主题,aclient为客户端句柄,"rec"为订阅的主题,0为服务质量

注册回调函数

调用接口:

MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClient_connectionLost* cl,
MQTTClient_messageArrived* ma, MQTTClient_deliveryComplete* dc)

参数:

参数 说明
handle 客户端句柄
context 上下文信息
MQTTClient_connectionLost* cl MQTT 连接意外断开时触发的回调函数
MQTTClient_messageArrived* ma 客户端接收到订阅的消息时触发的回调函数
MQTTClient_deliveryComplete* dc 客户端成功将消息发送到服务器(且满足 QoS 要求)时触发的回调函数

示例:

MQTTClient_setCallbacks(aclient, NULL, NULL, messageArrived, NULL);
// 调用MQTTClient_setCallbacks函数注册回调函数,aclient为客户端句柄,NULL为上下文信息,NULL表示不使用连接丢失回调函数,messageArrived为消息到达回调函数,NULL表示不使用消息发送完成回调函数

发布消息

调用接口:

MQTTClient_publish(MQTTClient handle, const char* topicName, int payloadlen, const void* payload,int qos, int retained, MQTTClient_deliveryToken* deliveryToken)

参数:

参数 说明
handle 客户端句柄
topicName 发布消息的主题
payloadlen 消息长度
payload 消息内容
qos 服务质量
retained 保留标志
deliveryToken 输出参数

示例:

MQTTClient_publish(aclient, "send", 5, "qos 0", 0, 0, NULL);
// 调用MQTTClient_publish函数发布消息,aclient为客户端句柄,"send"为发布消息的主题,5为消息长度,"qos 0"为消息内容,0为服务质量,0为保留标志,NULL为输出参数

断开连接

调用接口:

MQTTClient_disconnect(MQTTClient handle, int timeout)

参数:

参数 说明
handle 客户端句柄
timeout 断开连接的超时时间

示例:

MQTTClient_disconnect(aclient, 100);
//// 调用MQTTClient_disconnect函数断开MQTT连接,aclient为客户端句柄,100为断开连接的超时时间

举例演示

demo_mqtt.c通过调用以上接口实现连接服务器,订阅主题,发布消息等功能。

执行demo_mqtt.c之后再mqtt.fx的订阅界面将会收到开发板所发布的消息

设备端订阅主题,当收到服务器发布消息时,通过注册的回调函数将消息内容打印出来: