Files
softbus_OPC/docs/数据流转.md

138 lines
4.8 KiB
Markdown
Raw Permalink Normal View History

2026-06-09 17:27:24 +08:00
# 数据流转
## 1. 概念约定
| 术语 | 类型/类 | 说明 |
|------|---------|------|
| **原始包** | `RawPacket` | 边缘上行边界类型,含 `traceId``timestampNs``runtimeDeviceId``sourceId``protocolTag``payload` |
| **语义消息** | `DOMMessage` | 协议解析后的统一业务消息,含 `id``sourceId``domain``quality``value`(JSON) |
| **对象引用** | `ObjectRef` | 五层寻址:`Site/System/Asset/Device/Point``toPath()` 生成路径字符串 |
| **控制命令** | `ExecuteCommand` | 下行控制面载荷,含 `objectRef``command``params` |
| **线消息** | `WireMessage` | TCP 传输层消息,类型为 `RawPacket``ExecuteCommand` |
---
## 2. 上行主链路(边缘 → OPC UA
### 2.1 边缘采集
`softbus_edge` 主循环执行:
1. `MockModbusIngress::poll()` 生成模拟 Modbus RTU 0x03 响应帧
2. 构造 `RawPacket`
- `sourceId` = objectRef 路径(如 `DemoSite/DemoSystem/DemoAsset/SimModbusDevice/Temperature`
- `protocolTag` = `"modbus"`
- `payload` = 原始 Modbus 字节
- `traceId` = `trace-xxxxxxxx`(由 `DeviceIdentity` 生成)
3. `UplinkClient::sendRawPacket()` 调用传输层编码并发送
### 2.2 TCP 传输
`TcpUplinkClient``RawPacket` 编码为 JSON 行(详见 [UPLINK_WIRE_PROTOCOL.md](UPLINK_WIRE_PROTOCOL.md)),经 TCP 发送至守护进程 `:9000`
### 2.3 守护进程接收
`TcpUplinkServer` 按行解码,触发 `rawHandler(RawPacket)` 回调,`CoreService` 将其投递至 `PipelineEngine::process()`
### 2.4 Pipeline 处理
`PipelineEngine` 三阶段串行处理:
| 阶段 | 组件 | 输入 | 输出 |
|------|------|------|------|
| Stage 1 分帧 | `ModbusFramer` | 原始 payload 字节流 | 完整 Modbus 帧 |
| Stage 2 解析 | `ModbusParser` | 完整帧 + sourceId | `DOMMessage`(含 registerValue |
| Stage 3 绑定 | `UaModelBinder` | `DOMMessage` | OPC UA Variable 写值 |
解析成功后补充 `traceId``timestampNs`,调用 `binder_->bind(parsed.message)`
### 2.5 OPC UA 暴露
`UaModelBinder::bind()` 流程:
1.`message.id`(或 `message.sourceId`)查 `pointNodes_` 映射表
2.`message.value` 提取 `value``registerValue`Double
3. `UA_Server_writeValue()` 更新对应 Variable 节点
4. OPC UA 客户端可读最新值
---
## 3. 下行主链路OPC UA → 边缘)
### 3.1 OPC UA 方法调用
客户端调用地址空间中的 `ExecuteCommand` Method
- 节点路径:`ObjectsFolder/SoftBusControl/ExecuteCommand`
- 入参JSON 字符串(`ExecuteCommand` 序列化)
- 出参JSON 字符串 `{"success":true}``{"success":false,"error":"..."}`
### 3.2 守护进程分发
```
UaMethodBinder::executeCommandMethod()
→ ExecuteCommand::fromJson() + validate()
→ UaMethodBinder::dispatchCommand()
→ CommandDispatcher::dispatch()
→ TcpUplinkServer::sendCommand()
```
### 3.3 边缘接收
`TcpUplinkClient` 解码 `ExecuteCommand` 线消息,触发 `commandHandler`。Phase 1 仅日志输出,未写回真实设备。
---
## 4. 自测模式数据流
`softbus_daemon --self-test` 启动后自动执行一次下行写命令:
```json
{
"type": "executeCommand",
"traceId": "trace-selftest",
"objectRef": "DemoSite/DemoSystem/DemoAsset/SimModbusDevice/Temperature",
"command": "write",
"params": {"value": 42.5}
}
```
用于验证 OPC UA Method → CommandDispatcher → TCP → Edge 全链路。
---
## 5. 字段映射对照
### 5.1 RawPacket → DOMMessage
| RawPacket 字段 | DOMMessage 字段 | 说明 |
|----------------|-----------------|------|
| `sourceId` | `sourceId` / `id` | 对象路径,解析器可能覆盖 `id` |
| `traceId` | `traceId` | Pipeline 补充 |
| `timestampNs` | `timestampNs` | Pipeline 补充 |
| `payload` | — | 经 Framer/Parser 消费 |
| — | `value` | 解析器输出 JSON`{"registerValue": 25.3}` |
| — | `domain` | 来自模型定义,默认 `Process` |
| — | `quality` | 解析器设置,默认 `Good` |
### 5.2 DOMMessage → OPC UA Variable
| DOMMessage 字段 | OPC UA 属性 | 说明 |
|-----------------|-------------|------|
| `id` / `sourceId` | NodeId 查找键 | 映射表 `pointNodes_` |
| `value.value``value.registerValue` | Variable Value (Double) | `UaModelBinder` 提取 |
| `quality` | — | Phase 1 未映射至 StatusCode |
| `timestampNs` | — | Phase 1 未映射至 SourceTimestamp |
---
## 6. 与 soft_bus 主项目差异
| 环节 | soft_bus | softbus_OPC |
|------|----------|-------------|
| 边缘入口 | `SerialDevice` + `DriverIngressAdapter` | `MockModbusIngress` |
| 传输协议 | SBUP 二进制帧 | UplinkWire JSON 行 |
| 管道调度 | 多线程分帧 + 解析线程池 | 单线程同步 `process()` |
| 北向出口 | 消息总线 / HTTP API | OPC UA Variable 绑定 |
| 下行控制 | HTTP / D-Bus | OPC UA Method + TCP |