# 七、设备

# (一)概述

设备数据是登记在门户系统中的物联产品。

# (二)设备集合[DeviceSet]

设备集合是设备要素的集合,用户可按实际需求将不同设备要素划分到不同的设备集合中去。每个设备仅能从属于一个设备集合。其常用属性如下:

属性名 值类型 属性描述
name String 设备集合名称
remark String 备注
icon Icon 图标
symbol PointSymbol 点符号
deviceProduct DeviceProduct 设备产品分类
isPublish Boolean 是否发布

常用方法如下:(get/set方法略)

方法名 返回类型 方法描述
queryDevices void 查询集合下的所有设备要素
createDevice void 创建设备
updateDevice void 更新设备信息
deleteDevice void 删除设备
queryMonitorConfig void 获取监控量配置信息

# 1、获取设备集合

初始化成功后,可直接从Cellsys的organization对象中获取到组织下所有的设备集合。

/*执行初始化成功后,可直接获取到设备集合*/
List<DeviceSet> deviceSets = Cellsys.organization.getDeviceSets();//deviceSets可能为null
if (deviceSets != null && deviceSets.size() > 0) {
    DeviceSet deviceSet = deviceSets.get(0);
    String name = deviceSet.getName();//集合名称
    String remark = deviceSet.getRemark();//集合备注信息
    DeviceProduct deviceProduct = deviceSet.getDeviceProduct();
    Icon icon = deviceSet.getIcon();//获取图标对象
    try {
        int biemapSize = 20;//位图宽高(px)
        Bitmap bitmap = CsBitmapFactory.convertByIcon(icon, biemapSize);//根据Icon类生成Bitmap对象
    } catch (Exception e) {
        e.printStackTrace();
    }
    PointSymbol pointSymbol = deviceSet.getSymbol();//获取地图符号对象
    try {
        Bitmap bitmap = CsBitmapFactory.convertByPointSymbol(pointSymbol);//根据pointSymbol生成Bitmap对象
    } catch (Exception e) {
        e.printStackTrace();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# (1)获取监控量配置信息

不同的设备产品有不同的监测功能,提供不同的监控量信息。如 产品-温湿度传感器 会提供“温度”、“湿度”两种监控量。而升级版产品-野外气象站,除了“温度”、“湿度”外,还会提供“光照强度”、“风向”、“风速”等监控量。

而这些配置信息可以从设备集合对象中查询。查询方法如下:

//查询配置信息
deviceSet.queryMonitorConfig(new CsCallback<QueryResult<MonitorConfig>>() {
    @Override
    public void onSuccess(QueryResult<MonitorConfig> object) {
        if (object.data != null && object.data.size() > 0) {
            List<MonitorConfig> monitorConfigs = object.data;
            for (MonitorConfig monitorConfig : monitorConfigs) {
                List<MonitorMetaData> monitorMetaDatas = monitorConfig.getMonitorMetaDatas();
                for (MonitorMetaData monitorMetaData : monitorMetaDatas) {
                    String name = monitorMetaData.getName();//监控值名称,例:温度
                    String key = monitorMetaData.getKey();//监控值key,例:temperture
                    String unit = monitorMetaData.getMeasureUnit();//监控值单位,例:℃
                    if (unit == null) {
                        //没有单位
                    } else {
                        //有单位
                    }
                    String formatType = monitorMetaData.getFormatType();//数据格式类型
                    if (formatType == null) {
                        //常规数据格式(Number型数据)
                    } else if (formatType.equals("datetime")) {
                        //时间类型数据(要求数据类型为时间戳)
                    } else if (formatType.equals("dict")) {
                        //字典类型(要求数据类型为整形的字典ID)
                    } else {
                        //未定义的异常数据
                    }
                }
            }
        }
    }
    
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
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

# 2、新增设备集合

设备集合通过组织[Organization]对象创建。具体操作见代码示例:

/*使用默认图标创建设备集合*/
DeviceProduct deviceProduct = DeviceProduct.Locator;//要创建的设备集合所属的设备产品
Cellsys.organization.createDeviceSet("集合名称", "集合描述", deviceProduct, new CsCallback<DeviceSet>() {
    @Override
    public void onSuccess(DeviceSet object) {
        //创建成功
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        //创建失败
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//失败信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3、修改设备集合

设备集合通过组织[Organization]对象修改。具体操作见代码示例:

deviceSet.setName("修改名称");
deviceSet.setRemark("修改备注");
deviceSet.setPublish(true);//修改发布状态
Cellsys.organization.updateDeviceSet(deviceSet, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //修改成功
        String name = deviceSet.getName();//修改后的名称
        String remark = deviceSet.getRemark();//修改后的备注
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        //修改失败
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//失败信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 4、删除设备集合

设备集合通过组织[Organization]对象删除。具体操作见代码示例:

Cellsys.organization.deleteDeviceSet(deviceSet, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //删除成功
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        //修改失败
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//失败信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

# (三)设备要素[DeviceFeature]

一个实体设备可用一个设备要素对象表示。其常用属性如下:

属性名 值类型 属性描述
name String 设备集合名称
remark String 备注
icon Icon 图标
symbol PointSymbol 点符号
location Location 设备位置
bluetoothMac MacAddress 设备蓝牙Mac地址
bindMember CommonInfo 设备关联人员的简易信息

设备要素的常用方法如下:(get/set方法略)

方法名 返回类型 方法描述
queryMonitorReports void 查询监控量报告
queryBindMember void 查询具体的关联人员信息

# 1、获取设备要素

设备集合[DeviceSet]提供了query方法来查询自身集合中的设备要素。具体操作见代码示例:

deviceSet.queryDevices(new CsCallback<QueryResult<DeviceFeature>>() {
    @Override
    public void onSuccess(QueryResult<DeviceFeature> object) {
        /*分页信息-查询方法特有*/
        PageInfo pageInfo = object.pageInfo;//查询接口特有的分页信息
        int totalCount = pageInfo.totalCount;//数据总数
        int totalPage = pageInfo.totalPage;//总页数
        int pageNo = pageInfo.pageNo;//当前页码(从1开始)
        int pageSize = pageInfo.pageSize;//每页查询数量(注意!不一定和当前查询的数据总量匹配)
                     
        /*获取查询结果*/
        List<DeviceFeature> deviceFeatures = object.data;
        if (deviceFeatures != null && deviceFeatures.size() > 0) {//查询结果可能为null
            for (DeviceFeature deviceFeature : deviceFeatures) {
                /*设备要素基础信息获取示例*/
                String name = deviceFeature.getName();//设备要素名称
                String remark = deviceFeature.getRemark();//备注
                PointSymbol pointSymbol = deviceFeature.getSymbol();//路线符号
                Location location = deviceFeature.getLocation();//设备位置,可能为null
                MacAddress macAddress = deviceFeature.getBluetoothMac();
                String mac = macAddress.formatString;//formatString是带冒号的标准格式,如:10:51:1C:65:48:3E
                CommonInfo bindMemberInfo = deviceFeature.getBindMember();
                String binderName = bindMemberInfo.getName();//绑定人姓名
            }
        }
    }   
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
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

# (1)获取监控量报告[MonitorReport]

登记在[Cellsys 时空管理平台](广州空天通讯技术服务有限公司 (airkoon.com) (opens new window))上的物联产品中,有通讯联网(包括互联网、卫星通讯、其他无线通讯技术)能力的设备可将数据回传到云设备上,形成监控报告。目前监控报告主要由传感器产品回传,显示产品监测到的环境数值。

deviceFeature.queryMonitorReports(new CsCallback<QueryResult<MonitorReport>>() {
    @Override
    public void onSuccess(QueryResult<MonitorReport> object) {
        List<MonitorReport> monitorReports = object.data;
        if (monitorReports != null && monitorReports.size() > 0) {
            for (MonitorReport monitorReport : monitorReports) {
                /*监控报告数据*/
                DateTime dateTime = monitorReport.getReportTime();//监控报告汇报时间
                List<MonitorItem> monitorItems = monitorReport.getMonitorItems();
                for (MonitorItem monitorValue : monitorItems) {
                    String formatString = monitorValue.getFormatString();//监控报告项的格式化输出(不同报告项有不同的输出结果)。用于界面显示。例:99.3%
                    String name = monitorValue.getName();//监控量名称。例:电量
                    double value = monitorValue.getValue();//监控量数值。例99.3
                    String unit = monitorValue.getMeasureUnit();//监控量单位。例:%
                }
            }
        }
    }

    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
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

# (2)查询绑定的成员

注意:一个设备只能与一个成员进行关联绑定。当有其他成员绑定设备时,会自动与之前的成员解绑。

deviceFeature.queryBindMember(new CsCallback<QueryResult<MemberFeature>>() {
    @Override
    public void onSuccess(QueryResult<MemberFeature> object) {
        MemberFeature memberFeature = object.data.get(0);//绑定人信息
    }

    @Override
    public void onFailure(ErrorMessage errorMessage) {
        if (errorMessage.getCode() == Code.NULL_DATA_EXCEPTION) {
            //该设备没绑定人
        } else {
            //常规错误信息
            int errorCode = errorMessage.getCode();//错误码
            String errorMsg = errorMessage.getMessage();//错误信息
        }
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# (3)设备Mac

MacAddress bluetoothMac = deviceFeature.bluetoothMac;//设备Mac信息
String formatStringMac = bluetoothMac.formatString;//带冒号的标准格式,例:AA:BB:CC:DD:EE:FF
String valueMac = bluetoothMac.value;//不带冒号,例:AABBCCDDEEFF
1
2
3

设备的Mac地址使用MacAddress类,可避免设备Mac字符串格式不统一问题。

# (4)设备定位

Location location = deviceFeature.location;//设备定位信息
MapPoint mapPoint = location.mapPoint;//定位坐标
CoordinateSystem coordinateSystem = mapPoint.getCoordinateSystem();//定位坐标系
double latitude = mapPoint.latitude;//纬度
double longitude = mapPoint.longitude;//经度

DateTime dateTime = location.time;//定位时间
long timeStamp = dateTime.value;//定位时间的时间戳格式(毫秒级)
String timeFormat = dateTime.toFormatString();//定位时间,"yyyy-MM-dd HH:mm:ss"格式
String timeFormat2 = dateTime.toFormatString("yyyy-MM-dd HH:mm:ss");//定位时间转换成指定格式的字符串
1
2
3
4
5
6
7
8
9
10

Location定位类,同时包含定位坐标、定位时间两样数据。

# 2、新增设备要素

设备集合[DeviceSet]提供了create方法来新增自身集合中的设备要素。具体代码示例如下:

MacAddress mac = new MacAddress("10521C635214");//以Mac地址10:52:1C:63:52:14为例
deviceSet.createDevice("设备名称", "设备描述", mac, new CsCallback<DeviceFeature>() {
    @Override
    public void onSuccess(DeviceFeature object) {
        //创建成功,从回调中可直接使用新的设备实例
        String name = object.getName();
        String remark = object.getRemark();
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3、修改设备要素

设备集合[DeviceSet]提供了update方法来修改自身集合中的设备要素。具体代码示例如下:

deviceFeature.setName("修改后名称");
deviceFeature.setRemark("修改后备注");
deviceSet.updateDevice(deviceFeature, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //修改成功,相应修改已同步到eventFeature对象
        deviceFeature.getName();
        deviceFeature.getRemark();
    }
     
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 4、删除设备要素

设备集合[DeviceSet]提供了delete方法来修改自身集合中的设备要素。具体代码示例如下:

deviceSet.deleteDevice(deviceFeature, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //删除成功
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12

# 5、设备的绑定与解绑

设备与成员的绑定、解绑操作有成员要素[MemberFeature]发起。具体代码示例如下:

/*设备绑定*/
memberFeature.bindDevice(deviceFeature, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //绑定成功
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});

/*设备解绑*/
memberFeature.unbindDevice(deviceFeature, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //解绑成功
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        int errorCode = errorMessage.getCode();//错误码
        String errorMsg = errorMessage.getMessage();//错误信息
    }
});
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