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接口进行调用,并获得同步的返回结果。