138 lines
4.8 KiB
Markdown
138 lines
4.8 KiB
Markdown
|
|
# 数据流转
|
|||
|
|
|
|||
|
|
## 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 |
|