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

    1. 通过设置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)     
    2. 在设备连云成功后,调用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接口进行调用,并获得同步的返回结果。