本篇內容主要講解“MQTT如何連接RRPC通訊”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MQTT如何連接RRPC通訊”吧!
什么是RRPC通信
MQTT協議是基于PUB/SUB的異步通信模式,不適用于服務端同步控制設備端返回結果的場景。物聯網平臺基于MQTT協議制定了一套請求和響應的同步機制,無需改動MQTT協議即可實現同步通信。物聯網平臺提供API給服務端,設備端只需要按照固定的格式回復PUB消息,服務端使用API,即可同步獲取設備端的響應結果。
RRPC:Revert-RPC。RPC(Remote Procedure Call)采用客戶機/服務器模式,用戶不需要了解底層技術協議,即可遠程請求服務。RRPC則可以實現由服務端請求設備端并能夠使設備端響應的功能。
RRPC 請求消息:云端下發給設備端的消息。
RRPC 響應消息:設備端回復給云端的消息。
RRPC 消息ID:云端為每次RRPC調用生成的唯一消息ID。
RRPC 訂閱Topic:設備端訂閱RRPC消息時傳遞的Topic,含有通配符。

具體流程如下:
物聯網平臺收到來自用戶服務器的RRPC調用,下發一條RRPC請求消息給設備。消息體為用戶傳入的數據,Topic為物聯網平臺定義的Topic,其中含有唯一的RRPC消息ID。
設備收到下行消息后,按照指定Topic格式(包含之前云端下發的唯一的RRPC消息ID)回復一條RRPC響應消息給云端,云端提取出Topic中的消息ID,和之前的RRPC請求消息匹配上,然后回復給用戶服務器。
如果調用時設備不在線,云端會給用戶服務器返回設備離線的錯誤;如果設備沒有在超時時間內(8秒內)回復RRPC響應消息,云端會給用戶服務器返回超時錯誤。
RRPC通信相關Topic格式如下:
RRPC請求消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/${messageId}
RRPC響應消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/response/${messageId}
RRPC訂閱Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/+
以上內容來自https://help.aliyun.com/document_detail/90567.html
由上面可以看出需要在topic中獲得messageId,然后在發送回去
如果你的ML302模塊還沒有連上阿里云可以看一下這個,中移4G模塊-ML302-OpenCpu開發-(MQTT連接阿里云)
https://blog.csdn.net/qq_33259323/article/details/108638945
https://www.bilibili.com/read/cv7876527
int example_subscribe_rrpc(void *handle){
int res = 0;
const char *fmt = "/sys/%s/%s/rrpc/request/+";
char *topic = NULL;
int topic_len = 0;
topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
topic = HAL_Malloc(topic_len);
if (topic == NULL) {
cm_printf("[ALIYUN]: memory not enough\n");
return -1;
}
memset(topic, 0, topic_len);
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);
cm_printf("topic:%s \r\n",topic);
res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive_rrpc, NULL);
if (res < 0) {
cm_printf("[ALIYUN]: subscribe failed\n");
HAL_Free(topic);
return -1;
}
HAL_Free(topic);
return 0;
}char DEMO_RRPC_SessionId[19];
void example_message_arrive_rrpc(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg){
iotx_mqtt_topic_info_t *topic_info = (iotx_mqtt_topic_info_pt) msg->msg;
char * sendMessage = NULL;
const char * sendMessage_fmt = "%d";
int sendMessage_len = 20;
int cm_test_read_gpio = 0;
cm_printf("example_message_arrive_rrpc \n");
switch (msg->event_type) {
case IOTX_MQTT_EVENT_PUBLISH_RECEIVED:
/* print topic name and topic message */
cm_printf("[ALIYUN]: Message Arrived:");
cm_printf("Topic : %.*s", topic_info->topic_len, topic_info->ptopic);
cm_printf("Payload: %.*s", topic_info->payload_len, topic_info->payload);
cm_printf("\n");
// 提取sessionId
strncpy(DEMO_RRPC_SessionId,topic_info->ptopic+46,19);
cm_printf("[ALIYUN]: sessionId: %s",DEMO_RRPC_SessionId);
//接收到的數據:topic_info->payload
//干啥干啥干啥
// 發送
example_publish_rrpc(sendMessage);
break;
default:
break;
}
}int example_publish_rrpc(unsigned char * payload)
{
int res = 0;
const char *fmt = "/sys/%s/%s/rrpc/response/%s";
char *topic = NULL;
int topic_len = 0;
//char *payload = "{\"message\":\"hello!\"}";]
cm_printf("MQTT發送信息:%s",payload);
topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1 +strlen(DEMO_RRPC_SessionId);
topic = HAL_Malloc(topic_len);
if (topic == NULL) {
cm_printf("[ALIYUN]: memory not enough\n");
return -1;
}
memset(topic, 0, topic_len);
HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME,DEMO_RRPC_SessionId);
cm_printf("[ALIYUN]: example_publish_rrpc: %s",topic);
res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
if (res < 0) {
cm_printf("[ALIYUN]: publish failed, res = %d\n", res);
HAL_Free(topic);
return -1;
}
HAL_Free(topic);
return 0;
}到此,相信大家對“MQTT如何連接RRPC通訊”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。