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_sim.c,经编译运行后烧录至开发板,具体过程参考Yopen 入门篇开发入门 - 打开EPAT工具查看打印log,工具使用方法请参考工具篇抓日志工具EPAT使用指南
 

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

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