设备数据
设备数据分为设备属性数据与设备状态数据。
- 他们都可以进行实时消息订阅,进行订阅操作后,APP和云端建立长连接, 设备属性数据的变化与设备状态的变更会通过云端实时推送给APP。
- 其中设备属性数据同时提供了获取历史属性数据以及当前设备属性数据的接口。
代码示例
设备属性数据
设备属性可前往【控制台->产品管理->属性设置】进行创建。
以空气净化器为例来说明。
属性名 | 类型 | 描述 |
---|---|---|
pm25 | 整数 | pm2.5值 |
speed | 整数 | 当前风机转速 |
mode | 字符串 | 当前净化器状态(auto(自动), high(高速), medium(中速), low(低速)) |
(1)获取设备属性
设备属性的当前数据和历史数据可前往【控制台->设备管理->对应设备详情->属性数据】进行查看。
- 获取设备历史属性数据
//设置过滤条件 pm25 = 10 && speed < 20
Criteria criteria = Criteria.create()
.andWhere(Expression.eq("pm25", 10))
.andWhere(Expression.lt("speed", 20));
long now = System.currentTimeMillis();
//新建历史数据搜索条件实例
QueryOption option = new QueryOption(criteria)
//默认返回**所有**属性字段,如下设置后结果只返回 @"pm25"和@"speed" 字段
//.projection(new String[]{"pm25", "speed"})
.startTime(now - TimeUnit.DAYS.toMillis(1))
.endTime(now)
.limit(20);
//发起查询请求
AC.deviceDataMgr().fetchHistoryProperty("subDomain", 45, option,
new PayloadCallback<List<String>>() {
@Override
public void success(List<String> strings) {
//拉取数据成功后的操作
ArrayList<AirPropertyRecord> list = new ArrayList<>();
if (strings != null) {
Gson gson = new Gson();
for (String string : strings) {
list.add(gson.fromJson(string, AirPropertyRecord.class));
}
}
}
@Override
public void error(ACException e) {
//拉取数据错误提示
}
}
);
其中AirPropertyRecord是业务相关的JavaBean类
public class AirPropertyRecord extends PropertyRecord {
public int pm25;
public int speed;
}
默认情况下(即QueryOtion.projection == null时),属性数据包含设备ID和该条数据的时间戳,可将PropertyRecord作为基类
public class PropertyRecord {
public long id;
public long timestamp;
}
相关注意事项如下:
- option搜索实例,若不设置则默认limit为20条,上限为1000条。
- option搜索实例,若不设置搜索起始时间startTime,则默认从最早的数据开始搜索。
- option搜索实例,若不设置搜索结束时间endTime,则默认查询到最新一条数据。
- option搜索实例,若不设置检索返回属性字段数组projection,则默认返回所有属性字段。也可自定义搜索返回字段如:option.projection(new String[]{"pm25", "speed"});
- option搜索实例可以对属性字段设置多种过滤条件,通过Expression类:相等(eq),小于(lt),大于(gt),小于等于(lte),大于等于(gte)。
- 返回结果均带有timestamp属性。
- 获取设备当前属性数据
AC.deviceDataMgr().fetchCurrentProperty("subDomain", 45,
new PayloadCallback<String>() {
@Override
public void success(String string) {
//拉取数据成功后的操作
if (string != null) {
new Gson().fromJson(string, AirPropertyRecord.class);
}
}
}
);
(2)订阅设备属性实时变化
当设备上报属性数据至UDS后,UDS可调用属性数据存储并推送接口,对对应设备进行属性数据实时推送,此时APP只需要订阅该设备的属性数据推送并设置了回调处理函数,则可以实现实时数据的获取与处理。
- 订阅设备属性数据实时推送消息:
AC.deviceDataMgr().subscribeProperty("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//订阅成功提示
}
@Override
public void error(ACException e) {
//订阅失败提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明订阅操作成功
- 取消订阅设备属性数据实时推送消息:
AC.deviceDataMgr().unSubscribeProperty("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//取消订阅提示
}
@Override
public void error(ACException e) {
//取消订阅提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明取消订阅操作成功
- 下面同时提供了取消订阅所有设备实时属性数据推送的接口。
- 取消订阅所有设备属性数据实时推送消息:
AC.deviceDataMgr().unSubscribeAllProperty();
- 设置设备属性数据实时消息回调:
// 注册回调
AC.deviceDataMgr().registerPropertyReceiver(/*ACDeviceDataMgr.PropertyReceiver*/ receiver);
// 解注册回调
AC.deviceDataMgr().unregisterPropertyReceiver(/*ACDeviceDataMgr.PropertyReceiver*/ receiver);
PropertyReceiver是回调接口
interface PropertyReceiver {
void onPropertyReceive(String subDomain, long deviceId, String value);
}
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- value为设备新增的所有属性键值
- 此回调方法可以在您代码的任意位置进行设置。
可以用JavaBean类来表示value的值,比如空气净化器的属性
AirProperty status = new Gson().fromJson(value, AirProperty.class);
public class AirProperty {
public int pm25;
public int speed;
}
设备状态数据
- 订阅设备状态实时消息
AC.deviceDataMgr().subscribeOnlineStatus("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//订阅成功提示
}
@Override
public void error(ACException e) {
//订阅失败提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明订阅操作成功
- 下面同时提供了取消订阅所有设备状态推送的接口。
- 取消订阅设备状态实时消息
AC.deviceDataMgr().unSubscribeOnlineStatus("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//取消订阅提示
}
@Override
public void error(ACException e) {
//取消订阅提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明取消订阅操作成功
- 取消订阅所有设备状态推送消息:
AC.deviceDataMgr().unSubscribeAllOnlineStatus();
- 设置设备实时状态回调:
// 注册回调
AC.deviceDataMgr().registerOnlineStatusListener(/*ACDeviceDataMgr.OnlineStatusListener*/ listener);
// 解注册回调
AC.deviceDataMgr().unregisterOnlineStatusListener(/*ACDeviceDataMgr.OnlineStatusListener*/ listener);
OnlineStatusListener是回调接口
interface OnlineStatusListener {
void onStatusChanged(String subDomain, long deviceId, boolean online);
}
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- online为设备状态,true为在线,false为离线
- 此回调方法可以在您代码的任意位置进行设置。
设备故障数据
- 获取设备当前故障属性属性值
```java
AC.deviceDataMgr().fetchWarningStatus("subDomain", 45,
new PayloadCallback
其中AirWarningRecord是业务相关的JavaBean类
相关注意事项如下:
>1. **SubDomain**为设备所属的子域
>2. **deviceId**为设备的激活id
>3. **返回值**为设备故障属性数据,其中键值对与管理平台中产品故障属性定义相对应。 其中键"_overall"的数据代表 0:整机无故障,1:整机有故障。
- 订阅设备故障属性数据实时消息
```objc
[ACDeviceDataManager subscribeFaultsWithSubDomain:@"subDomain"
deviceId:45
callback:^(NSError *error) {
if (error) {
//订阅失败提示
return;
}
//订阅成功提示
}];
AC.deviceDataMgr().subscribeWarning("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//订阅成功提示
}
@Override
public void error(ACException e) {
//订阅失败提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明订阅操作成功
- 下面同时提供了取消订阅所有设备故障属性数据推送的接口。
- 取消订阅所有故障属性数据推送消息:
AC.deviceDataMgr().unSubscribeAllWarning();
- 取消订阅设备故障属性数据实时消息
AC.deviceDataMgr().unSubscribeWarning("subDomain", 45,
new VoidCallback() {
@Override
public void success() {
//取消订阅提示
}
@Override
public void error(ACException e) {
//取消订阅提示
}
}
);
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- 如果回调结果无错误则表明取消订阅操作成功
- 设置设备实时故障属性数据回调:
// 注册回调
AC.deviceDataMgr().registerWarningReceiver(/*ACDeviceDataMgr.WarningReceiver*/ receiver);
// 解注册回调
AC.deviceDataMgr().unregisterWarningReceiver(/*ACDeviceDataMgr.WarningReceiver*/ receiver);
WarningReceiver是回调接口
interface WarningReceiver {
void onWarningReceive(String subDomain, long deviceId, String value);
}
相关注意事项如下:
- SubDomain为设备所属的子域
- deviceId为设备的激活id
- value为设备故障属性数据,其中键值对与管理平台中产品故障属性定义相对应。 其中键"_overall"的数据代表 0:整机无故障,1:整机有故障。
- 此回调方法可以在您代码的任意位置进行设置。