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) {
// 取消訂閱失敗
}
});