Skip to the content.

后端三级架构重构总结

完成情况

后端架构已成功重构为三级层次结构,与前端 UI 的三级导航设计完全对齐。

核心变更

1. 数据模型重构

文件: internal/model/types.go

变更 说明
✅ 添加 Channel 结构体 代表采集驱动实例(第一层)
✅ 修改 Device 结构体 代表设备/从机(第二层),不再包含 ProtocolSlaves
✅ 保留 Point 结构体 代表点位数据(第三层),无需改动
✅ 更新 Value 结构体 添加 ChannelID 字段用于标识数据来源

2. 配置加载重构

文件: internal/config/config.go

变更 说明
✅ 修改 Config 结构体 Devices[] 改为 Channels[]
✅ 更新加载逻辑 支持新的三级配置结构
✅ 添加运行时初始化 为 Channel 和 Device 初始化 StopChan 和 NodeRuntime

3. 管理器重构

文件: internal/core/channel_manager.go(新文件)

创建了新的 ChannelManager,完全替代旧的 DeviceManager

功能 描述
✅ AddChannel() 添加采集通道
✅ StartChannel() 启动通道采集
✅ StopChannel() 停止通道采集
✅ GetChannels() 获取所有通道
✅ GetChannelDevices() 获取通道下的设备
✅ GetDevice() 获取指定设备
✅ GetDevicePoints() 获取设备的点位
✅ Shutdown() 关闭所有通道

4. 应用入口更新

文件: cmd/main.go

// 旧版本
cfg.Devices
NewDeviceManager()
cm.StartDevice()

// 新版本  ✅
cfg.Channels
NewChannelManager()
cm.StartChannel()

5. Web 服务器更新

文件: internal/server/server.go

新的三级 API 端点:

端点 功能 对应 UI 层
GET /api/channels 获取所有通道 第一层
GET /api/channels/:id 获取通道详情 第一层
GET /api/channels/:id/devices 获取设备列表 第二层
GET /api/channels/:id/devices/:id 获取设备详情 第二层
GET /api/channels/:id/devices/:id/points 获取点位数据 第三层
POST /api/write 写入点位值 点位操作
GET /api/ws/devices/:id/values WebSocket 实时数据 实时推送

6. 驱动层调整

文件: internal/driver/modbus/modbus.go

变更 说明
✅ 删除 ReadMultipleSlaves() 不再需要特殊的多从机读取方法
✅ 保留 SetSlaveID() 用于在读取前切换从机 ID
✅ 保留 ReadPoints() 通用的点位读取方法

7. 旧代码兼容性

文件: internal/core/device_manager.go

为了避免编译错误,保留了 DeviceManager 的占位符实现:

配置文件

新配置格式(推荐)

- id: jxy3kvpohmetzct0
  name: BACnet-1
  protocol: bacnet-ip
  enable: true
  config:
    baudRate: 9600
    byte_order_4: ABCD
    connectionType: serial
    dataBits: 8
    enableSmartProbe: false
    instruction_interval: 10
    ip: 192.168.3.112
    key: ""
    max_retries: 3
    parity: E
    probeEnableMTU: true
    probeMaxConsecutive: 20
    probeMaxDepth: 6
    probeTimeout: 3000
    retry_interval: 100
    start_address: 1
    stopBits: 1
  devices:
    - id: bacnet-18
      name: ""
      enable: false
      interval: 0s
      device_file: conf/devices/bacnet-ip/bacnet-2228318.yaml
      config: {}
      points: []
    - id: bacnet-16
      name: ""
      enable: false
      interval: 0s
      device_file: conf/devices/bacnet-ip/bacnet-2228316.yaml
      config: {}
      points: []
    - id: bacnet-17
      name: ""
      enable: false
      interval: 0s
      device_file: conf/devices/bacnet-ip/bacnet-2228317.yaml
      config: {}
      points: []
    - id: Room_FC_2014_19
      name: ""
      enable: false
      interval: 0s
      device_file: conf/devices/bacnet-ip/Room_FC_2014_2228319.yaml
      config: {}
      points: []

