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 + "]");
    }
};