本文介紹Android Link SDK使用過程中的常見問題。
Android SDK如何使用ClientId、Username、Passwd接入?
如果Android裝置需要使用ClientId、Username、Passwd直接連入物聯網平台,請參見Paho-MQTT Android接入樣本。
在Android SDK中如何通過一個報文上報多個屬性或事件?
Android SDK的屬性上報,是通過HashMap的資料結構實現,其中每個k-v
對錶示一個要上報的屬性和相應的值。如果在HashMap中放置多個屬性的k-v
對(例如範例程式碼中的reportData.put
),可以同時上報多個屬性或事件。範例程式碼如下:
// 裝置上報
Map<String, ValueWrapper> reportData = new HashMap<>();
// identifier為物聯網平台定義的屬性標識符,valueWrapper為屬性的值
reportData.put(identifier1, valueWrapper1); // 參考樣本,更多使用可參考Demo
reportData.put(identifier2, valueWrapper2); // 參考樣本,更多使用可參考Demo
LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() {
RRPC發送應答時,如何解決返回錯誤碼4201?
以下為報錯相關的日誌:
出現上述錯誤,說明您組裝的資料不是正確的JSON資料,導致轉換時出錯。請將發送的資料轉換成正確的JSON資料後,重新發送應答訊息。
網關的子裝置在動態註冊時,物聯網平台返回註冊成功,為何返回的列表為空白?
原因分析
子裝置未開啟動態註冊。
子裝置已經被添加到其他網關裝置下。
解決方案
請檢查並開啟子裝置的動態註冊功能,並檢查子裝置是否已被添加到其他網關。如果確認裝置已被添加至其他網關,則需從該網關刪除後,重新動態註冊。
動態註冊列表包含3個子裝置,物聯網平台返回成功註冊的資訊中,為何僅返回了2個子裝置資訊?
原因分析
子裝置未開啟動態註冊。
子裝置已經被添加到其他網關裝置下。
子裝置的身份認證資訊有誤。
解決方案
請檢查未返回資訊的子裝置的動態註冊是否開啟,並檢查該裝置是否添加到其他網關下,確認認證資訊無誤後,重新進行動態註冊。
動態註冊時,如何解決"SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null"?
根據報錯可知動態註冊的請求還沒有到達物聯網平台,由於裝置時間為錯誤時間,導致MQTT認證資訊檢驗出錯。請檢查裝置的時間後重試。
MQTT重連機制是什嗎?
成功建立MQTT串連後,如果啟用了重連機制,裝置中斷連線後,會主動嘗試重新串連。第一次重連時間間隔為1秒,從第二次重連開始,間隔時間依次呈2秒的重連次方遞增。例如,第二次重連間隔為2,第三次為4,第四次為8秒,以此類推,最大為128,即1、2、4、8...128...128...128...。
如何判斷MQTT串連斷開了?
MQTT串連斷開後,日誌如下。
// 斷連通知
2020-01-17 11:51:40.607 32730-32730/com.aliyun.alink.devicesdk.demo D/LK-DM-DeviceManager: onConnectStateChange() called with: s = [LINK_PERSISTENT], connectState = [DISCONNECTED]
// 斷連原因,斷連不一定能感知到所有原因,這裡會保留開源庫層的disconnect錯誤碼
2020-01-17 11:56:30.807 2617-2671/com.aliyun.alink.devicesdk.demo W/LK-core-PersistentEventDispatch: mqtt disconnected, method = [null], content = [null], errorCode = [32109], message = [Connection lost,Connection lost (32109) - javax.net.ssl.SSLException: Read error: ssl=0x7dbe00f708: I/O error during system call, Software caused connection abort]
如何關閉SDK自動進行MQTT重連功能?
您可以配置以下代碼,關閉SDK的自動重連功能。
MqttConfigure.automaticReconnect = false;
如何從日誌判斷SDK是否已經發起了自動重連?
以下日誌說明Paho自動發起了一次重連,發起的時機對上層不可見。
2020-01-17 11:38:19.007 32730-32730/com.aliyun.alink.devicesdk.demo I/LK-core-IoTMqttAsyncClient: mqtt-paho connect start, userContext = [null], callback = [com.aliyun.alink.linksdk.channel.core.persistent.mqtt.MqttNet$3@18e0bf], [ clientId = lp_test&a14NQ******|securemode=2,_v=1.7.0,lan=Android,os=9,signmethod=hmacsha1,ext=1,timestamp=1579232298867|]
如何從日誌判斷SDK重連結果?
您可以通過以下日誌判斷SDK重連的結果。
// paho 日誌
2020-01-07 14:57:06.097 9955-9955/com.aliyun.alink.devicesdk.demo D/LK-core-MqttDefaulCallback: connectComplete, reconnect=true, client=com.aliyun.alink.linksdk.channel.core.itls.IoTMqttAsyncClient@c212ad5,threadId=Thread[main,5,main]
// channel-core 日誌
2020-01-07 14:57:05.095 9955-10005/com.aliyun.alink.devicesdk.demo I/LK-core-MqttDefaulCallback: mqtt connectComplete,reconnect = true ,ssl://a14NQ******.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883
安卓裝置如何快速重連?
安卓SDK斷開後,快速重連的預設時間為65秒。部分情境下,您需要在斷開後快速重連。請參考如下代碼:
LinkKit.getInstance().reconnect();
心跳請求和心跳響應日誌是什麼樣的?
心跳請求和心跳響應日誌如下。
// 心跳請求發送成功
2020-01-17 14:04:00.090 9442-9490/com.aliyun.alink.devicesdk.demo D/LK-core-MqttPaho: fine, c= org.eclipse.paho.client.mqttv3.internal.CommsSender , method = run , msg = 802, inserts = Ping,PINGREQ, throwable = null
// 收到物聯網平台的心跳響應
2020-01-17 14:04:00.103 9442-9489/com.aliyun.alink.devicesdk.demo D/LK-core-MqttPaho: fine, c= org.eclipse.paho.client.mqttv3.internal.Token , method = markComplete , msg = 404, inserts = Ping,PINGRESP msgId 0,null, throwable = null
是否可以自訂心跳實現?
可以。
通過介面MqttPingSender,可實現自訂心跳時間。更多資訊,請參見TimerPingSender。通過TimerPingSender,您可以設定下一次發送心跳的時間點,以及停止發送心跳。
說明發送心跳的時間點不要超過保活時間。
範例程式碼如下:
// 其中PrivateMqttPingSender實現了MqttPingSender介面 MqttConfigure.pingSender = new PrivateMqttPingSender();
部分安卓裝置在滅屏情況下,會因心跳發送不及時,導致裝置離線。此時,您可參考介面AlarmMqttPingSender實現自訂心跳時間。
重要該方式會定期喚醒安卓系統,會產生額外的功耗開銷。
執行SDK時,為何找不到Log相關的類?
找不到Log相關的類時,報錯樣本如下:
該報錯說明代碼中的方法數超過65536,未支援多DEX,導致未打包該類。
編譯SDK時,出現Task :app:processDebugMainManifest FAILED錯誤,該如何解決?
該錯誤的完整錯誤碼為:
> Task :app:processDebugMainManifest FAILED
/Users/xicai.cxc/Downloads/testApplication/app/src/main/AndroidManifest.xml:8:9-36 Error:
Attribute application@allowBackup value=(false) from AndroidManifest.xml:8:9-36
is also present at [com.aliyun.alink.linksdk:android_alink_id2:1.1.3] AndroidManifest.xml:24:9-35 value=(true).
您可以根據以下操作步驟解決該問題。更多資訊,請參見環境要求與配置。
開啟Android工程根目錄下的
./AndroidManifest.xml
,在manifest
一欄添加如下代碼。<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" ....
在
application
一欄添加如下代碼。<application tools:replace="android:allowBackup"
調用物模型功能的介面發送指令後,返回onSuccess
,為何指令並未執行成功?
回調中onSuccess
僅代表對應訊息從裝置發出成功,不代表訊息對應的任務執行成功。訊息從裝置發出成功後,由於網路波動等原因,訊息可能並未達到物聯網平台。
您可以登入物聯網平台,查看相關日誌,確認問題。更多資訊,請參見雲端作業記錄。
物模型指令的執行邏輯請勿依賴onSuccess
,您可以在InitManager.java
類下的函數 IConnectNotifyListener
的介面onNotify中,處理下行訊息,根據訊息中的執行結果編寫業務的處理邏輯。