# 能耗数据上传服务

## 功能说明

本服务用于实现能耗数据上传功能，通过TCP协议与能耗监管系统进行通信，按照XML数据通讯协议规范进行数据传输。

## 主要功能

1. **TCP连接管理**：建立和维护与能耗监管系统的TCP连接
2. **身份认证**：使用MD5算法进行身份验证
3. **数据加密**：使用AES加密算法对能耗数据进行加密传输
4. **定时推送**：每10分钟自动生成并推送能耗数据XML报文
5. **心跳机制**：定期发送心跳包保持连接

## 配置说明

### 应用配置（application-dev.yml）

在Nacos配置中心或本地配置文件中添加以下配置：

```yaml
# 能耗服务配置
energy:
  # 服务端配置
  server:
    host: 183.192.66.5
    port: 9006
  # 认证配置
  auth:
    key: 529f3d2bf15d4d5d  # 128bit密钥
  # 建筑信息
  building:
    id: PT310107BZ4054
  # 网关配置（多个网关用逗号分隔）
  gateway:
    ids: gateway1,gateway2
  # 定时任务配置
  push:
    cron: "0 */10 * * * ?"  # 每10分钟执行一次
  # TDengine配置
  tdengine:
    enabled: true
    url: jdbc:TAOS://localhost:6030/
    user: root
    password: taosdata
    super-table: super_715_332
```

### 数据库配置

服务需要访问MySQL数据库查询设备信息，配置在Nacos配置中心的共享配置中。

## 使用说明

### 1. 网关配置

在配置文件中设置要推送数据的网关ID列表，多个网关用逗号分隔：

```yaml
energy:
  gateway:
    ids: gateway1,gateway2
```

### 2. 启动服务

启动服务后，定时任务会自动执行，每10分钟为每个配置的网关生成并推送XML报文。

### 3. 手动推送

也可以通过API接口手动触发推送：

```java
@Autowired
private EnergyDataService energyDataService;

// 推送指定网关的数据
energyDataService.generateAndPushEnergyData("gatewayId");
```

## 数据流程

1. 根据网关ID查询网关设备信息（`dmp_device`表，`category_type=2`）
2. 根据网关UUID查询所有子设备（`dmp_device`表，`gateway_uuid`匹配，`category_type=3`）
3. 从TDengine时序数据库查询每个设备的最新数据（`super_715_332`超级表）
4. 构建XML报文（包含分项数据和仪表数据）
5. 建立TCP连接并进行身份认证
6. 使用AES加密XML数据
7. 发送加密后的数据包
8. 接收服务端响应

## 协议说明

### 网络层数据包格式

- Head: 2字节，固定值0x1F1F
- Type: 1字节，消息类型（0x01=身份认证，0x02=心跳，0x03=能耗数据）
- Length: 4字节，Data长度（网络字节序）
- Data: 变长，XML数据（UTF-8编码，能耗数据需AES加密）

### 身份认证流程

1. 客户端发送身份认证请求
2. 服务端返回随机序列
3. 客户端计算MD5（密钥+随机序列）并发送
4. 服务端验证MD5并返回认证结果

### 数据加密

- 算法：AES
- 模式：CBC
- 填充：PKCS7/PKCS5
- 密钥：128bit，与认证密钥相同
- 向量：与密钥相同

## 注意事项

1. 确保TDengine数据源配置正确
2. 确保网关ID在数据库中存在且为网关设备（`category_type=2`）
3. 确保网关下有电表子设备（`category_type=3`）
4. 确保TDengine超级表中存在对应设备的数据
5. 网络连接异常时会自动重连
