Files
softbus_OPC/docs/数据流转.md
2026-06-09 17:27:24 +08:00

138 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据流转
## 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 |