全部产品
Search
文档中心

阿里云物联网平台:Android Link SDK相关问题

更新时间:Jan 11, 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中,处理下行消息,根据消息中的执行结果编写业务的处理逻辑。