全部產品
Search
文件中心

:Android Link SDK相關問題

更新時間:Jun 30, 2024

本文介紹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).

您可以根據以下操作步驟解決該問題。更多資訊,請參見環境要求與配置

  1. 開啟Android工程根目錄下的./AndroidManifest.xml,在manifest一欄添加如下代碼。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        ....
  2. application一欄添加如下代碼。

    <application
            tools:replace="android:allowBackup"

調用物模型功能的介面發送指令後,返回onSuccess,為何指令並未執行成功?

回調中onSuccess僅代表對應訊息從裝置發出成功,不代表訊息對應的任務執行成功。訊息從裝置發出成功後,由於網路波動等原因,訊息可能並未達到物聯網平台。

您可以登入物聯網平台,查看相關日誌,確認問題。更多資訊,請參見雲端作業記錄

物模型指令的執行邏輯請勿依賴onSuccess,您可以在InitManager.java類下的函數 IConnectNotifyListener的介面onNotify中,處理下行訊息,根據訊息中的執行結果編寫業務的處理邏輯。