RRPC能力
更新時間:
Copy as MD
背景資訊
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 + "]");
}
};该文章对您有帮助吗?