# softbus_daemon

**路径：** `src/softbus_daemon`  
**构建目标：** `softbus_daemon`（EXECUTABLE）  
**层级：** L3 可执行层

## 1. 概述

`softbus_daemon` 是核心守护进程（Orchestrator），串联 uplink 监听、Pipeline 处理、OPC UA 服务、插件加载与命令分发，是整个系统的运行时中枢。

## 2. CONSTRAINTS

- `CoreService` 是唯一编排入口，负责按序启动/停止所有子系统。
- Pipeline 不得绕过插件接口直接解析协议字节。
- 命令分发须经 `CommandDispatcher` 校验后转发，不得直接操作 TCP 连接。
- 插件加载路径解析由 `CoreService::resolvePluginPath()` 统一处理。
- Phase 1 仅加载 modbus 插件，canopen 插件已编译但未接入。

## 3. 组件架构

```
CoreService (编排中心)
  ├── ObjectModelRegistry     ← 对象模型加载
  ├── PluginLoader (modbus)   ← 协议插件
  ├── UaServerEngine          ← OPC UA 服务
  ├── UaAddressSpaceBuilder   ← 地址空间构建
  ├── UaModelBinder           ← 模型绑定
  ├── UaMethodBinder          ← 方法绑定
  ├── UaEventBridge           ← 事件桥接（stub）
  ├── PipelineEngine          ← 数据处理管道
  ├── TcpUplinkServer         ← 上行监听
  └── CommandDispatcher       ← 命令分发
```

## 4. CoreService

### 4.1 启动序列

`CoreService::start(profilePath, modelPath)` 按以下顺序初始化：

| 步骤 | 操作 | 失败行为 |
|------|------|----------|
| 1 | `ProfileLoader::loadFromFile(profilePath)` | 返回 false |
| 2 | `ObjectModelRegistry::loadFromFile(modelPath)` | 返回 false |
| 3 | `PluginLoader::load(modbusPluginPath)` | 返回 false |
| 4 | `UaServerEngine::start(port, appName, security)` | 返回 false |
| 5 | 创建 `UaModelBinder`、`UaMethodBinder`、`UaEventBridge` | — |
| 6 | `UaAddressSpaceBuilder::buildFromModel(model, binder)` | 返回 false |
| 7 | 创建 `PipelineEngine(plugin, binder)` | — |
| 8 | 创建 `TcpUplinkServer` 并注册 `rawHandler` | — |
| 9 | 创建 `CommandDispatcher` 并绑定 Method 回调 | — |
| 10 | `uplink_->start()` + 启动 io_context 线程 | — |

### 4.2 回调绑定

```cpp
// 上行：RawPacket → Pipeline
uplink_->setRawPacketHandler([this](const RawPacket& packet) {
    pipeline_->process(packet);
});

// 下行：OPC UA Method → CommandDispatcher
uaMethodBinder_->bindExecuteCommand([this](const ExecuteCommand& cmd) {
    return commandDispatcher_->dispatch(cmd);
});
```

### 4.3 插件路径解析

`resolvePluginPath(pluginName, profilePath)` 按以下顺序搜索（每个目录同时尝试 `lib{name}.so` 与 `{name}.so`）：

1. `{profileDir}/lib/` — 与配置文件同目录，如 `config/lib/`
2. `{cwd}/config/lib/`
3. `{exeDir}/`、`{exeDir}/../lib/`
4. `build/lib/`、`build/bin/`
5. `lib/`、`bin/`、`{cwd}/`

## 5. PipelineEngine

### 5.1 职责

将 `RawPacket` 经插件分帧/解析转换为 `DOMMessage`，并绑定到 OPC UA。

### 5.2 处理流程

```
process(RawPacket)
  → plugin_->framer()->extract(data, size)     // Stage 1: 分帧
  → plugin_->parser()->parseFrame(data, size, sourceId)  // Stage 2: 解析
  → 补充 traceId, timestampNs
  → binder_->bind(DOMMessage)                   // Stage 3: OPC UA 绑定
```

### 5.3 错误处理

- 分帧失败：使用原始 payload 继续解析
- 解析失败：记录 `warnTrace` 日志，丢弃消息
- 绑定失败：记录 `warnTrace`（如无对应 OPC UA 节点）

## 6. CommandDispatcher

### 6.1 职责

校验 `ExecuteCommand` 并通过 `TcpUplinkServer` 转发至边缘。

### 6.2 公共 API

| 方法 | 说明 |
|------|------|
| `dispatch(ExecuteCommand)` | 校验 + 发送至已连接边缘 |

## 7. Registry 子系统

### 7.1 ObjectModelRegistry

| 方法 | 说明 |
|------|------|
| `loadFromFile(path)` | 加载 `softbus_model.json` |
| `tree()` | 获取 `ObjectModelTree` |
| `findPointByRegister(reg)` | 按寄存器地址查找测点 |

### 7.2 MetadataRegistry

元数据注册表，Phase 1 已编译但 `CoreService` 未接入。

## 8. IpcOptionalDBus（Phase 1 stub）

D-Bus IPC 可选实现，Phase 1 未接入 `CoreService` 主流程。

## 9. CLI 参数

| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--config` | `config/daemon_profile.json` | 守护进程配置 |
| `--model` | `config/softbus_model.json` | 对象模型 |
| `--self-test` | 关闭 | 启动后自动发送一次写命令 |

## 10. 主循环

```cpp
while (running) {
    uaEngine_->iterate();    // 驱动 OPC UA 事件
    // PlatformSignal 检查
}
```

`io_context` 在独立线程中运行，处理 TCP 异步 I/O。

## 11. 数据流（完整链路）

### 11.1 上行

```
Edge → TCP → TcpUplinkServer → PipelineEngine
  → ModbusFramer → ModbusParser → DOMMessage
  → UaModelBinder → OPC UA Variable
```

### 11.2 下行

```
OPC UA Client → UaMethodBinder → CommandDispatcher
  → TcpUplinkServer → TCP → Edge
```

## 12. 依赖

- `softbus_core`
- `softbus_transport`
- `softbus_api`
- `softbus_opcua`
- `asio`
- 可选：`dbus-1`（`SOFTBUS_HAS_DBUS`）
- 构建依赖：`add_dependencies(softbus_daemon protocol_modbus)`

## 13. 运行示例

```bash
# 正常启动
./build/bin/softbus_daemon \
  --config config/daemon_profile.json \
  --model config/softbus_model.json

# 自测模式
./build/bin/softbus_daemon --self-test
```

## 14. Phase 2 规划

- 接入 `MetadataRegistry` 与 `TimeAligner`
- 加载 canopen 插件，支持多插件并行
- D-Bus IPC 接入主流程
- 多边缘连接管理
