RRPC发送应答出错,返回错误码4201

问题原因:客户组装的数据不是一个正确的JSON数据,导致转换时出错。

解决办法:将发送的数据转换成正确的JSON数据后,错误消失。

网关子设备动态注册问题

Q: 网关代理子设备动态注册失败,动态注册参数是子设备列表,云端返回注册成功,但是返回的列表为空?A:目前遇到两种常见的导致该问题的原因:

  • 子设备未开启动态注册;

  • 子设备已经被添加到其他网关设备下了;

Q: 网关代理子设备动态注册,动态注册列表包含3个子设备,云端返回注册成功信息,但是只返回了2个子设备信息?A:导致该问题可能的原因除了该设备未开启动态注册、添加到其他网关设备下,还有可能是子设备信息填写错误;

直连设备动态注册问题

Q: LinkKit SDK动态注册接口失败,导致初始化失败,无发建联?A:根据用户日志看到"SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: null",请求还没有到达云端,mqtt证书检验出了问题,原因是用户的设备时间非正确时间。

mqtt 重连策略是

mqtt建联成功之后,mqtt如果中间断开了是会自动进行重试的。重试的时间间隔:1-2-4-8-16-32-64-128-128S...重试间隔是指上一次请求结束之后等待下一次重试建联的时间间隔

如何判断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重连功能?

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&a14NQ5RLiZA|securemode=2,_v=1.7.0,lan=Android,os=9,signmethod=hmacsha1,ext=1,timestamp=1579232298867|]
			

如何从日志判断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://a14NQ5RLiZA.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相关的类

原因:用户方法数超过65536,未支持多dex,导致类未打包进去