RRPC是指由服務端通過物聯網平臺云端API向設備端發送請求,并能夠使設備端響應的功能。
功能介紹
MQTT協議是基于PUB/SUB的異步通信模式,不適用于服務端同步控制設備端返回結果的場景。物聯網平臺基于MQTT協議制定了一套請求和響應的同步機制,無需改動MQTT協議即可實現同步通信。物聯網平臺提供API給服務端,設備端只需要按照固定的格式回復PUB消息,服務端通過API,即可同步獲取設備端的響應結果。
服務端通過云端API發起一個RRPC調用后,設備端會收到一個同步請求的Topic, 格式如/ext/rrpc/${messageId}/${rrpc_topic}
, 設備端接收到該消息后進行處理,并將處理結果以Message的方式推送到/ext/rrpc/${messageId}/${rrpc_topic}
。Python Link SDK已經提供了相應的細節封裝。
關于RRPC的詳細介紹,請參見什么是RRPC。
云端有兩種場景會涉及到RRPC的調用:
消息通信RRpc,該API會發送一個RRPC請求,需要在設備端實現RRPC調用(使用該API時,請求參數的Topic字段不能為空,需填入用戶的自定義Topic)。
設備管理InvokeThingsService,如果使用高級版并登記為同步類型的服務,調用其服務時會采用RRPC模式。
Link SDK使用
使用RRPC能力,需要Aliyun IoT Python SDK 1.1.0或更高的版本。
RRPC使用:普通RRPC Topic
通過設置
on_topic_rrpc_message
的回調來處理RRPC的Topic請求。linkkit.on_topic_rrpc_message = on_topic_rrpc_message ... def on_topic_rrpc_message(self, id, topic, payload, qos, userdata): print("on_topic_rrpc_message: id:%s, topic:%s, payload:%s" % (id, topic, payload)) self.linkkit.thing_answer_rrpc(id, payload)
在設備連云成功后,調用
subscribe_rrpc_topic
, 訂閱該RRPC的Topic。def on_connect(self, session_flag, rc, userdata): print("on_connect:%d,rc:%d,userdata:" % (session_flag, rc)) self.linkkit.subscribe_rrpc_topic("/${YourProductKey}/${YourDeviceName}/user/get")
其中Topic:
/${YourProductKey}/${YourDeviceName}/user/get
僅為示例。如果您要使用到其他自定義Topic的能力,需要自行替換。
所有的RRPC請求處理完成后,必須通過
thing_answer_rrpc
進行回應,id
為RRPC請求的ID,payload
為返回報文的payload
。針對此類的RRPC,物聯網平臺云端SDK可以通過RRpc接口進行調用,并獲得同步的返回結果。
RRPC使用:物模型服務
通過設置
on_thing_call_service
的回調來處理同步類型的service請求。linkkit.on_thing_call_service = on_thing_call_service ... def on_thing_call_service(self, identifier, request_id, params, userdata): print("on_thing_call_service: identifier:%s, request_id:%s, params:%s" % (identifier, request_id, params)) ... self.linkkit.thing_answer_service(identifier, request_id, 200, {})
所有的service請求處理完成后,必須通過
thing_answer_service
進行回應,request_id
為請求的request_id
。針對此類的service,云端SDK可以通過InvokeThingsService接口進行調用,并獲得同步的返回結果。