南向采集 → 北向服务 双向通信测试报告

测试日期:2026-06-25
测试范围:ShadowCore 统一数据面、Pipeline 扇出、北向反控下发
测试环境:Windows 10,Go 1.x,internal/core 集成测试


1. 背景与目标

架构设计要求:

  1. 南向读:ScanEngine → ShadowCore → ShadowBridge → DataPipeline → 北向(MQTT/OPC UA/HTTP 等)
  2. 北向写:北向客户端 → WritePoint → 驱动写设备 → ShadowCore 同步 → Pipeline 扇出

本次补齐 北向写入后 Shadow/Pipeline 同步(原先 WritePoint 仅写驱动,影子与北向不会立即更新),并新增端到端集成测试验证双向链路。


2. 代码变更摘要

文件 变更
internal/core/channel_manager.go WritePoint 成功后调用 publishWrittenValue;只读点位拒绝写入
internal/core/northbound_southbound_integration_test.go 新增 5 个集成测试用例

2.1 写入闭环逻辑

北向 MQTT/OPC UA/REST
        │
        ▼
ChannelManager.WritePoint()
        │
        ├──► Driver.WritePoint()  ──► 物理设备
        │
        └──► publishWrittenValue()
                    │
                    ▼
             ShadowCore.WriteShadowDevice(source=write_point)
                    │
                    ▼
             ShadowBridge → DataPipeline → NorthboundManager / WebSocket / 历史

3. 测试用例与结果

3.1 集成测试(internal/core/northbound_southbound_integration_test.go

用例 描述 结果 耗时
TestSouthToNorth_CollectionPublishesToPipeline 模拟 ScanEngine 写入 Shadow,验证 Pipeline 收到 2 个点位 ✅ PASS 0.03s
TestNorthToSouth_WritePointUpdatesDeviceAndShadow 北向写 setpoint=42,验证驱动、Shadow、Pipeline 一致 ✅ PASS 0.02s
TestNorthToSouth_WritePointRejectsReadOnly 写只读点位 temp 应拒绝,驱动无写入 ✅ PASS 0.00s
TestBidirectionalCommunication_FullRoundTrip 南向上报 20.0 → 北向下发 88.0 → 设备/Shadow/Pipeline 全链路 ✅ PASS 0.04s
TestNorthboundManager_ReceivesPipelineFromWrite 模拟 NorthboundManager 订阅 Pipeline,验证反控后收到 55.0 ✅ PASS 0.02s

命令

go test ./internal/core/ -run 'TestSouthToNorth|TestNorthToSouth|TestBidirectional|TestNorthboundManager_Receives' -v -count=1

输出摘要

--- PASS: TestSouthToNorth_CollectionPublishesToPipeline (0.03s)
--- PASS: TestNorthToSouth_WritePointUpdatesDeviceAndShadow (0.02s)
--- PASS: TestNorthToSouth_WritePointRejectsReadOnly (0.00s)
--- PASS: TestBidirectionalCommunication_FullRoundTrip (0.04s)
--- PASS: TestNorthboundManager_ReceivesPipelineFromWrite (0.02s)
PASS
ok  	github.com/anviod/edgex/internal/core	0.187s

3.2 回归测试

范围 结果
go test ./internal/core/ -run 'Shadow\|WritePoint\|Northbound\|Pipeline' ✅ PASS (1.582s)

4. 北向协议写入能力现状

协议 上报(读) 反控(写) 写入路径
MQTT Publish(v) via Pipeline SubscribeTopichandleWriteRequestsb.WritePoint ✅ 已实现
OPC UA Server Update(v) via Pipeline 客户端 Write → sb.WritePoint ✅ 已实现
edgeOS(MQTT) Publish(v) handleWriteCommandsb.WritePoint ✅ 已实现
edgeOS(NATS) Publish(v) Request/Reply → sb.WritePoint ✅ 已实现
HTTP 定时/批量上报 无订阅写通道 ⚠️ 仅上报
Sparkplug B Publish(v) 无写订阅 ⚠️ 仅上报
REST API /api/values/realtime POST /api/writecm.WritePoint ✅ 已实现

本次变更使所有经 ChannelManager.WritePoint 的北向写操作均同步 Shadow 并扇出 Pipeline,与南向采集数据同源。


5. 验证场景说明

5.1 南向 → 北向(读)

  1. ScanEngine 采集驱动数据
  2. ShadowCore.WriteShadowDevice(source=scan_engine)
  3. ShadowBridge 订阅变更,推入 DataPipeline
  4. NorthboundManager.handleValue 扇出至 MQTT/OPC UA/Sparkplug/edgeOS

5.2 北向 → 南向(写)

  1. 北向客户端发送写命令(MQTT write topic / OPC UA Write / REST /api/write
  2. ChannelManager.WritePoint 校验 RW 权限
  3. 驱动 WritePoint 下发至设备
  4. publishWrittenValue 更新 Shadow(source=write_point)
  5. ShadowBridge → Pipeline → 北向/UI 实时刷新

6. 结论

项目 状态
南向采集 → Shadow → Pipeline → 北向上报 ✅ 通过
北向反控 → 驱动写设备 ✅ 通过
北向写后 Shadow/Pipeline 同步 本次补齐
只读点位保护 ✅ 通过
端到端双向 round-trip ✅ 通过

总体结论:南向采集与北向服务双向通信链路已打通,北向写入可正确下发至设备,并通过 ShadowCore 统一数据面回传至 Pipeline 与北向订阅方。


7. 后续建议

  1. HTTP/Sparkplug B 写通道:按业务需求增加写订阅或 NCMD 处理
  2. 写后读校验:可选在 WritePoint 成功后触发一次即时读确认(Modbus 等)
  3. 现场联调:使用 Modbus 仿真器 + MQTT 写 topic 做真实设备 E2E 验证