设备数据上报

下面以开关灯为例,通过二进制、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) {
        //获取设备响应超时
    }
});