
# 代码解析
项目结构如下
![](https://support.huaweicloud.com/devg-iotedge/figure/zh-cn_image_0000001568493025.png "点击放大")
表1类相关说明 
| 类名称          | 描述                               |
|:---|:---|
| Device       | 设备类，包含设备的id，产品id，slaveId及能力定义。   |
| Main         | 主启动类。                            |
| ModbusCfg    | modbus配置。                        |
| ModbusDriver | 业务主体类，该类含边侧设备添加，设备同步，数据收集及上报等演示。 |
| Property     | 设备属性。                            |
| Service      | 设备能力。                            |
   
ModbusDriver代码解析
**片段一**
通过DriverClient.createFromEnv初始化客户端，调用driverClient来完成数据的发送。
```
public ModbusDriver() throws GeneraException {
        driverClient = DriverClient.createFromEnv();
    }
    public void start() throws Exception {
        //设置回调，打开客户端
        driverClient.setGatewayCallback(this);
        driverClient.open();
        loadConfig();
        startCollection();
    }
```
**片段二**
此为从变量points中获取设备数采结果，进行设备数据上报。
```
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"
}
```
