南向采集 → 北向服务 双向通信测试报告
测试日期:2026-06-25
测试范围:ShadowCore 统一数据面、Pipeline 扇出、北向反控下发
测试环境:Windows 10,Go 1.x,internal/core 集成测试
1. 背景与目标
架构设计要求:
- 南向读:ScanEngine → ShadowCore → ShadowBridge → DataPipeline → 北向(MQTT/OPC UA/HTTP 等)
- 北向写:北向客户端 →
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 |
SubscribeTopic → handleWriteRequest → sb.WritePoint |
✅ 已实现 |
| OPC UA Server | Update(v) via Pipeline |
客户端 Write → sb.WritePoint |
✅ 已实现 |
| edgeOS(MQTT) | Publish(v) |
handleWriteCommand → sb.WritePoint |
✅ 已实现 |
| edgeOS(NATS) | Publish(v) |
Request/Reply → sb.WritePoint |
✅ 已实现 |
| HTTP | 定时/批量上报 | 无订阅写通道 | ⚠️ 仅上报 |
| Sparkplug B | Publish(v) |
无写订阅 | ⚠️ 仅上报 |
| REST API | /api/values/realtime |
POST /api/write → cm.WritePoint |
✅ 已实现 |
本次变更使所有经
ChannelManager.WritePoint的北向写操作均同步 Shadow 并扇出 Pipeline,与南向采集数据同源。
5. 验证场景说明
5.1 南向 → 北向(读)
- ScanEngine 采集驱动数据
ShadowCore.WriteShadowDevice(source=scan_engine)- ShadowBridge 订阅变更,推入 DataPipeline
- NorthboundManager.handleValue 扇出至 MQTT/OPC UA/Sparkplug/edgeOS
5.2 北向 → 南向(写)
- 北向客户端发送写命令(MQTT write topic / OPC UA Write / REST
/api/write) ChannelManager.WritePoint校验 RW 权限- 驱动
WritePoint下发至设备 publishWrittenValue更新 Shadow(source=write_point)- ShadowBridge → Pipeline → 北向/UI 实时刷新
6. 结论
| 项目 | 状态 |
|---|---|
| 南向采集 → Shadow → Pipeline → 北向上报 | ✅ 通过 |
| 北向反控 → 驱动写设备 | ✅ 通过 |
| 北向写后 Shadow/Pipeline 同步 | ✅ 本次补齐 |
| 只读点位保护 | ✅ 通过 |
| 端到端双向 round-trip | ✅ 通过 |
总体结论:南向采集与北向服务双向通信链路已打通,北向写入可正确下发至设备,并通过 ShadowCore 统一数据面回传至 Pipeline 与北向订阅方。
7. 后续建议
- HTTP/Sparkplug B 写通道:按业务需求增加写订阅或 NCMD 处理
- 写后读校验:可选在
WritePoint成功后触发一次即时读确认(Modbus 等) - 现场联调:使用 Modbus 仿真器 + MQTT 写 topic 做真实设备 E2E 验证