收藏官网首页
查看: 7394|回复: 0

Android SDK 2.0文档 7-SDK流程之设备控制部分

563

主题

1222

帖子

8097

积分

版主

Rank: 7Rank: 7Rank: 7

积分
8097
跳转到指定楼层
楼主
发表于 2016-7-7 16:25:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
教您5分钟接入机智云,实现傻瓜式开发
3.5.        设备控制部分SDK通过字典键值对方式进行设备控制和状态接收。SDK接收到APP下发的指令字典后,对应解析为设备可识别的数据,发送给设备。反之,SDK收到设备回复或上报的数据后,对应解析为字典键值对上报给APP。
智能设备需正确烧写了GAgent固件和机智云串口通讯协议。如果设备定义了数据点,APP发送的指令必须符合数据点定义。如果设备没有定义数据点,设备指令可以按照透传数据以自定义格式下发。
3.5.1.        设备控制流程图
3.5.2.        发送控制指令设备订阅变成可控状态后,APP可以发送操作指令。操作指令是字典格式,键值对为数据点名称和值。操作指令的确认回复,通过didReceiveData回调返回。
APP下发操作指令时可以指定sn,通过回调参数中的sn能够对应到下发指令是否发送成功了。但回调参数dataMap有可能是空字典,这取决于设备回复时是否携带当前数据点的状态。
如果APP下发指令后只关心是否有设备状态上报,那么下发指令的sn可填0,这时回调参数sn也为0。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
* 以下代码为App使用sn的示例。如果App不使用sn,sn可设为0,回调中也不需要判断sn
*/
// mDevice是从设备列表中获取到的设备实体对象,设置监听
mDevice.setListener(mListener);

// 订阅设备并变为可控状态后,执行开灯动作
int sn = 5; // 如果App不使用sn,此处可写成 int sn = 0;
ConcurrentHashMap<String, Object> command = new ConcurrentHashMap<String, Object> ();
command.put("LED_OnOff", true);
mDevice.write(command, sn);

// 实现回调
GizWifiDeviceListener mListener = new GizWifiDeviceListener() {
    @Override
    public  void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) {
        if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
            // 如果App不使用sn,此处不需要判断sn
            if (sn == 5) {
                // 命令序号相符,开灯指令执行成功
            } else {
                // 其他命令的ack或者数据上报
            }
        } else {
            // 操作失败
        }
    }
};

3.5.3.        接收设备状态设备订阅变成可控状态后,APP可以随时收到设备状态的主动上报,仍然通过didReceiveData回调返回。设备上报状态时,回调参数sn为0,回调参数dataMap为设备上报的状态。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
GizWifiDeviceListener mListener = new GizWifiDeviceListener() {
    @Override
    public void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) {
        if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {

        // 已定义的设备数据点,有布尔、数值和枚举型数据
        if (dataMap.get("data") != null) {
            ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) dataMap.get("data");

                // 普通数据点,打印对应的key和value
                StringBuilder sb = new StringBuilder();
                for (String key : map.keySet()) {
                    sb.append(key + "  :" + map.get(key) + "\r\n");
                    Toast.makeText(DeviceControlActivity.this,
                            sb.toString(), Toast.LENGTH_SHORT).show();
                }

                // 扩展数据点,key如果是“BBBB”
                byte[] bytes = (byte[]) map.get("BBBB");
                String string = Arrays.toString(bytes);
                Toast.makeText(DeviceControlActivity.this,
                        string, Toast.LENGTH_SHORT).show();
            }

        // 已定义的设备故障数据点,设备发生故障后该字段有内容,没有发生故障则没内容
            if (dataMap.get("faults") != null) {
            ConcurrentHashMap<String, Object> map =  (ConcurrentHashMap<String, Object>)dataMap.get("faults");
                StringBuilder sb = new StringBuilder();

                for (String key : map.keySet()) {
                    sb.append(key + "  :" +  map.get(key) + "\r\n");
                    Toast.makeText(DeviceControlActivity.this,
                            sb.toString(), Toast.LENGTH_SHORT).show();
                }
            }

        // 已定义的设备报警数据点,设备发生报警后该字段有内容,没有发生报警则没内容
            if (dataMap.get("alerts") != null) {
            ConcurrentHashMap<String, Object> map =  (ConcurrentHashMap<String, Object>)dataMap.get("alerts");
                StringBuilder sb = new StringBuilder();

                for (String key : map.keySet()) {
                            sb.append(key + "  :" +  map.get(key) + "\r\n");
                            Toast.makeText(DeviceControlActivity.this,
                            sb.toString(), Toast.LENGTH_SHORT).show();
                }
            }

        // 透传数据,无数据点定义,适合开发者自行定义协议自行解析
            if (dataMap.get("binary") != null) {
                byte[] binary = (byte[]) dataMap.get("binary");
                Log.i("", "Binary data:"
                        + bytesToHex(binary, 0, binary.length));
            }
        }
    }
};

3.5.4.        设备状态查询设备订阅变成可控状态后,APP可以查询设备状态。设备状态查询结果也通过didReceiveData回调返回,回调参数sn为0。回调参数dataMap为设备回复的状态。
【示例代码】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// mDevice是从设备列表中获取到的设备实体对象,设置监听
mDevice.setListener(mListener);
mDevice.getDeviceStatus();

// 实现回调
GizWifiDeviceListener mListener = new GizWifiDeviceListener() {
    @Override
    public  void didReceiveData(GizWifiErrorCode result, GizWifiDevice device, ConcurrentHashMap<String, Object> dataMap, int sn) {
        if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
            // 数据解析与3.5.3相同
        } else {
            // 查询失败
        }
    }
};


1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表