Files
softbus_OPC/docs/softbus_edge.md
2026-06-09 17:27:24 +08:00

137 lines
3.6 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.
# softbus_edge
**路径:** `src/softbus_edge`
**构建目标:** `softbus_edge`EXECUTABLE
**层级:** L3 可执行层
## 1. 概述
`softbus_edge` 是边缘代理可执行文件负责设备数据采集ingress、原始包上行egress与下行命令接收。Phase 1 使用 `MockModbusIngress` 模拟 Modbus 数据,无真实硬件依赖。
## 2. CONSTRAINTS
- 边缘代理不得直接操作 OPC UA 或插件解析,仅产生 `RawPacket` 并发送。
- ingress 实现须遵循 `IIngressPort` 接口,便于 Phase 2 替换为真实硬件驱动。
- 下行命令 Phase 1 仅日志输出,不得假装已写回设备。
- 边缘代理通过 CLI 参数配置连接地址,不读取 `daemon_profile.json`
## 3. 组件架构
```
main.cpp
├── MockModbusIngress (IIngressPort) ← 入站采集
├── UplinkClient (egress) ← TCP 上行/下行
├── DeviceFactory ← 运行时设备 ID 生成
└── DeviceDiscovery ← 设备发现Phase 1 stub
```
## 4. 核心组件
### 4.1 IIngressPort — 入站抽象
| 方法 | 说明 |
|------|------|
| `open()` | 打开采集通道 |
| `close()` | 关闭采集通道 |
| `poll()` | 轮询,返回 `vector<RawPacket>` |
**Phase 1 实现:** `MockModbusIngress`
- 生成递增的 Modbus RTU 0x03 响应帧
- 寄存器值按 0.1 缩放(与 `ModbusParser` 一致)
- `sourceId` 使用 CLI 指定的 objectRef
### 4.2 UplinkClient — 上行客户端
`TcpUplinkClient` 的薄封装:
| 方法 | 说明 |
|------|------|
| `connect(host, port)` | 连接守护进程 |
| `sendRawPacket(RawPacket)` | 发送上行原始包 |
| `poll()` | 轮询接收下行命令 |
| `setCommandHandler(handler)` | 注册命令回调 |
### 4.3 DeviceFactory
| 方法 | 说明 |
|------|------|
| `createRuntimeDevice()` | 生成 `runtime-xxxxxxxx` ID |
### 4.4 DeviceDiscoveryPhase 1 stub
| 方法 | 说明 | Phase 1 行为 |
|------|------|-------------|
| `discover()` | 扫描可用设备 | 返回空列表 |
## 5. 主循环
```cpp
while (running) {
// 1. 采集
auto packets = ingress.poll();
for (auto& packet : packets) {
uplink.sendRawPacket(packet);
}
// 2. 接收命令
uplink.poll();
// 3. 平台信号检查
if (PlatformSignal::interrupted()) break;
}
```
## 6. CLI 参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--daemon host:port` | `127.0.0.1:9000` | 守护进程地址 |
| `--object-ref path` | `DemoSite/DemoSystem/DemoAsset/SimModbusDevice/Temperature` | 模拟数据源对象路径 |
## 7. 数据流
### 7.1 上行
```
MockModbusIngress.poll()
→ RawPacket(sourceId=objectRef, protocolTag="modbus", payload=Modbus frame)
→ UplinkClient.sendRawPacket()
→ TcpUplinkClient → TCP JSON → Daemon
```
### 7.2 下行
```
Daemon CommandDispatcher
→ TCP JSON → TcpUplinkClient
→ UplinkClient.poll() → commandHandler
→ Phase 1: Logger 输出命令内容
```
## 8. 依赖
- `softbus_core`RawPacket, DeviceIdentity, Logger, PlatformSignal
- `softbus_transport`TcpUplinkClient, UplinkWire
- `softbus_api`ExecuteCommand
- `asio`
## 9. 运行示例
```bash
# 确保守护进程已启动
./build/bin/softbus_edge --daemon 127.0.0.1:9000
# 指定自定义对象路径
./build/bin/softbus_edge \
--daemon 127.0.0.1:9000 \
--object-ref DemoSite/DemoSystem/DemoAsset/SimModbusDevice/Temperature
```
## 10. Phase 2 规划
- 实现真实 `SerialIngress` / `CanIngress` 替换 Mock
- 下行 `ExecuteCommand` 写回设备Modbus 写寄存器等)
- 设备发现与动态注册
- 支持 SBUP 二进制协议