基於MQTT Topic通訊

更新時間:
Copy as MD

Android SDK提供與阿里雲物聯網平台通訊的基礎能力介面,本文介紹通過自訂Topic實現發布、訂閱、取消訂閱的基礎能力。

具體代碼實現請參見Demo中的MqttActivity.java。

發布訊息

更多發布訊息內容,請參見MqttPublishRequest

  • 不返回應答

    適用於裝置上行訊息,物聯網平台不回複,或者物聯網平台進行了回複但裝置端不需要做處理的情境。

    // 發布
    MqttPublishRequest request = new MqttPublishRequest();
    // 設定是否需要應答。
    request.isRPC = false;
    // 設定topic,裝置通過該Topic向物聯網平台發送訊息。以下Topic為樣本,需替換為使用者自己裝置的Topic。
    request.topic = "/a18wP******/LightSwitch/user/update";
    // 設定qos
    request.qos = 0;
    String data = "hello world"; //TODO:data 設定需要發布的資料
    request.payloadObj = data;
    LinkKit.getInstance().publish(request, new IConnectSendListener() {
        @Override
        public void onResponse(ARequest aRequest, AResponse aResponse) {
            // 訊息成功提交給作業系統的發送緩衝區。
            // 在網路波動等異常情況下,訊息可能無法到達雲端。
            // 如果上行的訊息有對應的下行的reply, 建議通過reply報文來確認上行訊息的到達。
        }
        @Override
        public void onFailure(ARequest aRequest, AError aError) {
            // 發布失敗
        }
    });                       

    參數

    樣本

    說明

    isRPC

    false

    是否為RPC請求,如果是,則需要等待 replyTopic訊息後才Rsp。

    預設為false,表示不需應答。

    topic

    /a18wP******/LightSwitch/user/update

    擁有發布許可權的Topic。裝置通過該Topic向物聯網平台發送訊息。

    qos

    0

    設定MQTT請求中QOS的值,預設為0。

    payloadObj

    {"id":"160865432","method":"thing.event.property.post","params":{"LightSwitch":1},"version":"1.0"}

    需要發布的資料,可以為任意格式資料。如果格式為JSON String,其中id欄位需要保持每次唯一,不可重複,請使用自增的方式進行設定ID欄位。樣本中id欄位為160865432,則下次id欄位應為160865433。

  • 返回應答

    • 適用於使用者將裝置上行的訊息流程轉到自己的商務服務器,商務服務器再發送下行訊息給裝置的情境。

    • 適用於使用者使用Alink協議的Topic,並且協議規定服務端會回複reply報文的情境。

    // 發布
    MqttPublishRequest request = new MqttPublishRequest();
    // 設定是否需要應答。設定為true,表示期望收到物聯網平台的下行回複。
    request.isRPC = true;
    // 設定qos
    request.qos = 0;
    // 設定topic,裝置通過該Topic向物聯網平台發送訊息。以下Topic為樣本,需替換為使用者自己裝置的Topic。
    request.topic = "/a18wP******/LightSwitch/user/update";
    //設定物聯網平台回覆的topic,若不設定,則預設為 topic+“_reply”。
    request.replyTopic = "/a18wP******/LightSwitch/user/update_reply";
    String data = "hello world"; //TODO:data 設定需要發
    request.payloadObj = data;
    //demoBaseTemplateActivity提供了參考的訊息響應的類, 下行訊息會在其中的onResponse中給到使用者
    LinkKit.getInstance().publish(request, new IConnectSendListener() {
        @Override
        public void onResponse(ARequest aRequest, AResponse aResponse) {
            // 發布成功
        }
        @Override
        public void onFailure(ARequest aRequest, AError aError) {
            // 發布失敗
        }  
    });                    

    參數

    樣本

    說明

    isRPC

    true

    是否為RPC請求,如果是,則需要等待 replyTopic訊息後才Rsp。

    設定為true,表示期望收到物聯網平台的下行回複。

    qos

    0

    設定MQTT請求中QoS的值,預設為0。

    topic

    /a18wP******/LightSwitch/user/update

    擁有發布許可權的Topic。裝置通過該Topic向物聯網平台發送訊息。

    replyTopic

    /a18wP******/LightSwitch/user/update_reply

    設定物聯網平台回覆的topic,若不設定,則預設為 topic+“_reply”。

    payloadObj

    {"id":"160865432","method":"thing.event.property.post","params":{"LightSwitch":1},"version":"1.0"}

    需要發布的資料,格式必須為JSON String,其中id欄位需要保持每次唯一,不可重複,請使用自增的方式進行設定ID欄位。樣本中id欄位為160865432,則下次id欄位應為160865433。

說明

裝置發送訊息的回調onResponse/onFailure,預設是在UI線程透出。自lp-iot-linkkit1.7.3版本起,您可以通過PersistentConnect.mNotifySendResultOnMainThread = false;選擇將訊息通過非UI線程透出。對於UI線程業務繁忙的情境,建議將該配置項設定為false

訂閱訊息

您可以訂閱指定Topic的訊息,訂閱關係將儲存在物聯網平台。物聯網平台收到指定Topic發布的訊息後,會將訊息轉寄給裝置。更多內容,請參見MqttSubscribeRequest

訂閱成功後,相應的下行訊息,會通過認證與串連串連狀態與下行訊息監聽中的IConnectNotifyListener對象中透出。

範例程式碼:

// 訂閱
MqttSubscribeRequest subscribeRequest = new MqttSubscribeRequest();
// subTopic 替換成您需要訂閱的 topic
subscribeRequest.topic = subTopic;
subscribeRequest.isSubscribe = true;
subscribeRequest.qos = 0; // 支援0或者1
LinkKit.getInstance().subscribe(subscribeRequest, new IConnectSubscribeListener() {
    @Override
    public void onSuccess() {
        // 訂閱成功
    }
    @Override
    public void onFailure(AError aError) {
        // 訂閱失敗
    }
});                      

如果裝置不再需要訂閱指定Topic,需要主動取消訂閱。否則訂閱關係一直存在,您將持續收到訂閱Topic發送的訊息。具體內容,請參見下文取消訂閱

取消訂閱

// 取消訂閱
MqttSubscribeRequest unsubRequest = new MqttSubscribeRequest();
// unSubTopic 替換成您需要取消訂閱的topic
unsubRequest.topic = unSubTopic;
unsubRequest.isSubscribe = false;
LinkKit.getInstance().unsubscribe(unsubRequest, new IConnectUnscribeListener() {
    @Override
    public void onSuccess() {
        // 取消訂閱成功
    }
    @Override
    public void onFailure(AError aError) {
        // 取消訂閱失敗
    }
});