| 
 | 
 
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 { 
            // 查询失败 
        } 
    } 
}; 
 
 |  
  
 |   
 
 
 
 |