设备端检测自己是否在线的方法是:添加一个自定义权限为发布和订阅的topic,设备端用该topic向平台发送消息后,平台会把消息原样返回设备端。
离线判定逻辑:
- 严格的:发送消息后,5秒内没有收到消息算失败,出现1次失败,判定为离线
- 普通的:发送消息后,5秒内没有收到消息算失败,连续2次失败,判定为离线
- 宽松的:发送消息后,5秒内没有收到消息算失败,连续3次失败,判定为离线
在服务端中判断设备是否在线可以使用平台提供api来实现。可以使用的接口为:GetDeviceStatus,BatchGetDeviceState,QueryDeviceDetail,BatchQueryDeviceDetail,RRpc。
GetDeviceStatus,BatchGetDeviceState,QueryDeviceDetail,BatchQueryDeviceDetail这些接口会返回设备状态Status,取值:
ONLINE:设备在线。OFFLINE:设备离线。UNACTIVE:设备未激活。DISABLE:设备已禁用。
调用rrpc接口判断设备是否示例代码如下:
RRpcRequest request = new RRpcRequest(); request.setProductKey(productKey); request.setDeviceName(deviceName); request.setRequestBase64Byte(Base64.encodeBase64String("Hello World".getBytes()));//消息内容,base64编码 request.setTimeout(5000); //响应超时设置 // 获取结果 RRpcResponse response = (RRpcResponse) client.getAcsResponse(request); if (response != null) { //使用RrpcCode判断设备状态 //SUCCESS:成功,设备在线 //TIMEOUT:设备响应超时 //OFFLINE:设备离线 //HALFCONN:设备离线(设备连接断开,但是断开时间未超过一个心跳周期) //UNKNOWN:系统异常 if ("SUCCESS".equals(response.getRrpcCode())) { System.out.println("RRPC 检测:" + deviceName + "设备在线"); } else if (response.getRrpcCode() == null) { System.out.println("RRPC 检测:" + deviceName + "设备可能不存在"); } else { // 其他状态归结为设备不在线,也可以根据业务情况自行区分处理 System.out.println("RRPC 检测:" + deviceName + "设备不在线:"); } } else { System.out.println("RRPC 检测:" + "接口调用不成功"); }