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