一、简介
什么是RRpc?
MQTT协议是基于PUB/SUB的异步通信模式,不适用于服务端同步控制设备端返回结果的场景。物联网平台基于MQTT协议制定了一套请求和响应的同步机制,无需改动MQTT协议即可实现同步通信。物联网平台提供API给服务端,设备端只需要按照固定的格式回复PUB消息,服务端使用API,即可同步获取设备端的响应结果。
二、RRpc原理
1、物联网平台收到来自用户服务器的RRPC调用,下发一条RRPC请求消息给设备。消息体为用户传入的数据,Topic为物联网平台定义的Topic,其中含有唯一的RRPC消息ID。
2、设备收到下行消息后,按照指定Topic格式(包含之前云端下发的唯一的RRPC消息ID)回复一条RRPC响应消息给云端,云端提取出Topic中的消息ID,和之前的RRPC请求消息匹配上,然后回复给用户服务器。
3、如果调用时设备不在线,云端会给用户服务器返回设备离线的错误;如果设备没有在超时时间内(8秒内)回复RRPC响应消息,云端会给用户服务器返回超时错误。
三、Topic格式
系统Topic:
RRPC请求消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/${messageId}
RRPC响应消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/response/${messageId}
RRPC订阅Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/+
其中,${YourProductKey}是您的设备所属产品的ProductKey,${YourDeviceName}是您的设备的名称,${messageId}是云端生成的唯一的RRPC消息ID。
自定义Topic
RRPC请求消息Topic:/ext/rrpc/${messageId}/${topic}
RRPC响应消息Topic:/ext/rrpc/${messageId}/${topic}
RRPC订阅Topic:/ext/rrpc/+/${topic}
其中${messageId}是云端生成的唯一的RRPC消息ID,${topic}是您的自定义Topic。
【特别注意】在调用API接口时,传入自定义Topic就是上面提到的topic,不需要传前面的/ext/rrpc/${messageId}
四、API调试
本博客以阿里云在线调试平台为例,进行RRpc接口的调试,链接为:https://api.aliyun.com/?spm=a2c4g.11186623.2.12.680f3d29WOpUay#/?product=Iot&api=RRpc&tab=DEMO〈=JAVA
1、参数填写(第一张图为默认系统topic,第二张图为自定义topic,无论哪个topic都需要设备先进行订阅)
2、错误调试原因分析
设备不在线
设备未在规定时间内响应
3、成功调用接口
设备端收到RRpc请求后需要及时响应(以设备端java sdk为例,在监听方法中进行响应,响应代码如下)
// 接收系统RRPC请求并回复RRPC响应
String response = topic.replace("/request/", "/response/");
try {
publish(response, new String((byte[]) aMessage.getData(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
五、相关限制
1、目前,仅支持设备端返回QoS=0的RRPC响应消息。
2、云端和设备端之间使用自定义Topic进行RRPC通信的条件:
a.云端传递的Topic字段不为空。
b.设备端在建立连接(connect)时传递了ext=1参数。