Skip to the content.

北向增强与离线持久化实现总结

实现日期

2026年2月10日

概述

完成了设备生命周期通过指定MQTT/HTTP通道发送,以及离线消息缓存等核心功能的实现。


1. 数据模型增强 ✅

1.1 已有模型

1.2 设备映射


2. 存储层实现 ✅

2.1 文件

2.2 API接口

// 保存离线消息(超过maxCount时自动删除最早的)
func (s *Storage) SaveOfflineMessage(configID string, data []byte, maxCount int) error

// 获取最早的离线消息(支持分批)
func (s *Storage) GetOfflineMessages(configID string, limit int) ([]OfflineMessage, error)

// 删除指定消息
func (s *Storage) RemoveOfflineMessage(key string) error

2.3 存储特性


3. NorthboundManager增强 ✅

3.1 核心改进

添加ChannelManager引用

type NorthboundManager struct {
    // ...
    cm *ChannelManager  // 用于设备查询
    // ...
}

// 注入方法
func (nm *NorthboundManager) SetChannelManager(cm *ChannelManager)

// 设备查询方法
func (nm *NorthboundManager) findDevice(dID string) any

UpsertMQTTConfig - 设备生命周期事件

UpsertHTTPConfig - HTTP推送配置

OnDeviceStatusChange增强

3.2 文件


4. MQTT客户端 ✅

4.1 设备生命周期事件

4.2 设备状态事件


5. HTTP客户端 ✅

5.1 端点配置

5.2 认证支持

5.3 离线缓存


6. 前端UI增强 ✅

6.1 文件

6.2 HTTP配置卡片

6.3 HTTP Settings Dialog

6.4 前端逻辑

// HTTP配置操作
openHttpSettings(item)
saveHttpSettings()

// 设备映射
fetchAllDevices()
allDevices.value  // 已加载的所有设备

7. API集成 ✅

7.1 后端API端点(需在服务器实现)

POST   /api/northbound/mqtt      - 保存MQTT配置
POST   /api/northbound/http      - 保存HTTP配置
DELETE /api/northbound/mqtt/{id} - 删除MQTT配置
DELETE /api/northbound/http/{id} - 删除HTTP配置
GET    /api/northbound/config    - 获取完整北向配置

7.2 配置结构

{
  "mqtt": [...],
  "http": [...],
  "opcua": [...],
  "sparkplug_b": [...],
  "status": { /* 运行状态 */ }
}

8. 工作流程

8.1 设备添加到MQTT

用户在Web UI选择设备 → UpsertMQTTConfig 
→ Diff检测 → publishDeviceLifecycle("add", device)
→ 消息发送到DeviceLifecycleTopic

8.2 离线消息恢复

消息发送失败 → SaveOfflineMessage到DB
→ 定时任务(FlushInterval)检查连接
→ GetOfflineMessages → 逐条重试
→ 成功则RemoveOfflineMessage

8.3 设备状态变化

南向设备状态改变 → OnDeviceStatusChange
→ 遍历已配置的北向通道
→ 过滤设备映射 → PublishDeviceStatus

9. 配置示例

9.1 MQTT配置

mqtt:
  - id: mqtt-lifecycle
    name: "生命周期MQTT"
    enable: true
    broker: tcp://mqtt:1883
    client_id: edge-gateway
    topic: devices/up
    device_lifecycle_topic: devices/{device_id}/lifecycle
    online_payload: '{"status":"online","timestamp":"%timestamp%"}'
    offline_payload: '{"status":"offline","timestamp":"%timestamp%"}'
    cache:
      enable: true
      max_count: 1000
      flush_interval: 1m
    devices:
      device-001:
        enable: true
        strategy: periodic
        interval: 30s

9.2 HTTP配置

http:
  - id: http-cloud
    name: "云平台HTTP"
    enable: true
    url: https://api.cloud.com
    method: POST
    auth_type: Bearer
    token: "xxx"
    data_endpoint: /api/devices/data
    device_event_endpoint: /api/devices/events
    cache:
      enable: true
      max_count: 1000
      flush_interval: 1m
    devices:
      device-001: true
      device-002: true

10. 编译状态

编译成功


11. 待办事项(建议)

11.1 API实现

11.2 功能完善

11.3 单元测试


12. 关键文件更改清单

文件 变更 状态
internal/model/types.go MQTTConfig、HTTPConfig已有完整定义
internal/storage/boltdb.go 实现SaveOfflineMessage、GetOfflineMessages、RemoveOfflineMessage
internal/core/northbound_manager.go 添加ChannelManager引用、OnDeviceStatusChange增强
internal/core/northbound_manager_ext.go 实现UpsertMQTTConfig、UpsertHTTPConfig、SetChannelManager、findDevice
ui/src/views/Northbound.vue 添加HTTP卡片、HTTP Settings Dialog、HTTP逻辑函数

13. 技术亮点

  1. 事务性配置更新: 原子性保证配置一致性
  2. 智能设备映射: 支持选择性报告,减少网络流量
  3. 自适应缓存: 自动pruning保持存储限制
  4. 统一生命周期: MQTT和HTTP并行支持
  5. 设备查询集成: 利用ChannelManager获取设备详情

14. 性能考量


15. 安全考量


快速开始

编译

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

使用

  1. 启动网关
  2. 访问UI配置MQTT/HTTP通道
  3. 选择要报告的设备
  4. 系统自动在设备变化时发送生命周期事件
  5. 推送失败时自动缓存并重试

完成日期: 2026年2月10日
实现者: AI Agent
版本: 1.0