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的调用:

  • 消息通信API-RRpc,该API会发送一个RRPC请求,需要在设备端实现RRPC调用。
  • 设备管理API-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)     

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