本文以C Link SDK中的demos/mqtt_rrpc_demo.c为例,介绍如何调用Link SDK的API,展示设备的RRPC功能。
背景信息
配置流程
初始化。
详细内容,请参见MQTT接入的初始化。
配置功能。
详细内容,请参见MQTT接入的配置功能。
请求连接。
详细内容,请参见MQTT接入的请求连接。
接收RRPC消息。
设备与物联网平台建立连接后,您可以调用物联网平台云端API RRpc,通过以下类型的Topic,向设备发送RRPC指令。
设备端调用aiot_mqtt_recv,接收到信息。RRPC的消息触发回调函数,设备执行对应处理。
本文示例代码中,回调函数为
demo_mqtt_default_recv_handler
。定义RRPC消息的回调函数,编写处理逻辑。
重要接收同步服务消息后,请在8秒内做出应答。否则,即使设备端已收到消息,也视其失败。
您可以参考以下内容,编写回调函数的处理逻辑:
通过收到消息的Topic格式,辨别消息是否为RRPC消息。
如果使用RRPC通信相关Topic,无需订阅Topic。
其格式为:
/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/${messageId}
。更多信息,请参见调用RRPC通信相关Topic。如果使用自定义Topic,发送RRPC前,您需订阅该Topic。订阅Topic的具体操作,请参见MQTT接入的订阅Topic。
通过该Topic发送消息后,消息经由RRPC请求的Topic,发送至设备。RRPC请求的Topic格式为:
/ext/rrpc/${messageId}/${topic}
。更多信息,请参见调用自定义Topic(推荐)。
回调函数的处理逻辑建议:设备接收RRPC消息后,根据业务需要,执行消息指令,然后向物联网平台发回应答报文。
示例代码中回调函数的处理逻辑:打印了RRPC消息,并同步向物联网平台返回了一条payload的值为
pong
的应答消息。
void demo_mqtt_default_recv_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata) { switch (packet->type) { …… …… case AIOT_MQTTRECV_PUB: { printf("pub, qos: %d, topic: %.*s\n", packet->data.pub.qos, packet->data.pub.topic_len, packet->data.pub.topic); printf("pub, payload: %.*s\n", packet->data.pub.payload_len, packet->data.pub.payload); /* TODO: 处理服务器下发的业务报文。 */ /* 下面是一个RRPC的应答示例 */ { char *payload = "pong"; char resp_topic[256]; if(packet->data.pub.topic_len > 256) { break; } memset(resp_topic, 0, sizeof(resp_topic)); memcpy(resp_topic, packet->data.pub.topic, packet->data.pub.topic_len); aiot_mqtt_pub(handle, resp_topic, (uint8_t *)payload, (uint32_t)strlen(payload), 0); } } break; …… …… default: { } } }
断开连接。
详细内容,请参见MQTT的断开连接。
退出程序。
详细内容,请参见MQTT的退出程序。