集成ModuleSDK后,上报数据成功后,设备状态显示为未激活,如何上报子设备状态?
集成ModuleSDK后,目前边缘非直连设备,不能动态获取设备状态,只能根据自身业务是否正常,主动上报设备状态,来更新设备状态。
代码解析:
片段一:初始化构造函数,初始化设备状态数据。
public class ModbusDriver implements GatewayCallback {
/**
* 驱动客户端,与边缘Hub建立MQTT连接
*/
private DriverClient driverClient;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//ONLINE:设备在线。
//OFFLINE:设备离线。
//ABNORMAL:设备异常。
//INACTIVE:设备未激活。
//FROZEN:设备冻结。
static HashMap<String, String> dataMap = new HashMap() {
private static final long serialVersionUID = 821550418990759366L;
{
this.put("0", "ONLINE");//在线
this.put("1", "OFFLINE");//离线
this.put("2", "ABNORMAL");//异常
this.put("3", "INACTIVE");//未激活
this.put("4", "FROZEN");//冻结
}
};
public ModbusDriver() throws Exception {
this.driverClient = DriverClient.createFromEnv();
}
}
片段二:调用上报子设备状态API,循环更新子设备状态。(可根据自身业务调整,此代码只用于演示功能)
public static void main(String[] args) throws Exception {
ModbusDriver modbusDriver = new ModbusDriver();
modbusDriver.start();
}
public void start() throws Exception {
// 设置回调,打开客户端
this.driverClient.setGatewayCallback(this);
this.driverClient.open();
this.scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
UpdateSubDevicesStatusEvent updateSubDevicesStatusEvent = new UpdateSubDevicesStatusEvent();
DeviceStatus deviceStatus = new DeviceStatus();
//设备Id(添加边缘设备时设置)
deviceStatus.setDeviceId("scmj19961031b");
int j = new Random().nextInt(4);
//随机获取设备状态上报
deviceStatus.setStatus(ModbusDriver.dataMap.get(String.valueOf(j)));
updateSubDevicesStatusEvent.setDeviceStatuses(Collections.singletonList(deviceStatus));
try {
ModbusDriver.this.driverClient.updateSubDevicesStatus(String.valueOf(new Random().nextInt(100000)), updateSubDevicesStatusEvent);
} catch (Exception e) {
e.printStackTrace();
}
}
}, 0, 5, TimeUnit.SECONDS);
}