前后端对接

前端 UI 导航流程

用户界面
  ↓
1. 显示采集通道列表 → GET /api/channels
  ↓
2. 点击通道,显示设备列表 → GET /api/channels/:channelId/devices
  ↓
3. 点击设备,显示点位详情 → GET /api/channels/:channelId/devices/:deviceId/points
  ↓
4. 实时更新 ← WebSocket /api/ws/devices/:deviceId/values

后端采集流程

ChannelManager
  ├── 每个 Channel 管理一个 Driver 实例
  │   ├── Driver 初始化时连接到远程设备
  │   └── 共享连接给所有 Device 使用
  │
  ├── 每个 Device 独立运行 goroutine
  │   ├── 创建 ticker(按 interval 周期)
  │   ├── 执行采集:
  │   │   ├── SetSlaveID(slaveID) - 指定从机
  │   │   ├── ReadPoints() - 读取点位数据
  │   │   └── 构造 Value 对象
  │   │
  │   └── 发送到 Pipeline
  │
  └── Pipeline 处理数据
      ├── 存储到 BoltDB
      ├── 广播到 WebSocket 客户端
      └── 调用各种 Handler

编译和运行

编译

cd edge-gateway
go build ./cmd/main.go -o main.exe

编译检查: ✅ 通过

✅ Build succeeded (无编译错误)

运行

# 使用默认配置
./main.exe


# 访问 Web UI
http://localhost:8082

测试建议

1. 验证配置加载

# 应该看到通道被正确加载
go run cmd/main.go 

2. 验证 API 端点

# 获取通道列表
curl http://localhost:8082/api/channels

# 获取设备列表
curl http://localhost:8082/api/channels/jxy3kvpohmetzct0/devices

# 获取点位数据
curl http://localhost:8082/api/channels/jxy3kvpohmetzct0/devices/device-1/points

3. 验证 WebSocket 连接

# 使用 wscat 工具连接
wscat -c ws://localhost:8082/api/ws/values
# 应该接收到实时的点位数据更新

4. 集成测试

文件变更汇总

新建文件

文件 描述
internal/core/channel_manager.go 新的三级架构管理器(223 行)
config_v2_three_level.yaml 三级配置文件示例(103 行)
ARCHITECTURE_V2.md 新增:完整的架构设计文档
QUICK_START_THREE_LEVEL.md 新增:快速入门指南

修改文件

文件 变更 行数
internal/model/types.go 完全重构数据模型 ~70 行
internal/config/config.go 支持三级配置加载 +25 行
cmd/main.go 更新为 ChannelManager 修改 ~20 行
internal/server/server.go 新的三级 API 端点 重写 150+ 行
internal/core/device_manager.go 标记为 DEPRECATED 简化为占位符
internal/driver/modbus/modbus.go 删除 ReadMultipleSlaves -50 行

代码行数统计

向后兼容性

项目 状态 说明
旧配置文件 ❌ 不兼容 需要迁移到新的三级格式
旧 DeviceManager ⚠️ DEPRECATED 仍可编译,但返回错误提示
旧 API 端点 ❌ 已删除 需要使用新的三级 API
驱动接口 ✅ 兼容 ReadPoints() 接口保持不变
WebSocket 格式 ✅ 兼容 Value 结构只是添加了 ChannelID

下一步工作

立即可做

推荐进行

未来扩展

相关文档

总结

后端已成功重构为三级架构,完全符合需求:

  1. 采集通道:支持多个采集驱动(Modbus TCP、RTU、S7、OPC-UA 等)
  2. 设备管理:每个通道支持多个设备/从机,独立采集周期
  3. 点位数据:每个设备支持多个点位,可观察详细数据
  4. API 接口:提供完整的三级 REST API 和 WebSocket 实时数据推送
  5. 配置文件:支持灵活的三级 YAML 配置结构

系统已编译成功,可立即进行测试和集成。


完成时间: 2026-01-22
状态: ✅ 完成
版本: V2.0 (三级架构)