RRPC发送应答时,如何解决返回错误码4201?

以下为报错相关的日志:

错误码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秒,以此类推。

如何判断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

心跳请求和心跳响应日志是什么样的?

心跳请求和心跳响应日志如下。

// 心跳请求发送成功
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。参见该说明,您可以设置下一次发送心跳的时间点,以及停止发送心跳。

说明 发送心跳的时间点不要超过保活时间。

示例代码如下:

// 其中PrivateMqttPingSender实现了MqttPingSender接口
MqttConfigure.pingSender = new PrivateMqttPingSender();

执行SDK时,为何找不到Log相关的类?

找不到Log相关的类时,报错示例如下:

SDK执行报错

该报错说明代码中的方法数超过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,处理下行消息,根据消息中的执行结果编写业务的处理逻辑。