设备控制

下面以开关灯为例,通过二进制、json两种格式简要介绍与安卓设备通讯的例子。实际开发请只选择以下其中一种消息格式。

注意:msgCode从[64,200)范围代表控制查询及响应,[200,255]范围代表消息主动上报,其他范围为AbleCloud内部使用,不允许重复定义。

使用二进制消息格式进行通讯

设备控制

以开关灯为例,协议如下:

//请求数据包
{ 68 :[
     //关灯(二进制流,由厂商自己解析)
     { 0 , 0 , 0 , 0 },
     //开灯(二进制流,由厂商自己解析)   
     { 1 , 0 , 0 , 0 }
]}
//响应数据包  
{ 102 :[
     //失败(二进制流,由厂商自己解析)
     { 0 , 0 , 0 , 0 },
     //成功(二进制流,由厂商自己解析)        
     { 1 , 0 , 0 , 0 }
]}
private static final int CODE_SWITCH_REQ = 68;
private static final int CODE_SWITCH_RESP = 102;

private static final int OFF = 0;
private static final int ON = 1;

AC.handleMsg(new ACMsgHandler() {
    @Override
    public void handleMsg(ACDeviceMsg req, ACDeviceMsg resp) {
        switch (reqMsg.getMsgCode()) {
            case CODE_SWITCH_REQ:
                //请求消息体
                byte[] payload = reqMsg.getPayload();
                if (payload[0] == ON) {
                    if (Light.turnLightOn()) {
                        respMsg.setPayload(new byte[]{1, 0, 0, 0});    //开灯成功
                    } else
                        respMsg.setPayload(new byte[]{0, 0, 0, 0});    //开灯失败
                } else {
                    if (Light.turnLightOff()) {
                        respMsg.setPayload(new byte[]{1, 0, 0, 0});    //关灯成功
                    } else
                        respMsg.setPayload(new byte[]{0, 0, 0, 0});    //关灯失败
                }
                respMsg.setMsgCode(CODE_SWITCH_RESP);
                break;
        }
    }
});

使用JSON消息格式进行通讯

设备控制

以开关灯为例,协议如下:

//请求数据包
{ 70 :[
     //关灯
     {"switch", 0}
     //开灯
     {"switch", 1}
]}
//响应数据包--JSON格式的resp不需要设置msgCode
{ 
     //失败
     {"result", false},
     //成功   
     {"result", true}
]}
private static final int CODE_JSON = 70;

private static final int OFF = 0;
private static final int ON = 1;

AC.handleMsg(new ACMsgHandler() {
    @Override
    public void handleMsg(ACDeviceMsg req, ACDeviceMsg resp) {
        //JSON格式的resp不需要设置msgCode
        switch (reqMsg.getMsgCode()) {
            case CODE_JSON:
                //请求消息体
                JSONObject req = new JSONObject(reqMsg.getJsonPayload());
                //请求操作类型,关灯或开灯
                int value = req.getInt("switch");
                //响应消息体
                JSONObject resp = new JSONObject();
                if (value == ON) {
                    if (Light.turnLightOn()) {
                        resp.put("result", true);
                        respMsg.setJsonPayload(resp.toString());    //开灯成功
                    } else {
                        resp.put("result", false);
                        respMsg.setJsonPayload(resp.toString());    //开灯失败
                    }
                } else if (value == OFF) {
                    if (Light.turnLightOff()) {
                        resp.put("result", true);
                        respMsg.setJsonPayload(resp.toString());    //关灯成功
                    } else {
                        resp.put("result", false);
                        respMsg.setJsonPayload(resp.toString());    //关灯失败
                    }
                }
                break;
        }
    }
});