本文以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的退出程式。