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的订阅界面将会收到开发板所发布的消息
设备端订阅主题,当收到服务器发布消息时,通过注册的回调函数将消息内容打印出来: