本文介绍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中,处理下行消息,根据消息中的执行结果编写业务的处理逻辑。