# 构建与配置 ## 1. 环境要求 | 依赖 | 版本 | 获取方式 | |------|------|----------| | CMake | ≥ 3.16 | 系统安装 | | C++ 编译器 | C++17 | GCC / Clang / MSVC | | nlohmann_json | v3.11.3 | FetchContent 自动 | | asio | v1.30.2 | FetchContent 自动 | | open62541 | v1.4.6 | Vendor:`third_party/open62541/`(`SOFTBUS_WITH_OPCUA=ON`) | | Python 3 | — | open62541 代码生成(构建时) | | Threads | — | CMake 自动 | | dbus-1 | 可选 | 系统安装(Linux) | ## 2. CMake 选项 | 选项 | 默认值 | 说明 | |------|--------|------| | `SOFTBUS_WITH_OPCUA` | ON | 启用 open62541 与 softbus_opcua | | `SOFTBUS_WITH_ZMQ` | OFF | ZeroMQ 传输(未使用) | ## 3. 构建步骤 ```bash # 配置 cmake -B build -DSOFTBUS_WITH_OPCUA=ON # 编译全部目标 cmake --build build # 仅编译守护进程(自动构建依赖) cmake --build build --target softbus_daemon # 仅编译边缘代理 cmake --build build --target softbus_edge ``` ### 3.1 输出目录 | 类型 | 路径 | |------|------| | 可执行文件 | `build/bin/` | | 静态库 | `build/lib/` | | 插件动态库 | `build/lib/` | ### 3.2 构建目标一览 | Target | 类型 | 输出 | |--------|------|------| | `softbus_core` | STATIC | `libsoftbus_core.a` | | `softbus_api` | STATIC | `libsoftbus_api.a` | | `softbus_transport` | STATIC | `libsoftbus_transport.a` | | `softbus_opcua` | STATIC | `libsoftbus_opcua.a` | | `protocol_modbus` | SHARED | `libprotocol_modbus.so` | | `protocol_canopen` | SHARED | `libprotocol_canopen.so` | | `softbus_edge` | EXECUTABLE | `softbus_edge` | | `softbus_daemon` | EXECUTABLE | `softbus_daemon` | ## 4. CMake 模块 | 文件 | 职责 | |------|------| | `cmake/SoftbusPackage.cmake` | 包宏:`softbus_package`、`softbus_export_include`、`softbus_add_plugin` | | `cmake/SoftbusPlatform.cmake` | 平台检测、线程、可选 DBus/UDEV/ZMQ、`softbus_apply_*` | | `cmake/SoftbusThirdParty.cmake` | 第三方依赖:open62541 vendor + FetchContent(json/asio) | ## 5. 配置文件 ### 5.1 daemon_profile.json 守护进程运行时配置: ```json { "opcua": { "port": 4840, "applicationName": "SoftBusDaemon" }, "uplink": { "listenHost": "127.0.0.1", "listenPort": 9000 }, "plugins": { "modbus": "protocol_modbus", "canopen": "protocol_canopen" }, "security": { "tlsEnabled": false, "certPath": "", "keyPath": "" } } ``` | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `opcua.port` | integer | 4840 | OPC UA 监听端口 | | `opcua.applicationName` | string | SoftBusDaemon | OPC UA 应用名称 | | `uplink.listenHost` | string | 127.0.0.1 | 上行 TCP 监听地址 | | `uplink.listenPort` | integer | 9000 | 上行 TCP 监听端口 | | `plugins.modbus` | string | protocol_modbus | Modbus 插件库名 | | `plugins.canopen` | string | protocol_canopen | CANopen 插件库名 | | `security.tlsEnabled` | boolean | false | TLS 开关(Phase 1 未实现) | | `security.certPath` | string | "" | 证书路径 | | `security.keyPath` | string | "" | 私钥路径 | ### 5.2 softbus_model.json 对象模型与 OPC UA 地址空间定义: ```json { "site": "DemoSite", "system": "DemoSystem", "asset": "DemoAsset", "devices": [ { "stableDeviceKey": "SimModbusDevice", "protocol": "modbus", "points": [ { "name": "Temperature", "register": 40001, "domain": "Process" } ] } ] } ``` | 字段 | 类型 | 说明 | |------|------|------| | `site` | string | 站点名(OPC UA Site 节点) | | `system` | string | 系统名 | | `asset` | string | 资产名 | | `devices[].stableDeviceKey` | string | 设备稳定标识(OPC UA Device 节点) | | `devices[].protocol` | string | 协议标签 | | `devices[].points[].name` | string | 测点名(OPC UA Variable 节点) | | `devices[].points[].register` | integer | 寄存器地址 | | `devices[].points[].domain` | string | 数据域 | ### 5.3 ua_model.xml Phase 2 静态 NodeSet2 XML 占位文件,Phase 1 不使用。守护进程通过 `UaAddressSpaceBuilder` 从 JSON 动态构建地址空间。 ## 6. 运行指南 ### 6.1 双进程启动 ```bash # 终端 1:启动守护进程 ./build/bin/softbus_daemon \ --config config/daemon_profile.json \ --model config/softbus_model.json # 终端 2:启动边缘代理 ./build/bin/softbus_edge --daemon 127.0.0.1:9000 ``` ### 6.2 自测模式 ```bash ./build/bin/softbus_daemon --self-test ``` 启动后自动向边缘发送一次写命令,验证 OPC UA Method → TCP 下行链路。 ### 6.3 OPC UA 客户端验证 1. 使用 UaExpert 或其他 OPC UA 客户端 2. 连接 `opc.tcp://localhost:4840` 3. 浏览地址空间: - `Objects → DemoSite → ... → Temperature`(读 Variable 值) - `Objects → SoftBusControl → ExecuteCommand`(调用 Method) ### 6.4 CLI 参数汇总 **softbus_daemon:** | 参数 | 默认值 | |------|--------| | `--config` | `config/daemon_profile.json` | | `--model` | `config/softbus_model.json` | | `--self-test` | 关闭 | **softbus_edge:** | 参数 | 默认值 | |------|--------| | `--daemon` | `127.0.0.1:9000` | | `--object-ref` | `DemoSite/DemoSystem/DemoAsset/SimModbusDevice/Temperature` | ## 7. 平台支持 | 平台 | 状态 | 备注 | |------|------|------| | Linux | 支持 | 主要开发与测试平台 | | Windows | 支持 | 插件扩展名 `.dll`,路径解析适配 | | macOS | 未测试 | 理论可编译 | 平台检测由 `cmake/SoftbusPlatform.cmake` 完成,定义 `SOFTBUS_PLATFORM_LINUX` / `SOFTBUS_PLATFORM_WINDOWS` 等宏。 ## 8. 故障排查 | 现象 | 可能原因 | 处理 | |------|----------|------| | 守护进程启动失败:plugin load | 插件 .so 不在搜索路径 | 确认 `config/lib/protocol_modbus.so` 或 `build/lib/libprotocol_modbus.so` 存在 | | OPC UA 连接拒绝 | 端口被占用或 OPC UA 未启用 | 检查 4840 端口;确认 `SOFTBUS_WITH_OPCUA=ON` | | Variable 值不更新 | 边缘未连接或 objectRef 不匹配 | 确认 edge 运行且 sourceId 与模型路径一致 | | Method 调用失败 | JSON 格式错误或 objectRef 无效 | 检查入参 JSON 与五层路径 | ## 9. 项目目录结构 ``` softbus_OPC/ ├── CMakeLists.txt # 工作区根 CMake ├── cmake/ # CMake 模块 │ ├── SoftbusPackage.cmake │ ├── SoftbusPlatform.cmake │ └── SoftbusThirdParty.cmake ├── config/ # 运行时配置 │ ├── daemon_profile.json │ ├── softbus_model.json │ └── ua_model.xml ├── docs/ # 项目文档(本目录) ├── src/ │ ├── softbus_core/ # L0 内核 │ ├── softbus_api/ # L1 契约 │ ├── softbus_transport/ # L2 传输 │ ├── softbus_opcua/ # L2 OPC UA │ ├── softbus_daemon/ # L3 守护进程 │ ├── softbus_edge/ # L3 边缘代理 │ └── plugins/ # L2 协议插件 │ ├── protocol_modbus/ │ └── protocol_canopen/ └── build/ # 构建输出(gitignore) ```