代码解析
项目结构如下
类名称 |
描述 |
---|---|
Device |
设备类,包含设备的id,产品id,slaveId及能力定义。 |
Main |
主启动类。 |
ModbusCfg |
modbus配置。 |
ModbusDriver |
业务主体类,该类含边侧设备添加,设备同步,数据收集及上报等演示。 |
Property |
设备属性。 |
Service |
设备能力。 |
ModbusDriver代码解析
片段一
通过DriverClient.createFromEnv初始化客户端,调用driverClient来完成数据的发送。
1 2 3 4 5 6 7 8 9 10 11 |
public ModbusDriver() throws GeneraException { driverClient = DriverClient.createFromEnv(); } public void start() throws Exception { //设置回调,打开客户端 driverClient.setGatewayCallback(this); driverClient.open(); loadConfig(); startCollection(); } |
片段二
此为从变量points中获取设备数采结果,进行设备数据上报。
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 |
private void startCollection() { scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { //todo 采集modbus点位数据,保存到points //上报数据 List<DeviceService> devices = new LinkedList<>(); for (Device device : modbusCfg.getDevices()) { List<ServiceData> services = new LinkedList<>(); for (Service service : device.getServices()) { Map<String, Object> properties = new HashMap<>(); for (Property property : service.getProperties()) { String key = device.getId() + "." + service.getServiceId() + "." + property.getPropertyName(); properties.put(property.getPropertyName(), points.get(key)); } services.add(new ServiceData(service.getServiceId(), properties, ZonedDateTime.now())); } String deviceId = deviceIds.get(device.getId()); if (deviceId != null) { devices.add(new DeviceService(deviceId, services)); } } try { driverClient.reportSubDevicesProperties(new SubDevicesPropsReport(devices)); } catch (Exception e) { System.out.println(e.getMessage()); } } }, 0, modbusCfg.getPeriod(), TimeUnit.SECONDS); } |
片段三
查看“modbus.json”文件,点位上报数据关系对应:设备id.模型id.服务id.属性名;设备id需要与添加边缘设备时设置的“设备标识码”一致。
{ "period": 10, "server": "192.168.1.2:502", "devices": [{ "id": "8616ac9b-1e66-4fbf-8871-1ca4cb7103fc", "product_id": "c6b39067b0325db34663d3ef421a42f6", "name": "light_1", "slave_id": 1, "services": [{ "service_id": "light", "properties": [{ "property_name": "switch", "register_address": 1234, "data_type": "bool" }] }] }, { "id": "c1ae5e25-23c6-4e01-b64f-7b00b4066667", "product_id": "c6b39067b0325db34663d3ef421a42f6", "name": "light_2", "slave_id": 2, "services": [{ "service_id": "light", "properties": [{ "property_name": "switch", "register_address": 5678, "data_type": "bool" }] }] }] }
片段四
查看“device_ids.json”文件,设备id需要与添加边缘设备时设置的“设备标识码”一致。
{ "8616ac9b-1e66-4fbf-8871-1ca4cb7103fc": "bf40f0c4-4022-41c6-a201-c5133122054a" }