设备数据上报
下面以开关灯为例,通过二进制、json两种格式简要介绍与安卓设备通讯的例子。注意实际开发请只选择以下其中一种消息格式。
注意:msgCode从64-200范围代表控制查询及响应,200-255范围代表消息主动上报,其他范围为AbleCloud内部使用,不允许重复定义。
不需要获取云端处理的响应
private static final int CODE_REPORT = 203;
/**
* 上报数据到AbleCloud云端
*
* @param status 开关状态,1代表开,0代表关
* @param type 开关类型,0代表app控制,1代表本机控制
*/
public void reportLightMsg(int status, int type) {
ACDeviceMsg req = new ACDeviceMsg();
req.setMsgCode(CODE_REPORT);
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("status", status);
jsonObject.put("controltype", type);
req.setJsonPayload(jsonObject.toString());
} catch (JSONException e) {
e.printStackTrace();
}
//把数据真正上报给云端
AC.reportDeviceMsg(req);
}
需要获取云端处理的响应
如果需要获取云端处理的响应,则UDS需要重载处理设备上报并做响应的方法,同时设备端可以使用以下两种接口:
同步接口获取云端处理的响应
private static final int CODE_REPORT = 203;
/**
* 上报数据到AbleCloud云端
*
* @param status 开关状态,1代表开,0代表关
* @param type 开关类型,0代表app控制,1代表本机控制
* @return 上报是否成功
*/
public boolean reportLightMsg(int status, int type) throws JSONException {
ACDeviceMsg req = new ACDeviceMsg();
req.setMsgCode(CODE_REPORT);
JSONObject reqObject = new JSONObject();
reqObject.put("status", status);
reqObject.put("controltype", type);
req.setJsonPayload(reqObject.toString());
//把数据真正上报给云端并获得响应,同步接口阻塞等待云端响应,5000(单位毫秒)为超时时间,建议不要在主线程中调用。
try {
ACDeviceMsg resp = AC.reportDeviceMsg(req, 5000);
JSONObject respObject = new JSONObject(resp.getJsonPayload());
return respObject.optBoolean("result");
} catch (TimeoutException e) {
return false;
}
}
异步接口获取云端处理的响应
//把数据真正上报给云端并获得响应,异步接口,通过回调方式获取响应,回调的方法在主线程中执行;5000(单位毫秒)为超时时间。
AC.reportDeviceMsg(req, 5000, new PayloadCallback<ACDeviceMsg>() {
@Override
public void success(ACDeviceMsg resp) {
try {
JSONObject respObject = new JSONObject(resp.getJsonPayload());
boolean result = respObject.optBoolean("result");
...
} catch (JSONException e) {
}
}
@Override
public void error(ACException e) {
//获取设备响应超时
}
});