背景信息
RRPC是指用戶云端通過云端API發起一個RRPC調用,該調用將同步返回設備的響應。
設備端會收到一個同步請求的topic, 格式如 /ext/rrpc/{messageId}/{rrpc_topic}
或者 /sys/{pk}/{dn}/rrpc/request/${msgId}
,設備端接收到該消息后進行處理,并將處理結果publish到 /ext/rrpc/{messageId}/{rrpc_topic}
或者 /ext/rrpc/${msgId}/${topic}
。
消息通信API
通過調用云端該RRPC接口,觸發向設備發起RRPC同步請求。
設備管理API
通過調用云端該同步服務接口,或者在物聯網平臺定義設備的服務為同步服務,并觸發同步服務調用,即可向設備發起RRPC同步請求。
接口調用
在完成整個RRPC調用鏈路的過程中,設備端需要先確保SDK初始化成功,即MQTT建聯成功。
RRPC監聽和回復
云端RRPC請求可以在下行監聽的位置接收到,具體接收到的topic由調用方指定。
// 這個是全局的下行監聽設置接口
LinkKit.getInstance().registerOnPushListener(notifyListener);
/**
* 下行監聽器,云端 MQTT 下行數據都會通過這里回調
*/
private static IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
/**
* onNotify 會觸發的前提是 shouldHandle 沒有指定不處理這個topic
* @param connectId 連接類型,這里判斷是否長鏈 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param topic 下行的topic
* @param aMessage 下行的數據內容
*/
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
String data = new String((byte[]) aMessage.data);
// 服務端返回數據示例 data = {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
}
/**
* @param connectId 連接類型,這里判斷是否長鏈 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param topic 下行topic
* @return 是否要處理這個topic,如果為true,則會回調到onNotify;如果為false,onNotify不會回調這個topic相關的數據。建議默認為true。
*/
@Override
public boolean shouldHandle(String connectId, String topic) {
return true;
}
/**
* @param connectId 連接類型,這里判斷是否長鏈 connectId == ConnectSDK.getInstance().getPersistentConnectId()
* @param connectState {@link ConnectState}
* CONNECTED, 連接成功
* DISCONNECTED, 已斷鏈
* CONNECTING, 連接中
* CONNECTFAIL; 連接失敗
*/
@Override
public void onConnectStateChange(String connectId, ConnectState connectState) {
Log.d(TAG, "onConnectStateChange() called with: connectId = [" + connectId + "], connectState = [" + connectState + "]");
}
};
調用示例
設備端
根據調用者需要的數據,RRPC響應將返回相應的數據內容,以下示例默認返回空的data。
// 可使用全局的下行監聽
LinkKit.getInstance().registerOnPushListener(notifyListener);
private IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
@Override
public void onNotify(String connectId, String topic, AMessage aMessage) {
if (CONNECT_ID.equals(connectId) && !TextUtils.isEmpty(topic) &&
topic.startsWith("/ext/rrpc/")) {
//示例 topic=/ext/rrpc/1138654706478941696//a1ExY4afKY1/testDevice/user/get
//ALog.d(TAG, "receice Message=" + new String((byte[]) aMessage.data));
// 服務端返回數據示例 {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
MqttPublishRequest request = new MqttPublishRequest();
request.isRPC = false;
request.topic = topic;
String[] array = topic.split("/");
String resId = array[3];
request.msgId = resId;
// TODO 用戶根據實際情況填寫 僅做參考
request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";
LinkKit.getInstance().publish(request, new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
// 響應成功
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
// 響應失敗
}
});
}
}
@Override
public boolean shouldHandle(String connectId, String topic) {
return true;
}
@Override
public void onConnectStateChange(String connectId, ConnectState connectState) {
Log.d(TAG, "onConnectStateChange() called with: connectId = [" + connectId + "], connectState = [" + connectState + "]");
}
};
云端
云端觸發RRPC調用代碼參考:調用自定義topic RRPC。
文檔內容是否對您有幫助?