# SoftBus OPC 软件总体架构 > 本文档描述 SoftBus OPC 软总线系统的术语定义、软件背景、总体范围、架构概览及 Daemon 核心模块设计。 > 工程路径:`softbus_OPC/`。相关补充文档见 [docs/README.md](README.md)。 --- ## 第 0 章 术语、缩写与软件背景 ### 0.1 术语与缩写词 本章汇总全文涉及的专业术语与缩写,按类别编排。英文名称与代码标识保持一致。 #### 0.1.1 系统与进程 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | SoftBus OPC | — | 本软总线工业数据总线 Phase 1 原型工程名 | | 软总线 | Soft Bus | 抽象异构现场总线,提供统一数据语义与传输编排的中间件 | | Daemon | softbus_daemon | 中心守护进程:上行接入、协议解析、OPC UA 暴露、命令分发、在线监测 | | Edge | softbus_edge | 边缘代理进程,部署于现场侧,负责物理设备采集与写回 | | CoreService | — | Daemon 唯一编排入口,管理各子系统生命周期与主循环 | | EdgeRuntime | — | Edge 运行时核心类,集成采集、上行、下行与配置热加载 | | Phase 1 / 2 / 3 / 4 | — | 能力交付阶段:采集透传 → 订阅/管理 → 融合 → 恢复 | | 南向 | Southbound | 面向现场设备与传感器的数据接入方向 | | 北向 | Northbound | 面向 OPC UA、MES/SCADA 等上层应用的数据开放方向 | #### 0.1.2 域模型与配置 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | 物理域 | Physical Domain | 通道、设备、寄存器、COB-ID 等贴近硬件的配置与数据标识;由 edge 加载 | | 逻辑域 | Logical Domain | OPC UA 地址空间、逻辑点、对象模型五层路径;由 daemon 加载 | | 双域 | Dual Domain | 物理配置与逻辑模型分离,经 Binding 映射关联 | | 物理通道 | Physical Channel | `physical_channels.json` 中定义的串口/TCP/CAN 接口实例 | | 物理设备 | Physical Device | 挂载于通道上的从站或 CANopen 节点等设备实例 | | 物理点 | Physical Point | 最小采集单元,标识为 `physicalPointId`(运行时带 `edgeId` 前缀) | | 逻辑点 | Logical Point | 北向语义测点,标识为 `logicalPointId`,对应 OPC UA Variable | | Binding / 绑定 | BindingRegistry | 物理点 ID、逻辑点 ID 与 edgeId 的映射关系 | | 全局绑定 | bindings_global.json | daemon 侧绑定表,决定上行映射与下行路由 | | 本地绑定 | bindings_local.json | edge 侧可选绑定,用于下行写命令备用解析 | | 逻辑点表 | logical_points.json | daemon 逻辑点与 OPC UA 节点语义定义 | | 对象模型 | ObjectModelTree | 五层树形结构:Site / System / Asset / Device / Point | | ObjectRef | — | 五层寻址路径字符串,如 `DemoSite/DemoSystem/DemoAsset/EdgeDevice_01/MotorTemperature` | | edgeId | — | 边缘实例唯一标识,用于 uplink 注册与 daemon 路由 | | deviceId | — | 逻辑设备名,用于主题格式化与 ACK 身份 | | sourceId | — | RawPacket 中的数据源标识,通常为 `{edgeId}/{physicalPointId}` | | topic_rule | topic_rule.json | Bus 主题模板:data / command / ack / event / heartbeat | #### 0.1.3 数据模型与消息 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | RawPacket | — | 边缘上行边界类型:traceId、timestampNs、runtimeDeviceId、sourceId、protocolTag、payload | | DOMMessage | Document Object Model Message | 协议插件解析后的统一语义消息 | | SoftbusDataPoint | — | Bus 上发布的标准化测点:deviceId、pointId、value、unit、objectRef、sourceTimestampNs | | ExecuteCommand | — | 下行控制命令:objectRef、command、params、requestId、traceId | | SoftbusAck | — | edge 执行写命令后的应答:success、error、executedValue 等 | | WireMessage | — | TCP 传输层消息封装,类型含 RawPacket、ExecuteCommand、heartbeat 等 | | traceId | — | 贯穿上行/下行链路的追踪标识,便于日志关联 | | protocolTag | — | RawPacket 中的协议标签,如 `modbus`、`canopen` | | payload | — | RawPacket 中的原始协议字节载荷 | | quality / 质量码 | Good / Uncertain / Bad | 数据可信度标识(Phase 2 规划映射至 OPC StatusCode) | | deadband / 死区 | — | edge 变化过滤阈值,工程值变化小于死区时不重复上报 | | reportOnChange | — | 仅变化时上报,配合 ChangeFilter 减少上行流量 | | scale / 缩放系数 | — | 原始寄存器值与工程值之间的换算系数 | | unbound 主题 | edge/unbound/raw/... | 未在 bindings_global 中绑定的物理点 RawPacket 发布主题 | #### 0.1.4 传输与通信 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | UplinkWire | — | edge 与 Daemon 之间的 TCP JSON 行传输协议 | | Uplink / 上行 | — | edge → daemon 方向的数据与控制应答 | | 下行 | Downlink | daemon → edge 方向的 ExecuteCommand 写回 | | TcpUplinkClient | — | edge 侧 TCP 上行客户端(含独立 ioThread) | | TcpUplinkServer | — | daemon 侧 TCP 上行监听服务,默认端口 9000 | | TransportBusBridge | — | TCP 线消息与 Bus 主题之间的双向桥接 | | UplinkClient | — | edge 对 TcpUplinkClient 的封装 | | Bus | softbus_bus | daemon 进程内 Pub/Sub 消息总线 | | Pub/Sub | Publish / Subscribe | 发布/订阅模式,按主题模式过滤消息 | | 心跳 | Heartbeat | edge 周期性发送的在线保活消息 | | heartbeatPeriodMs | — | edge 心跳发送周期,默认 1000 ms | | JSONL | JSON Lines | 每行一条 JSON 的日志/时序落盘格式 | | TLS / mTLS | — | 传输层安全(Phase 2+ 规划) | #### 0.1.5 协议与现场总线 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | Modbus RTU | — | 串口 Modbus,经 libmodbus 或 RTU-over-TCP 接入 | | Modbus TCP | — | 以太网 Modbus 主从协议 | | RTU-over-TCP | tcp_rtu / rtu_tcp | 在 TCP 连接上传输 Modbus RTU 帧(含 CRC) | | CAN 2.0A/B | — | 控制器局域网标准帧格式 | | CANopen | — | 基于 CAN 的工业协议,含 NMT、PDO、SDO | | SocketCAN | — | Linux 内核 CAN 套接字接口(如 emuccan0) | | PDO | Process Data Object | CANopen 过程数据对象,周期性广播 | | SDO | Service Data Object | CANopen 服务数据对象,点对点读写对象字典 | | COB-ID | CAN Object Identifier | CAN 帧标识符,PDO 订阅匹配键 | | NMT | Network Management | CANopen 网络管理,如远程启动节点 | | EDS | Electronic Data Sheet | CANopen 设备对象字典描述文件 | | RS-232 / RS-485 | — | 串行通信物理层标准 | | OPC UA | Open Platform Communications Unified Architecture | 北向工业互操作标准,默认端口 4840 | | open62541 | — | 开源 OPC UA 协议栈,本项目北向实现基础 | | Framer / 分帧器 | IProtocolFramer | 插件 Stage 1:从字节流提取完整协议帧 | | Parser / 解析器 | IProtocolParser | 插件 Stage 2:将完整帧解析为 DOMMessage | | Plugin ABI | — | 插件 C ABI:`create_framer` / `create_parser` | | protocol_modbus.so | — | Modbus 协议动态库插件 | | protocol_canopen.so | — | CANopen 协议动态库插件 | #### 0.1.6 Edge 采集子系统 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | Ingress | IIngressPort | 边缘采集入口抽象:ModbusIngress、CanIngress、EthIngress | | Egress | — | 边缘写出路径:ModbusEgress、CanEgress、EthEgress | | CompositeIngress | — | 组合多个协议 Ingress 的统一 poll 入口 | | IngressWorker | — | 独立采集线程,循环 poll 并将结果推入 PacketQueue | | PacketQueue | — | 线程安全 RawPacket 队列,主线程 drain 后上行发送 | | ChannelManager | — | 物理通道管理器族:Modbus / CAN / Eth | | ioMutex | — | 每物理通道独立互斥锁,保护采集线程与下行写并发 | | ModbusPollScheduler | — | Modbus 批量读计划器,合并相邻寄存器 | | PollPlanner | — | 按 pollIntervalMs 调度到期测点 | | ChangeFilter | — | 工程值变化与死区过滤 | | PdoMapper | — | CANopen PDO 帧与物理点映射 | | SdoClient | — | CANopen SDO 写客户端 | | NmtManager | — | CANopen 远程节点启动管理 | | CommandExecutor | — | edge 下行命令执行器,按 protocol 分发至 Egress | | ConfigWatcher | — | 配置文件变更监视,支持热加载 | | PhysicalRegistry | — | edge 物理通道与设备注册表 | | Mock 模式 | --mock | 无硬件时模拟 Modbus 帧上行 | #### 0.1.7 Daemon 处理与北向 | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | Pipeline / PipelineEngine | — | RawPacket → 分帧 → 解析 → 绑定 → Bus/OPC UA 的处理管道 | | PluginLoader | — | 动态加载协议插件.so | | PointRegistry | — | 逻辑点表与 ObjectModelTree 加载索引 | | BindingRegistry | — | 全局/本地绑定加载与 physical ↔ logical 解析 | | CommandService | — | 下行命令提交、路由、ACK 等待与状态机 | | CommandDispatcher | — | Phase 1 遗留命令转发组件(已由 CommandService 扩展) | | HeartbeatMonitor | — | 订阅 heartbeat 主题,超时判定 edge offline | | StorageService | — | 订阅 Bus 主题,时序/命令/事件 JSONL 落盘 | | ProfileLoader | — | 加载 daemon_profile.json 运行配置 | | UaServerEngine | — | OPC UA 服务端引擎 | | UaAddressSpaceBuilder | — | 由 ObjectModelTree 动态构建 OPC UA 节点树 | | UaModelBinder | — | DOMMessage / SoftbusDataPoint → OPC UA Variable 写值 | | UaMethodBinder | — | OPC UA ExecuteCommand Method 入口绑定 | | UaEventBridge | — | Bus 事件 → OPC UA 事件桥接(Phase 1 stub) | | Variable | — | OPC UA 变量节点,暴露测点当前值 | | Method | — | OPC UA 方法节点,用于 ExecuteCommand 下行 | | MonitoredItem | — | OPC UA 订阅监控项(Phase 2 规划完整实现) | | Subscription | — | OPC UA 客户端数据变更订阅机制 | #### 0.1.8 数据服务(Phase 2~4 规划) | 术语 / 缩写 | 英文 / 标识 | 说明 | |-------------|-------------|------| | 数据管理 | Data Management | 元数据、质量码、生命周期、存储策略、访问控制、血缘 | | 数据订阅 | Data Subscription | 按主题/逻辑点/对象路径过滤推送;Bus 订阅 + OPC UA Subscription | | 数据融合 | Data Fusion | 多源时序对齐、关联计算、合成测点发布 | | 数据恢复 | Data Recovery | 断线补传、历史回放、缺测插值、冗余源切换 | | 数据服务层 | Data Service Layer | 叠加于采集解析层之上的 Bus 中心化能力层 | | MetadataRegistry | — | 元数据注册表(代码 stub,待接入 CoreService) | | CatalogService | — | 数据资产编目与检索(规划) | | RetentionPolicy | — | 时序/事件数据保留与归档策略(规划) | | SubscriptionManager | — | 统一订阅注册、QoS、背压管理(规划) | | UaSubscriptionBridge | — | Bus DataPoint 驱动 OPC UA MonitoredItem(规划) | | SubGateway | — | 北向 MQTT/HTTP 订阅网关(规划) | | FusionEngine | — | 融合规则执行与合成测点发布(规划) | | FusionRuleRegistry | — | 融合规则配置:输入点、表达式、对齐窗口(规划) | | TimeAligner | softbus_core::TimeAligner | 多通道时序对齐器,支持 Nearest/Linear 策略(已实现,待接入) | | AlignedSample | — | 对齐后的多通道样本集合,含 anchorTimestampNs | | anchor / 锚点时刻 | — | 融合对齐的时间基准点 | | SyntheticPoint / 合成测点 | — | 由多输入计算得到的衍生 logicalPoint | | RecoveryService | — | daemon 侧缺口检测、回放、冗余切换(规划) | | RecoveryBuffer | — | edge 断线期间 RawPacket 环形/持久缓冲(规划) | | Gap / 数据缺口 | GapReport | 通信中断导致的时间区间 `[t0, t1]` | | replayBatch | — | uplink 补传批量 RawPacket 的扩展消息类型(规划) | | QoS | Quality of Service | 订阅侧采样率、可靠性、延迟上限等服务质量策略 | | 血缘 | Data Lineage | physicalPoint → binding → logicalPoint → fusedPoint 溯源链 | | ACL | Access Control List | 读/写/订阅权限控制(规划) | #### 0.1.9 缩写词速查 | 缩写 | 全称 | |------|------| | AI / AO | Analog Input / Analog Output(模拟量输入/输出,signalType 字段) | | ABI | Application Binary Interface | | CAN | Controller Area Network | | DOM | Document Object Model | | IPC | Inter-Process Communication(如 D-Bus,Phase 2 规划) | | JSON | JavaScript Object Notation | | MES / SCADA | 制造执行系统 / 数据采集与监控系统 | | NMT | Network Management(CANopen) | | OPC | Open Platform Communications | | PDO / SDO | Process / Service Data Object(CANopen) | | QoS | Quality of Service | | RTU | Remote Terminal Unit(Modbus 串口从站通信模式) | | SLA | Service Level Agreement | | TCP | Transmission Control Protocol | | TLS | Transport Layer Security | | UA | Unified Architecture(OPC UA) | --- ### 0.2 软总线需求 针对**系统运行过程中,设备数目灵活增加、供求关系复杂多变,同一内涵的数据在不同设备之间的数据结构、映射关系、传输协议等外在表现有较大差异,导致数据管理与通信困难。与此同时在数据传输过程中,现有传感系统仅起到数据交换的作用,并未发挥其在数据传递过程中信息管理的作用。** 为实现多源异构信息设备的互联互通,亟需开发一种软总线架构,用以实现大量异构网络之间的灵活通信。该软总线能够基于设备运行数据构建整体**系统传感软件子系统,并动态分析设备间的潜在关联,促进设备感知信息互补与数据恢复,最终支撑稳定、可靠、高效和低时延的通信传感网络形成。 SoftBus OPC 是本需求在工业自动化场景下的 **Phase 1 原型实现**:以南向多协议采集、中间层统一语义建模、北向 OPC UA 暴露为核心路径,验证“物理域—逻辑域”双域分离与可扩展插件化解析架构。 **能力定位说明:** 当前工程已完成“**数据采集与透传**”主链路(现场 → edge → daemon → OPC UA / JSONL 落盘),尚未形成完整的数据管理、数据恢复、数据订阅与数据融合子系统。第 0.2 节背景中提出的“信息管理、关联分析、互补与恢复”等目标,将在 Phase 2~4 基于现有 Bus 与语义模型逐层叠加(详见第 4 章)。 #### 表 0-3 能力演进对照(背景需求 → 软件能力) | 背景需求 | Phase 1 现状 | 目标能力 | |----------|--------------|----------| | 异构设备互联互通 | edge 多协议采集 + 插件解析 | 已具备基础 | | 数据传递过程中的**信息管理** | Binding + 逻辑点表 + 主题路由 | **数据管理**(第 4.6 节) | | 设备感知信息**互补** | 单点上报,无跨源合成 | **数据融合**(第 4.4 节) | | **数据恢复** | 仅 JSONL 追加写,无回放/补洞 | **数据恢复**(第 4.5 节) | | 稳定低时延通信网络 | 多线程采集 + 心跳监测 | 订阅 QoS + 冗余(第 4.3 节) | #### 表 0-4 目前已有的协议与接口 | 数据接口类型 | 数据采集方式 | 物理接口类型 | 本系统支持情况 | |------------------|---------------------|----------------|-----------------------------------------| | 电流模拟量数据 | 模拟传输 | 板卡端子块 | 经 Modbus/OPC 间接接入(Phase 1) | | 电压模拟量数据 | 模拟传输 | 板卡端子块 | 经 Modbus/OPC 间接接入(Phase 1) | | 串口数据 | RS-232 / RS-485 | DB / 端子块 | **已支持**(libmodbus RTU) | | 以太网数据 | TCP/IP 传输 | RJ45 | **已支持**(Modbus TCP、RTU-over-TCP) | | CAN 数据 | CAN 2.0A/B 传输 | CAN-H / CAN-L | **已支持**(SocketCAN、CANopen PDO/SDO)| --- ## 第 1 章 软件总体范围 本文档旨在促进多源异构设备的信息互联交换,适用于工业自动化及其他需要统一数据语义与北向开放接口的领域。 ### 1.1 文档范围 | 范围项 | 说明 | |------------------|----------------------------------------------------------------------| | 软件形态 | 守护进程 `softbus_daemon`、边缘代理 `softbus_edge`、协议插件动态库 | | 通信南向 | Modbus RTU/TCP、CANopen、裸以太网(骨架) | | 通信北向 | OPC UA(open62541),端口默认 4840 | | 边缘—中心链路 | TCP JSON 行协议(UplinkWire),端口默认 9000 | | 配置与模型 | 物理层配置、逻辑点表、全局/本地绑定、对象模型五层寻址 | | **Phase 1 已交付** | 数据采集、协议解析、OPC UA 读写、命令下行、JSONL 时序落盘、Bus 主题发布 | | **Phase 2~4 规划** | 数据管理、数据订阅、数据融合、数据恢复(见第 4 章) | | 不在 Phase 1 范围 | D-Bus 主流程接入、多 edge 负载均衡、TLS 生产部署、时序数据库集群 | ### 1.2 交付物 ``` build/bin/softbus_daemon # 守护进程 build/bin/softbus_edge # 边缘代理 build/lib/protocol_modbus.so # Modbus 协议插件 build/lib/protocol_canopen.so # CANopen 协议插件 config/ # 运行时配置 docs/ # 架构与模块文档 ``` --- ## 第 2 章 总体概述 ### 2.1 设计目标 SoftBus OPC 的总体目标分两个阶段理解: **Phase 1(当前):采集与透传** — 将工业现场总线数据接入软总线,经统一对象模型暴露为 OPC UA 地址空间,并完成基础落盘。 **Phase 2~4(演进):数据服务** — 在采集层之上构建数据管理、订阅、融合与恢复能力,使软总线从“数据管道”升级为“数据服务中枢”,回应第 0.2 节背景中对信息管理、互补与恢复的要求。 Phase 1 已实现: 1. **南向统一接入**:边缘代理按物理配置轮询/订阅多协议设备,产出标准化 `RawPacket`。 2. **中间层协议中立**:Daemon 通过插件分帧/解析,不侵入核心数据模型。 3. **北向标准开放**:OPC UA 客户端读写 Variable、调用 Method 下发控制命令。 4. **双域解耦**:物理配置在 edge,逻辑模型与绑定在 daemon,支持独立演进与热加载。 Phase 2~4 待建设(详见第 4 章): 5. **数据管理**:统一元数据、质量码、保留策略与访问视图。 6. **数据订阅**:多消费者按主题/QoS 订阅,不仅限于 OPC UA 轮询读。 7. **数据融合**:多 edge、多协议测点在时间轴上对齐并合成衍生量。 8. **数据恢复**:通信中断后的补传、历史回填与冗余切换。 ### 2.2 系统分层架构 ``` L3 可执行层 softbus_daemon ─────────────────────────────┐ softbus_edge │ │ L2 服务/协议层 │ softbus_opcua · softbus_transport │ softbus_pipeline · softbus_command │ softbus_monitor · softbus_storage │ softbus_registry · softbus_bus │ plugins/protocol_modbus · protocol_canopen │ [L2+ 规划] 数据订阅/融合/恢复/管理子系统 │ │ L1 契约层 │ softbus_api (ExecuteCommand) │ │ L0 内核层 │ softbus_core ◄──────────────────────────────┘ (模型、日志、插件 ABI、配置、身份标识) ``` #### 表 2-1 模块职责速查 | 模块 | 路径 | 职责 | |--------------------|---------------------------|------------------------------------------------| | softbus_core | src/softbus_core | 数据模型、Plugin ABI、日志、配置、PlatformSignal | | softbus_api | src/softbus_api | ExecuteCommand 等跨模块控制面契约 | | softbus_transport | src/softbus_transport | TcpUplinkClient/Server、UplinkWire 编解码 | | softbus_registry | src/softbus_registry | 逻辑点表、BindingRegistry、PointRegistry | | softbus_pipeline | src/softbus_pipeline | RawPacket 解析管道与 Bus 订阅 | | softbus_opcua | src/softbus_opcua | OPC UA 服务端、地址空间、Method、事件桥 | | softbus_command | src/softbus_command | 下行命令提交、状态机、ACK 等待 | | softbus_monitor | src/softbus_monitor | 心跳超时监测、edge 在线/离线事件 | | softbus_storage | src/softbus_storage | 时序数据落盘(JSONL) | | softbus_bus | src/softbus_bus | 进程内 Pub/Sub 消息总线 | | softbus_edge | src/softbus_edge | 物理采集、上行、下行写回 | | softbus_daemon | src/softbus_daemon | 编排中心(CoreService) | | plugins | src/plugins | Modbus / CANopen 协议动态库 | ### 2.3 运行时拓扑 ``` OPC UA Client 现场设备 opc.tcp://:4840 Modbus / CAN / Eth │ ▲ ▼ │ 驱动 I/O ┌──────────────────────────────────────────────────────────┐ │ softbus_daemon │ │ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐ │ │ │ UaServer │◄──│ UaModelBinder│◄──│ PipelineEngine│ │ │ │ Engine │ └──────────────┘ └───────▲───────┘ │ │ └──────┬──────┘ │ │ │ │ ExecuteCommand │ RawPacket│ │ ┌──────▼──────┐ ┌──────────────┐ ┌───────┴───────┐ │ │ │CommandService│ │ Bus (Pub/Sub)│◄──│TransportBridge│ │ │ └──────┬──────┘ └──────────────┘ └───────▲───────┘ │ │ │ ┌─────────┴────────┐ │ │ ┌──────▼──────────────────────────│ TcpUplinkServer │ │ │ │ HeartbeatMonitor · StorageService│ :9000 │ │ │ └──────────────────────────────────┴────────┬────────┘ │ └───────────────────────────────────────────────┼──────────┘ │ TCP JSON ┌───────────────────────────────────────────────▼──────────┐ │ softbus_edge │ │ ┌─────────────────┐ ┌─────────────────────────┐ │ │ │ IngressWorker │ poll │ CompositeIngress │ │ │ │ (采集线程) │────────►│ Modbus / CAN / Eth │ │ │ └────────┬────────┘ └─────────────────────────┘ │ │ │ push │ │ ┌────────▼────────┐ drain ┌─────────────────────────┐ │ │ │ PacketQueue │──────────►│ 主线程:心跳 + uplink │ │ │ └─────────────────┘ │ CommandExecutor 写回 │ │ │ └─────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘ ``` ### 2.4 双域配置模型 系统采用 **物理域(edge)** 与 **逻辑域(daemon)** 分离: | 配置域 | 典型文件 | 加载方 | 用途 | |----------|---------------------------------------|--------|------------------------------------| | 物理域 | config/edge/physical_channels.json | edge | 串口、TCP、CAN 接口参数 | | 物理域 | config/edge/physical_devices.json | edge | 从站、寄存器、物理点、CANopen 节点 | | 物理域 | config/edge/bindings_local.json | edge | 下行写命令本地备用解析(可选) | | 逻辑域 | config/daemon/logical_points.json | daemon | OPC UA 逻辑点与对象模型 | | 逻辑域 | config/daemon/bindings_global.json | daemon | 物理点 ↔ 逻辑点 ↔ edgeId 绑定 | | 运行配置 | config/daemon/daemon_profile.json | daemon | OPC UA 端口、uplink 端口、插件名 | | 运行配置 | config/edge/edge.json | edge | edgeId、daemon 地址、心跳周期 | edge 上行时**不做** binding 初筛:所有已配置物理点均采集上报;是否映射到 OPC UA 节点由 daemon 的 `bindings_global.json` 决定。未绑定点进入 `edge/unbound/raw/...` 主题,不进入 Pipeline 解析。 ### 2.5 对象模型五层结构 对象寻址路径格式:`Site/System/Asset/Device/Point` ``` DemoSite └── DemoSystem └── DemoAsset └── EdgeDevice_01 ├── MotorTemperature ← OPC UA Variable ├── MotorSpeed └── ValveOpening ← 可写,支持 Method 下行 ``` 逻辑点表由 `PointRegistry` 加载,驱动 `UaAddressSpaceBuilder` 动态构建 OPC UA 地址空间。 ### 2.6 数据流概览 #### 2.6.1 上行(设备 → OPC UA) ``` 现场硬件 → ChannelManager(Modbus/CAN/Eth,per-channel 互斥) → *Ingress::poll()(IngressWorker 采集线程) → PacketQueue → 主线程 drain → UplinkClient::sendRawPacket() → TCP :9000 → TransportBusBridge → Bus → PipelineEngine::process() → protocol_*.so Framer → Parser → DOMMessage → BindingRegistry 查逻辑点 → UaModelBinder → OPC UA Variable 写值 → StorageService 落盘 timeseries.jsonl ``` #### 2.6.2 下行(OPC UA → 设备) ``` OPC UA Client 调用 ExecuteCommand Method → UaMethodBinder → CommandService::submit() → BindingRegistry 解析 logicalPointId → physicalPointId + edgeId → TcpUplinkServer::sendCommand() → edge TcpUplinkClient(io 线程回调) → CommandExecutor::execute() → ModbusEgress / CanEgress / EthEgress → ChannelManager 写寄存器 / SDO / 裸帧 → SoftbusAck 回传 daemon ``` #### 2.6.3 心跳与在线监测 - edge 主线程按 `heartbeatPeriodMs`(默认 1000 ms)向 daemon 发送心跳。 - daemon `HeartbeatMonitor` 订阅 Bus 心跳主题,超时(默认 5 s)发布 edge offline 事件。 - 采集与 Modbus 重连已移至 **IngressWorker 独立线程**,主线程不再被阻塞,避免心跳饿死导致误判断线。 ### 2.7 Edge 多线程架构(已实现) | 线程 | 职责 | |-----------------|------------------------------------------------| | 主线程 | ConfigWatcher、心跳、tickUplink、drain 队列发包 | | IngressWorker | ingress_->poll() → PacketQueue.push() | | Uplink ioThread | 异步读 TCP、触发 CommandExecutor 下行写 | 并发保护:`ModbusChannelManager`、`CanChannelManager`、`EthChannelManager` 均为每个物理通道维护独立 `ioMutex`,采集线程与 uplink io 线程上的写操作互斥访问同一总线/套接字。 ### 2.8 全局约束原则 1. **传输中立**:`softbus_core` 模型字段不得编码 OPC UA、HTTP 等特定语义。 2. **单向依赖**:上层可依赖下层,下层不得反向引用 daemon/edge/opcua。 3. **插件 ABI 稳定**:C ABI 导出 `create_framer` / `create_parser`,保证插件可独立升级。 4. **traceId 贯穿**:RawPacket → DOMMessage → OPC UA → 日志,全程可追踪。 5. **热加载**:edge 监视 physical 配置;daemon 监视 logical_points 与 bindings_global(SIGHUP / ConfigWatcher)。 --- ## 第 3 章 Daemon 软件 ### 3.1 Daemon 概览 Daemon 软件(`softbus_daemon`)作为软总线软件的**核心运行进程**,实现以下功能: - 监听边缘代理 TCP 上行,接收 `RawPacket`、心跳、注册信息; - 加载协议插件,将原始帧解析为统一语义消息; - 维护逻辑点表与全局绑定,驱动 OPC UA 地址空间; - 接收北向 OPC UA Method 调用,经 CommandService 路由至对应 edge; - 监测 edge 心跳,发布在线/离线事件; - 可选时序数据持久化。 Daemon **不**直接访问串口、CAN 或 Modbus 硬件;所有物理 I/O 由 edge 完成。 --- ### 3.2 架构设计 #### 3.2.1 组件关系 `CoreService` 是唯一编排入口,按序装配各子系统: ``` CoreService(编排中心) ├── ProfileLoader ← daemon_profile.json ├── PointRegistry ← logical_points.json / topic_rule.json ├── BindingRegistry ← bindings_global.json ├── PluginLoader (modbus) ← protocol_modbus.so ├── Bus::instance() ← 进程内消息总线 ├── CommandService ← 下行命令状态机 ├── StorageService ← 时序落盘 ├── HeartbeatMonitor ← edge 心跳超时 ├── UaServerEngine ← OPC UA 服务端 :4840 ├── UaAddressSpaceBuilder ← 由 ObjectModelTree 构建节点 ├── UaModelBinder ← DOMMessage → Variable 写值 ├── UaMethodBinder ← ExecuteCommand Method 入口 ├── UaEventBridge ← 事件桥接(Phase 1 stub) ├── PipelineEngine ← RawPacket 解析管道 ├── TransportBusBridge ← TCP ↔ Bus 桥接 ├── TcpUplinkServer ← 上行监听 :9000 └── ConfigWatcher ← 配置热加载 ``` #### 3.2.2 线程模型 | 线程 / 上下文 | 职责 | |--------------------|---------------------------------------------------| | 主线程(run 循环) | uaEngine_->iterate()、heartbeatMonitor_.tick()、ConfigWatcher | | ioThread_ | asio io_context,处理 TcpUplinkServer 异步 I/O | | OPC UA 内部线程 | open62541 服务端事件(由 iterate 驱动) | 主循环伪代码: ```cpp while (!shouldStop()) { configWatcher_.poll(); if (reloadRequested()) reloadConfig(); uaEngine_->iterate(); heartbeatMonitor_.tick(); sleep(10ms); } ``` --- ### 3.3 功能设计 #### 3.3.1 上行接入 | 功能项 | 实现组件 | 说明 | |--------------|-----------------------|------------------------------------------------| | TCP 监听 | TcpUplinkServer | 默认 127.0.0.1:9000,支持多 edge 连接 | | 线协议解码 | UplinkWire | JSON 行:rawPacket / executeCommand / heartbeat | | Bus 发布 | TransportBusBridge | 按 topic 规则发布至 Bus | | 协议解析 | PipelineEngine + 插件 | Framer → Parser → DOMMessage | | 绑定映射 | BindingRegistry | physicalPointId → logicalPointId | | OPC 写值 | UaModelBinder | 更新 Variable 节点 | | 时序存储 | StorageService | 写入 data/logs/timeseries.jsonl | #### 3.3.2 下行控制 | 功能项 | 实现组件 | 说明 | |--------------|-----------------------|------------------------------------------------| | Method 入口 | UaMethodBinder | OPC UA ExecuteCommand 方法 | | 命令校验 | CommandService | objectRef 校验、路由解析、状态机 | | edge 路由 | BindingRegistry | logicalPointId → edgeId + physicalPointId | | TCP 发送 | TcpUplinkServer | 编码 ExecuteCommand 线消息 | | ACK 等待 | CommandService | 等待 edge SoftbusAck,返回 JSON 结果 | #### 3.3.3 运维与监测 | 功能项 | 实现组件 | 说明 | |--------------|-----------------------|------------------------------------------------| | 心跳监测 | HeartbeatMonitor | 超时判定 edge offline | | 配置热加载 | ConfigWatcher + SIGHUP| 重载 logical_points、bindings_global | | 插件热路径 | resolvePluginPath() | 多目录搜索 libprotocol_*.so | | 自测模式 | --self-test | 启动 3 s 后自动下发写命令 | --- ### 3.4 方案设计 #### 3.4.1 启动序列 `CoreService::start(profilePath, logicalPointsPath, bindingsGlobalPath)` 按序执行: | 步骤 | 操作 | 失败行为 | |------|-------------------------------------------|------------| | 1 | ProfileLoader 加载 daemon_profile.json | 返回 false | | 2 | PointRegistry 加载 logical_points.json | 返回 false | | 3 | BindingRegistry 加载 bindings_global.json | 返回 false | | 4 | PluginLoader 加载 protocol_modbus.so | 返回 false | | 5 | 初始化 Bus、CommandService、Storage、Monitor | — | | 6 | UaServerEngine 启动 OPC UA | 返回 false | | 7 | UaAddressSpaceBuilder 构建地址空间 | 返回 false | | 8 | PipelineEngine 挂载 Bus 订阅 | — | | 9 | TcpUplinkServer 启动 + ioThread | — | | 10 | UaMethodBinder 绑定 CommandService | — | #### 3.4.2 Pipeline 三阶段处理 ``` process(RawPacket) Stage 1 分帧 plugin_->framer()->extract(payload) Stage 2 解析 plugin_->parser()->parseFrame(frame, sourceId) → DOMMessage Stage 3 绑定 bindings 查表 → UaModelBinder::bind(DOMMessage) StorageService 记录时序 ``` - 分帧失败:使用原始 payload 继续解析; - 解析失败:记录 warnTrace 日志,丢弃消息; - 无绑定:发布至 unbound 主题,不进入 OPC 绑定。 #### 3.4.3 插件路径解析 `resolvePluginPath(pluginName, profilePath)` 搜索顺序: 1. `{profileDir}/lib/` 2. `{cwd}/config/lib/` 3. `{exeDir}/`、`{exeDir}/../lib/` 4. `build/lib/`、`lib/` #### 3.4.4 CLI 参数 | 参数 | 默认值 | 说明 | |-----------------------|-------------------------------------|----------------| | `--config` | config/daemon/daemon_profile.json | 运行配置 | | `--logical-points` | config/daemon/logical_points.json | 逻辑点表 | | `--bindings-global` | config/daemon/bindings_global.json | 全局绑定 | | `--point-table` | — | 兼容旧参数 | | `--self-test` | 关闭 | 自动写值测试 | --- ### 3.5 模块设计 #### 3.5.1 CoreService 核心服务模块 **路径:** `src/softbus_daemon/include/softbus_daemon/core/CoreService.h` **职责:** Daemon 唯一编排入口,负责子系统生命周期管理、配置加载、主循环驱动。 ##### (1)类接口 | 方法 | 说明 | |--------------------------------------------------------------|--------------------------| | `start(profilePath, logicalPointsPath, bindingsGlobalPath)` | 按序启动全部子系统 | | `stop()` | 停止 uplink、io、OPC UA | | `run(selfTest)` | 阻塞主循环直至收到退出信号 | ##### (2)核心成员 | 成员 | 类型 | 职责 | |-----------------------|-------------------------|------------------------------| | `registry_` | PointRegistry | 逻辑点表与 ObjectModelTree | | `bindingRegistry_` | BindingRegistry | 物理—逻辑绑定与下行路由 | | `modbusPlugin_` | PluginLoader | Modbus 协议插件句柄 | | `pipeline_` | PipelineEngine | 上行解析管道 | | `commandService_` | CommandService | 下行命令服务 | | `uaEngine_` | UaServerEngine | OPC UA 服务端 | | `uaBinder_` | UaModelBinder | 语义消息 → Variable | | `uaMethodBinder_` | UaMethodBinder | Method → CommandService | | `uplink_` | TcpUplinkServer | 边缘 TCP 接入 | | `transportBridge_` | TransportBusBridge | TCP 与 Bus 双向桥接 | | `heartbeatMonitor_` | HeartbeatMonitor | edge 在线状态 | | `storageService_` | StorageService | 时序持久化 | | `configWatcher_` | ConfigWatcher | 配置文件变更监视 | ##### (3)关键回调绑定 ```cpp // 上行:TransportBusBridge 将 RawPacket 发布至 Bus // PipelineEngine 订阅 edge/raw/# 并 process() // 下行:OPC UA Method → CommandService uaMethodBinder_->bindExecuteCommand([this](const ExecuteCommand& cmd) { return commandResultJson(commandService_->submit(cmd, true)); }); ``` ##### (4)配置热加载 - `SIGHUP` 或 `ConfigWatcher` 触发 `reloadConfig()`; - 重载 `logical_points.json`、`bindings_global.json`; - 通过 `PointRegistry::diff()` 记录新增逻辑点数量; - Phase 1 热加载**不**重建 OPC UA 地址空间(增量构建为 Phase 2 规划)。 ##### (5)依赖关系 ``` CoreService → softbus_core, softbus_api, softbus_transport → softbus_pipeline, softbus_command, softbus_monitor → softbus_storage, softbus_registry, softbus_bus → softbus_opcua, asio → protocol_modbus(构建依赖) ``` --- #### 3.5.2 其他 Daemon 关联模块(概要) | 模块 | 路径 | 与 CoreService 关系 | |-------------------|------------------------------|----------------------------------------| | PipelineEngine | src/softbus_pipeline | CoreService 创建并 attachBus | | CommandService | src/softbus_command | CoreService 创建,MethodBinder 调用 | | HeartbeatMonitor | src/softbus_monitor | CoreService 创建,主循环 tick | | StorageService | src/softbus_storage | CoreService 创建,attachBus 落盘 | | TransportBusBridge| src/softbus_transport | CoreService 创建,连接 uplink 与 Bus | | PointRegistry | src/softbus_registry | CoreService 加载逻辑配置 | | BindingRegistry | src/softbus_registry | CoreService 加载全局绑定 | | UaServerEngine | src/softbus_opcua | CoreService 启动北向服务 | --- ## 第 4 章 数据服务层演进(采集之上的能力扩展) > **本章定位:** 说明当前架构仅覆盖“采集—解析—暴露—落盘”主链路;数据管理、数据恢复、数据订阅、数据融合将在同一 Bus 与语义模型之上分层建设,而非替换现有 edge/daemon 分工。 ### 4.1 当前能力边界(Phase 1) #### 已具备 | 能力 | 实现位置 | 说明 | |----------------|----------------------------------|------------------------------------------------| | 多协议采集 | softbus_edge | Modbus / CANopen / Eth,IngressWorker 多线程 | | 协议解析 | PipelineEngine + plugins | RawPacket → DOMMessage | | 物理—逻辑映射 | BindingRegistry | physicalPointId → logicalPointId | | 北向读 | UaModelBinder | DOMMessage → OPC UA Variable(最新值) | | 北向写/命令 | CommandService | OPC UA Method → edge 写回 | | 进程内发布 | Bus `data/{deviceId}/{pointId}` | Pipeline 解析后发布 SoftbusDataPoint | | 基础落盘 | StorageService | 订阅 `data/#` 写入 timeseries.jsonl | | 在线监测 | HeartbeatMonitor | edge 心跳超时 → offline 事件 | | 变化过滤 | edge ChangeFilter | deadband / reportOnChange,减少上行流量 | #### 尚未具备 | 能力 | 差距说明 | |----------------|------------------------------------------------------------------| | 数据管理 | 无统一元数据注册表、无质量码策略、无保留/归档策略、无访问 ACL | | 数据订阅 | Bus 仅进程内;OPC UA Subscription 未完整实现;无外部 MQTT/HTTP 订阅网关 | | 数据融合 | TimeAligner 已实现但未接入 Pipeline;无合成测点/关联规则引擎 | | 数据恢复 | 无 edge 断线缓存与补传;无历史回放 API;无冗余源自动切换 | ### 4.2 目标总体架构(采集 + 数据服务) 在 Phase 1 的“采集管道”之上,增加 **数据服务层(Data Service Layer)**,与采集层通过 Bus 解耦: ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ 北向消费层 (Northbound) │ │ OPC UA Client · 订阅网关(MQTT/HTTP) · 可视化 · 第三方 MES/SCADA │ └───────────────────────────────┬─────────────────────────────────────────┘ │ 订阅 / 查询 / 回放 ┌───────────────────────────────▼─────────────────────────────────────────┐ │ 数据服务层 (Phase 2~4,待建设) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 数据管理 │ │ 数据订阅 │ │ 数据融合 │ │ 数据恢复 │ │ │ │ MetadataReg │ │ SubManager │ │ FusionEngine│ │ RecoverySvc │ │ │ │ Catalog/ACL │ │ QoS/Filter │ │ TimeAligner │ │ Buffer/Replay│ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ └────────────────┴──────────────┴──────────────┘ │ │ softbus_bus │ │ data/# · fused/# · event/# · recovery/# · metadata/# │ └───────────────────────────────┬─────────────────────────────────────────┘ │ 已发布 SoftbusDataPoint / DOMMessage ┌───────────────────────────────▼─────────────────────────────────────────┐ │ 采集与解析层 (Phase 1,已实现) │ │ edge 采集 → uplink → PipelineEngine → Binding → UaModelBinder │ │ StorageService (JSONL append) │ └───────────────────────────────┬─────────────────────────────────────────┘ │ 现场设备 / 传感器 ``` **设计原则:** 1. **采集不变**:edge 仍只负责物理 I/O 与 RawPacket 上行,不承载融合/恢复逻辑。 2. **Bus 为中心**:所有数据服务模块仅订阅/发布 Bus 主题,不反向依赖 OPC UA 或 TCP 细节。 3. **逻辑点为一等公民**:融合结果、恢复补洞、订阅过滤均以 `logicalPointId` / `objectRef` 标识。 4. **可渐进交付**:四个子能力可独立 Phase 交付,通过 Bus 主题约定保持兼容。 ### 4.3 数据订阅(Data Subscription) #### 4.3.1 目标 让上层应用按**主题、逻辑点、对象路径或表达式**接收数据推送,而不是仅通过 OPC UA 客户端轮询 Variable 最新值。 #### 4.3.2 分层设计 | 层级 | 组件(规划) | 职责 | |----------------|---------------------|------------------------------------------------| | 进程内订阅 | Bus(已有) | `subscribe("data/DemoAsset/#")` 过滤 | | 订阅管理 | SubscriptionManager | 注册订阅者、QoS、采样/聚合策略、背压 | | OPC UA 订阅 | UaSubscriptionBridge| 将 Bus DataPoint 驱动 OPC UA MonitoredItem | | 北向网关 | SubGateway (MQTT等) | 对外发布 `data/{deviceId}/{pointId}` 映射主题 | #### 4.3.3 主题约定(已有基础) `config/daemon/topic_rule.json` 已定义: ```json { "data": "data/{deviceId}/{pointId}", "command": "control/cmd/{deviceId}/{pointId}/set", "ack": "control/ack/{deviceId}/{pointId}", "event": "event/{deviceId}/{eventType}", "heartbeat": "system/heartbeat/{deviceId}" } ``` Phase 2 扩展主题(规划): | 主题模式 | 载荷类型 | 用途 | |-----------------------|-----------------|--------------------------| | `fused/{logicalPointId}` | SoftbusDataPoint | 融合后的合成测点 | | `recovery/{edgeId}/gap` | GapReport | 通信中断区间上报 | | `metadata/point/{id}` | PointMetadata | 元数据变更通知 | #### 4.3.4 QoS 维度(规划) - **采样率**:订阅侧 maxRateHz,高于采集率时由 SubscriptionManager 降采样。 - **可靠性**:AtMostOnce / AtLeastOnce;关键测点走持久化队列。 - **延迟上限**:融合/订阅链路 SLA 监控,超时打 quality=Uncertain。 ### 4.4 数据融合(Data Fusion) #### 4.4.1 目标 实现第 0.2 节所述“**动态分析设备间潜在关联,促进设备感知信息互补**”:将来自不同 edge、不同协议、不同采样周期的测点,对齐到统一时间轴,计算合成量或关联事件。 #### 4.4.2 典型场景 | 场景 | 输入 | 输出 | |------------------|------------------------------------|------------------------------| | 多源对齐 | 温度(Modbus) + 转速(CANopen) | 同一 anchor 时刻的对齐样本 | | 冗余互补 | 双 Modbus 读同一物理量 | 择优或加权平均 | | 衍生计算 | 电流 + 电压 | 功率(合成 logicalPoint) | | 事件关联 | 阀位 + 流量 | 开阀-流量响应事件 | #### 4.4.3 组件设计(规划) ``` Bus data/# ──► FusionEngine ├── TimeAligner(已有 softbus_core,待接入) ├── FusionRuleRegistry(规则配置:表达式 / 关联表) ├── SyntheticPointPublisher └── publish → fused/# + StorageService ``` **已有基础:** `softbus_core::TimeAligner` 支持按时间窗口(默认 50 ms)多通道 Nearest/Linear 对齐,当前 **未接入** Pipeline 主路径。 **配置示例(规划):** ```json { "fusionRules": [ { "outputLogicalPointId": "EdgeDevice_01/ShaftPower", "inputs": ["EdgeDevice_01/MotorCurrent", "EdgeDevice_01/MotorVoltage"], "expression": "current * voltage", "alignWindowMs": 100 } ] } ``` ### 4.5 数据恢复(Data Recovery) #### 4.5.1 目标 在 edge 断连、网络闪断或单源故障时,保证上层看到的数据**可解释、可补全、可切换**,避免“静默丢数”。 #### 4.5.2 恢复策略 | 策略 | 触发条件 | 行为(规划) | |----------------|-----------------------|---------------------------------------------------| | edge 本地缓存 | uplink 不可达 | edge 环形缓冲 RawPacket,恢复后按序补传 | | daemon 缺口检测| 心跳超时 / 时间戳跳变 | 标记 `[t0,t1]` 为 Gap,发布 recovery 事件 | | 历史回放 | 运维 / 算法重算 | RecoveryService 从时序库按时间范围重放至 Bus | | 冗余源切换 | 主 physicalPoint 失效 | Binding 中声明 backup,RecoverySvc 切换数据源 | | 插值补洞 | 短缺口 & quality=Bad | FusionEngine 或 RecoverySvc 线性/前值填充(可配置)| #### 4.5.3 与 HeartbeatMonitor 的衔接 当前 `HeartbeatMonitor` 在超时后发布 offline 事件;RecoveryService 应订阅该事件,联动: 1. 将受影响 logicalPoint 的 quality 置为 Bad/Uncertain; 2. 若存在冗余 binding,自动切换至 backup physicalPoint; 3. edge 重连后触发 **gap fill 补传协议**(uplink 扩展消息类型 `replayBatch`)。 #### 4.5.4 edge 侧扩展(规划) ``` uplink 断连期间: PacketQueue(已有)→ 持久化 RingBuffer(新增 RecoveryBuffer) uplink 恢复: sendReplayBatch(RawPacket[]) → daemon RecoveryService 去重合并 ``` ### 4.6 数据管理(Data Management) #### 4.6.1 目标 使软总线在传递数据的同时承担**信息管理**职责:谁产生、何时有效、质量如何、保留多久、谁能访问。 #### 4.6.2 管理维度 | 维度 | 内容(规划) | Phase 1 现状 | |--------------|-----------------------------------------------------------|---------------------| | 元数据 | 点描述、单位、量程、采样周期、数据源 edgeId | logical_points 部分有 | | 质量码 | Good / Uncertain / Bad,带来源与时间戳 | 未映射至 OPC Status | | 生命周期 | 热数据 / 温数据 / 归档策略 | 仅 JSONL 无限追加 | | 目录与检索 | 按 Site/System/Asset 浏览、按 tag 搜索 | ObjectModelTree 静态 | | 访问控制 | 读/写/订阅权限(与 OPC UA Role 或外部 IAM 对接) | 未实现 | | 血缘 | physicalPoint → binding → logicalPoint → fusedPoint | 仅 binding 静态配置 | #### 4.6.3 组件设计(规划) ``` MetadataRegistry(daemon 已有 stub,未接入 CoreService) ├── 与 PointRegistry / BindingRegistry 联合索引 ├── 发布 metadata/# 变更事件 └── 为 SubscriptionManager / FusionEngine 提供查询 API CatalogService ├── 数据资产编目(设备、测点、主题、保留策略) └── StorageService 升级:按策略轮转 / 压缩 / 导出 Parquet RetentionPolicy └── 配置:timeseries 保留 30 天,event 保留 90 天,fused 保留 7 天 ``` #### 4.6.4 StorageService 演进 当前 `StorageService` 订阅 `data/#`、`control/ack/#`、`event/#` 追加 JSONL。 演进方向: - 分表/分文件:按 deviceId 或日期切分; - 索引:时间范围查询接口,供 RecoveryService 回放; - 与 MetadataRegistry 联动:落盘记录含 quality、sourceEdgeId、bindingId。 ### 4.7 四能力协作关系 ```mermaid flowchart LR subgraph collect [采集层 Phase1] Edge[softbus_edge] Pipeline[PipelineEngine] end subgraph bus [Bus] DataTopic[data/#] FusedTopic[fused/#] RecoveryTopic[recovery/#] end subgraph mgmt [数据管理] Meta[MetadataRegistry] Catalog[CatalogService] Storage[StorageService] end subgraph sub [数据订阅] SubMgr[SubscriptionManager] OpcSub[UaSubscriptionBridge] Gateway[SubGateway] end subgraph fusion [数据融合] Align[TimeAligner] Fusion[FusionEngine] end subgraph recovery [数据恢复] RecSvc[RecoveryService] EdgeBuf[edge RecoveryBuffer] end Edge --> Pipeline Pipeline --> DataTopic DataTopic --> Storage DataTopic --> Align Align --> Fusion Fusion --> FusedTopic DataTopic --> SubMgr FusedTopic --> SubMgr SubMgr --> OpcSub SubMgr --> Gateway Meta --> Catalog Meta --> SubMgr RecSvc --> RecoveryTopic EdgeBuf --> RecSvc RecSvc --> DataTopic HeartbeatMonitor --> RecSvc ``` **典型链路示例:** 1. **正常订阅:** 采集 → Pipeline → `data/#` → SubscriptionManager → OPC UA / MQTT 推送。 2. **融合订阅:** 多路 `data/#` → TimeAligner → FusionEngine → `fused/#` → 订阅者。 3. **断线恢复:** Heartbeat 超时 → RecoveryService 标记 Gap → edge 补传 → 合并入 Storage → quality 恢复 Good。 4. **管理审计:** MetadataRegistry 记录血缘 → Catalog 展示 → RetentionPolicy 归档历史。 ### 4.8 分阶段交付路线 | 阶段 | 主题 | 交付内容 | 依赖现有模块 | |--------|----------------|--------------------------------------------------------------|---------------------------| | Phase 1 | 数据采集 | edge 多线程采集、Pipeline、OPC UA、JSONL 落盘、Bus 发布 | **当前** | | Phase 2 | 数据订阅 + 管理 | SubscriptionManager、OPC UA Subscription、MetadataRegistry 接入、Storage 分片与索引 | Bus、PointRegistry、StorageService | | Phase 3 | 数据融合 | TimeAligner 接入、FusionRule 配置、合成测点发布至 fused/# | Pipeline publishDataPoint | | Phase 4 | 数据恢复 | edge RecoveryBuffer、gap 协议、冗余 binding 切换、历史回放 API | HeartbeatMonitor、Transport | ### 4.9 与 CoreService 的集成方式(规划) 四个子能力均作为 **CoreService 的可选子模块** 挂载,不改变 edge 进程边界: ```cpp // 规划:CoreService::start() 扩展 metadataRegistry_->load(...); subscriptionManager_->attachBus(&bus); fusionEngine_->attachBus(&bus); // 订阅 data/#,发布 fused/# recoveryService_->attachBus(&bus); // 订阅 event/#、heartbeat // StorageService 升级为 IDataStore 接口,供 Recovery 查询 ``` 模块间**仅通过 Bus 主题与 Registry 查询 API 通信**,避免 CoreService 直接调用 Fusion/Recovery 内部细节,保持与 Phase 1 插件化风格一致。 --- ## 附录 A Edge 软件概要 > Edge 详细设计见 [softbus_edge.md](softbus_edge.md)。 | 项目 | 说明 | |------------|--------------------------------------------------------------| | 进程 | softbus_edge | | 核心类 | EdgeRuntime、IngressWorker、PacketQueue、CommandExecutor | | 采集 | CompositeIngress(ModbusIngress + CanIngress + EthIngress) | | 调度 | ModbusPollScheduler、PollPlanner、ChangeFilter | | CANopen | NmtManager、PdoMapper、SdoClient | | 上行 | UplinkClient → TcpUplinkClient(独立 ioThread) | | 并发 | 采集线程 + 主线程 + uplink io 线程;per-channel ioMutex | --- ## 附录 B 文档索引 | 文档 | 内容 | |------------------------------------|--------------------------| | [ARCHITECTURE.md](ARCHITECTURE.md) | 英文分层架构与构建目标 | | [softbus_daemon.md](softbus_daemon.md) | Daemon 模块细节 | | [softbus_edge.md](softbus_edge.md) | Edge 物理层与多线程 | | [数据流转.md](数据流转.md) | 上下行字段映射 | | [UPLINK_WIRE_PROTOCOL.md](UPLINK_WIRE_PROTOCOL.md) | 线协议格式 | | [command_flow.md](command_flow.md) | 下行命令时序 | | [plugins.md](plugins.md) | 协议插件 ABI | --- ## 附录 C 演进路线汇总 ### C.1 Phase 1(当前)— 数据采集与透传 - edge 多协议采集(Modbus / CANopen / Eth)+ IngressWorker 多线程; - Pipeline 解析 + Binding + OPC UA 暴露; - Bus 发布 `data/#` + StorageService JSONL 落盘; - CommandService 下行写回 + HeartbeatMonitor 在线监测。 ### C.2 Phase 2 — 数据订阅与数据管理 - SubscriptionManager + OPC UA MonitoredItem/Subscription 完整实现; - MetadataRegistry 接入 CoreService,质量码映射至 OPC StatusCode; - StorageService 分片、时间范围查询、保留策略; - 可选北向 SubGateway(MQTT/HTTP)。 ### C.3 Phase 3 — 数据融合 - TimeAligner 接入 FusionEngine; - fusionRules 配置化(表达式 / 关联规则); - 合成测点发布至 `fused/#` 并进入 OPC UA 地址空间; - CANopen 插件多路由并行解析。 ### C.4 Phase 4 — 数据恢复 - edge RecoveryBuffer + uplink 补传协议; - RecoveryService:Gap 检测、冗余 binding 切换、历史回放; - 与 Fusion/Subscription 联动 quality 状态机; - 多 edge 负载与故障转移策略。 ### C.5 其他基础设施 - D-Bus IPC 接入 CoreService; - OPC UA 地址空间增量热重建; - TLS/mTLS 生产部署; - CommandExecutor 专用 egress 线程。 --- *文档版本:Phase 1 代码库 + 数据服务层演进规划(第 4 章)。术语定义见第 0.1 节。*