基於MQTT Topic通訊
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; //demo的BaseTemplateActivity提供了參考的訊息響應的類, 下行訊息會在其中的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-linkkit的1.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) {
// 取消訂閱失敗
}
});