579 lines
23 KiB
Markdown
579 lines
23 KiB
Markdown
|
|
# cloud_interact 程序架构分析
|
|||
|
|
|
|||
|
|
> 分析范围:`process/cloud_apps/cloud_interact` 及其编译依赖的 `processers`、`reuse_utils`
|
|||
|
|
> 程序定位:储能/能源终端设备与云平台(或上级 EMS)之间的通信交互进程
|
|||
|
|
> 作者:代码分析整理
|
|||
|
|
> 日期:2026-06-10
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 程序概述
|
|||
|
|
|
|||
|
|
`cloud_interact` 是云平台通信子系统的核心可执行程序,编译产物链接到 `out/<TARGET_PRODUCT>/bin/cloud_interact`。
|
|||
|
|
|
|||
|
|
### 1.1 核心职责
|
|||
|
|
|
|||
|
|
| 职责 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| 授权管理 | 启动时完成云平台/EMS 授权查询或授权接收,决定直连云还是透传 EMS |
|
|||
|
|
| 云通信 | TCP 连接云平台,完成登录、心跳、上下行数据交互 |
|
|||
|
|
| 数据上报 | 按优先级主动上报设备数据、告警、总览、统计等 |
|
|||
|
|
| 下行控制 | 接收云平台下发的参数读写、控制指令、升级、SSH 等命令 |
|
|||
|
|
| 中继转发 | EMS 终端将子终端(ABMS/PMS)数据转发至云平台 |
|
|||
|
|
| 辅助任务 | 离线数据缓存上报、故障录波上报、远程 SSH 隧道管理 |
|
|||
|
|
|
|||
|
|
### 1.2 源码目录结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
process/cloud_apps/
|
|||
|
|
├── cloud_interact/ # 本程序主体
|
|||
|
|
│ ├── include/ # 通讯交互、授权、状态管理等头文件
|
|||
|
|
│ └── src/ # 实现 + main.cpp
|
|||
|
|
├── processers/ # 各帧类型数据处理器(策略模式)
|
|||
|
|
│ ├── include/
|
|||
|
|
│ └── src/
|
|||
|
|
└── reuse_utils/ # 帧管理、配置、协议单例、下载等公共工具
|
|||
|
|
├── include/
|
|||
|
|
└── src/
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 1.3 外部动态库依赖
|
|||
|
|
|
|||
|
|
通过 `CMakeLists.txt` 链接的主要 SO 库:
|
|||
|
|
|
|||
|
|
- `cloud_protocol` / `cloud_communicator` / `commu_component` — 协议编解码与 TCP 通信
|
|||
|
|
- `runtime_environ` / `running_data` / `cloud_data` / `cloud_command` / `cloud_repeater` — 运行环境与共享内存数据
|
|||
|
|
- `upgrade_task` / `ssl_middleware` / `system_config` — 升级、SSL、系统配置
|
|||
|
|
- `mutex_log` / `curl` / `ssh` 等基础设施库
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. 整体架构
|
|||
|
|
|
|||
|
|
### 2.1 线程模型
|
|||
|
|
|
|||
|
|
程序采用 **单主线程 + 多工作线程** 模型:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ main 主线程 (200ms 轮询) │
|
|||
|
|
│ - 信号处理 / 进程喂狗 / 授权状态监控 / 任务启停 / 日志刷新 │
|
|||
|
|
└────────┬──────────────────┬──────────────────┬──────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
▼ ▼ ▼
|
|||
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|||
|
|
│ CCommuInteraction│ │ COfflineDataTask│ │ CFaultRecordTask│
|
|||
|
|
│ (云通信核心线程) │ │ (离线数据线程) │ │ (故障录波线程) │
|
|||
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|||
|
|
|
|||
|
|
授权阶段额外线程(按终端类型):
|
|||
|
|
- EMS: CAuthDistributeTask(授权分发给子终端,detached)
|
|||
|
|
- 非 EMS: CAuthReceiveHandler 在 main 循环中轮询(监听 EMS 广播)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
所有工作线程均继承 `CBaseThread`,实现 `Handle()` / `FeedWatchDog()` / `SleepTime()`。
|
|||
|
|
|
|||
|
|
### 2.2 分层架构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────────────────────────────────────────────────┐
|
|||
|
|
│ 应用层:main.cpp │
|
|||
|
|
│ CAuthManager / CStateManager / CConfigManager │
|
|||
|
|
├──────────────────────────────────────────────────────────┤
|
|||
|
|
│ 任务层:CCommuInteraction / COfflineDataTask / ... │
|
|||
|
|
├──────────────────────────────────────────────────────────┤
|
|||
|
|
│ 通信协助层:CCommunicatorHelper / CForwardHelper │
|
|||
|
|
│ CDownstreamCommand / CDataCache │
|
|||
|
|
├──────────────────────────────────────────────────────────┤
|
|||
|
|
│ 协议处理层:CFrameManager + CDataProcesser 子类群 │
|
|||
|
|
├──────────────────────────────────────────────────────────┤
|
|||
|
|
│ 基础设施层:CProtocolSinglton / SSLLibSinglton │
|
|||
|
|
│ libcloud_* / librunning_data 等共享库 │
|
|||
|
|
└──────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 核心类与调用关系
|
|||
|
|
|
|||
|
|
### 3.1 类关系总览(Mermaid)
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
classDiagram
|
|||
|
|
direction TB
|
|||
|
|
|
|||
|
|
class main {
|
|||
|
|
+main()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CStateManager {
|
|||
|
|
+Instance()
|
|||
|
|
+NotifyQuit()
|
|||
|
|
+NeedQuit()
|
|||
|
|
+NotifyInBlacklist()
|
|||
|
|
+IsUnbindWithStation()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CAuthManager {
|
|||
|
|
+CreateInstance()
|
|||
|
|
+Execute()
|
|||
|
|
+ReceiveAuthBroadcast()
|
|||
|
|
+Deinitialize()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CCloudConnectivityDetector {
|
|||
|
|
+Execute()
|
|||
|
|
+IsTimeToExecute()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CAuthQueryHandler {
|
|||
|
|
+Execute()
|
|||
|
|
+IsAuthPermitted()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CAuthDistributeTask {
|
|||
|
|
<<CBaseThread>>
|
|||
|
|
+Handle()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CAuthReceiveHandler {
|
|||
|
|
+Execute()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CConfigManager {
|
|||
|
|
+Instance()
|
|||
|
|
+Initialize()
|
|||
|
|
+GetStationConfig()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CProtocolSinglton {
|
|||
|
|
+Instance()
|
|||
|
|
+Create()
|
|||
|
|
+Free()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CCommuInteraction {
|
|||
|
|
<<CBaseThread>>
|
|||
|
|
+Initialize()
|
|||
|
|
+Handle()
|
|||
|
|
+ConnectCloud()
|
|||
|
|
+LoginCloud()
|
|||
|
|
+HandleDownstreamData()
|
|||
|
|
+HandleUpstreamData()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CFrameManager {
|
|||
|
|
+CreateDataProcessers()
|
|||
|
|
+DecodeDownstreamFrame()
|
|||
|
|
+GetDataProcesserByFrameType()
|
|||
|
|
+GetPriority2DataProcesser()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CCommunicatorHelper {
|
|||
|
|
+Connect()
|
|||
|
|
+Send()
|
|||
|
|
+Receive()
|
|||
|
|
+Disconnect()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CForwardHelper {
|
|||
|
|
+ForwardDownstreamData()
|
|||
|
|
+ForwardUpstreamData()
|
|||
|
|
+ForwardFaultRecord()
|
|||
|
|
+ForwardOfflineData()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CDownstreamCommand {
|
|||
|
|
+HandleDownstreamRequest()
|
|||
|
|
+CheckDownstreamCommandResults()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CDataCache {
|
|||
|
|
+Instance()
|
|||
|
|
+AddRequestData()
|
|||
|
|
+PushOfflineDataCfg()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CDataProcesser {
|
|||
|
|
<<abstract>>
|
|||
|
|
+EncodeUpstreamRequest()
|
|||
|
|
+DecodeDownstreamRequest()
|
|||
|
|
+TimeToEncodeUpstreamRequest()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CLoginProcesser {
|
|||
|
|
+CreateInstance()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CHeartBeatProcesser {
|
|||
|
|
+CreateInstance()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class COfflineDataTask {
|
|||
|
|
<<CBaseThread>>
|
|||
|
|
+Handle()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CFaultRecordTask {
|
|||
|
|
<<CBaseThread>>
|
|||
|
|
+Handle()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class CRemoteSshHelper {
|
|||
|
|
+Instance()
|
|||
|
|
+Start()
|
|||
|
|
+Stop()
|
|||
|
|
+IsExpired()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main --> CStateManager
|
|||
|
|
main --> CAuthManager
|
|||
|
|
main --> CConfigManager
|
|||
|
|
main --> CProtocolSinglton
|
|||
|
|
main --> CCommuInteraction
|
|||
|
|
main --> COfflineDataTask
|
|||
|
|
main --> CFaultRecordTask
|
|||
|
|
main --> CRemoteSshHelper
|
|||
|
|
|
|||
|
|
CAuthManager --> CCloudConnectivityDetector
|
|||
|
|
CAuthManager --> CAuthQueryHandler
|
|||
|
|
CAuthManager --> CAuthDistributeTask : EMS only
|
|||
|
|
CAuthManager --> CAuthReceiveHandler : non-EMS
|
|||
|
|
|
|||
|
|
CCommuInteraction --> CFrameManager
|
|||
|
|
CCommuInteraction --> CCommunicatorHelper
|
|||
|
|
CCommuInteraction --> CForwardHelper
|
|||
|
|
CCommuInteraction --> CDownstreamCommand
|
|||
|
|
CCommuInteraction --> CDataCache
|
|||
|
|
CCommuInteraction --> CStateManager
|
|||
|
|
CCommuInteraction --> CConfigManager
|
|||
|
|
|
|||
|
|
CFrameManager --> CDataProcesser
|
|||
|
|
CDataProcesser <|-- CLoginProcesser
|
|||
|
|
CDataProcesser <|-- CHeartBeatProcesser
|
|||
|
|
CDataProcesser <|-- CGeneralDataProcesser
|
|||
|
|
CGeneralDataProcesser <|-- "60+ 具体 Processer"
|
|||
|
|
|
|||
|
|
CDownstreamCommand --> CFrameManager
|
|||
|
|
CDownstreamCommand --> CCommunicatorHelper
|
|||
|
|
CDownstreamCommand --> CForwardHelper
|
|||
|
|
CDownstreamCommand --> CRemoteSshHelper
|
|||
|
|
|
|||
|
|
CForwardHelper --> CCommunicatorHelper
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 cloud_interact 模块类清单
|
|||
|
|
|
|||
|
|
| 类名 | 文件 | 类型 | 职责 |
|
|||
|
|
|------|------|------|------|
|
|||
|
|
| `CCommuInteraction` | CommuInteraction.h/cpp | 工作线程 | 云通信主循环:连接→登录→上下行收发 |
|
|||
|
|
| `CCommuInterData` | CommuInteraction.cpp (内部) | 私有数据 | 持有 FrameManager、Communicator、Forward、DownstreamCommand |
|
|||
|
|
| `CCommunicatorHelper` | CommunicatorHelper.h/cpp | 工具类 | 封装 ICloudCommunicator 的连接/发送/接收 |
|
|||
|
|
| `CForwardHelper` | ForwardHelper.h/cpp | 工具类 | EMS 中继场景下子终端数据转发 |
|
|||
|
|
| `CDownstreamCommand` | DownstreamCommand.h/cpp | 命令处理器 | 云平台下行控制指令分发与结果查询 |
|
|||
|
|
| `CDataCache` | DataCahce.h/cpp | 单例 | 在线时长统计、请求追踪、离线/录波数据队列 |
|
|||
|
|
| `CStateManager` | StateManager.h/cpp | 单例 | 进程退出标志、授权异常状态(解绑/拉黑/未注册等) |
|
|||
|
|
| `CAuthManager` | AuthManager.h/cpp | 管理器 | 启动授权流程编排 |
|
|||
|
|
| `CCloudConnectivityDetector` | CloudConnectivityDetector.h/cpp | 探测器 | 探测直连云或可连通服务器参数 |
|
|||
|
|
| `CAuthQueryHandler` | AuthQueryTask.h/cpp | 授权查询 | 向云平台发送授权查询并写 StationConfig |
|
|||
|
|
| `CAuthDistributeTask` | AuthDistributeTask.h/cpp | 工作线程(EMS) | 向子终端分发授权配置 |
|
|||
|
|
| `CAuthReceiveHandler` | AuthReceiveTask.h/cpp | 监听器(非EMS) | 监听 EMS 授权广播(端口 10090) |
|
|||
|
|
| `COfflineDataTask` | OfflineDataTask.h/cpp | 工作线程 | 断网期间离线数据本地缓存与补传 |
|
|||
|
|
| `CFaultRecordTask` | FaultRecordTask.h/cpp | 工作线程 | 故障录波文件采集与上报 |
|
|||
|
|
| `CRemoteSshHelper` | RemoteSshHelper.h/cpp | 单例 | 云平台远程 SSH 隧道启停与过期检测 |
|
|||
|
|
| `CUpgradeTask` | UpgradeTask.h/cpp | 升级辅助 | 升级包下载与任务执行(被 CommuInteraction 调用) |
|
|||
|
|
|
|||
|
|
### 3.3 reuse_utils 模块类清单
|
|||
|
|
|
|||
|
|
| 类名 | 职责 |
|
|||
|
|
|------|------|
|
|||
|
|
| `CConfigManager` | 加载 CloudParameters.xml、StationConfig,管理云通信参数 |
|
|||
|
|
| `CFrameManager` | 帧编解码路由,维护帧类型→Processor 映射与优先级队列 |
|
|||
|
|
| `CFrameHelper` | 通讯帧组包/拆包、授权配置读写等静态工具 |
|
|||
|
|
| `CProtocolSinglton` | 云协议 ICloudProtocol 单例生命周期管理 |
|
|||
|
|
| `CSSLLibSinglton` | SSL 加解密库单例 |
|
|||
|
|
| `CDowloadTask` / `CFtpDownloadTask` / `CSftpDowloadTask` | 升级包下载 |
|
|||
|
|
| `CUdpSender` / `CUdpReceiver` | UDP 通信(授权广播等场景) |
|
|||
|
|
|
|||
|
|
### 3.4 processers 模块 — 数据处理器体系
|
|||
|
|
|
|||
|
|
所有处理器继承自 `CDataProcesser`(抽象基类),通用数据类继承 `CGeneralDataProcesser`。
|
|||
|
|
|
|||
|
|
**基类核心接口:**
|
|||
|
|
|
|||
|
|
- 时机判断:`TimeToEncodeUpstreamRequest()` / `TimeToEncodeDownstreamResponse()` 等
|
|||
|
|
- 编解码:`EncodeUpstreamRequest()` / `DecodeDownstreamRequest()` 等
|
|||
|
|
- 数据填充:`FillUpstreamRequestData()` / `FillDownstreamRequestData()` 等
|
|||
|
|
|
|||
|
|
**处理器按业务分组(头文件):**
|
|||
|
|
|
|||
|
|
| 分组头文件 | 包含处理器 | 业务 |
|
|||
|
|
|-----------|-----------|------|
|
|||
|
|
| `LoginProcesser.h` | CLoginProcesser | 登录/登出 |
|
|||
|
|
| `HeartBeatProcesser.h` | CHeartBeatProcesser | 心跳 |
|
|||
|
|
| `DeviceManageProcessers.h` | CVersionInfoProcesser, CDeviceInfoProcesser, CDeviceStateProcesser | 版本/设备信息/状态 |
|
|||
|
|
| `OverviewProcessers.h` | COverallOverviewProcesser, CTerminalOverviewProcesser, CESSProcesser 等 | 各类总览数据 |
|
|||
|
|
| `DeviceDataProcessers.h` | CPCSProcesser, CPowerMeterProcesser, CSolarInverterProcesser 等 | 设备实时数据 |
|
|||
|
|
| `BMSDataProcessers.h` | CBMSSummaryProcesser, CBMSExtremeProcesser, CBMSCellDetailsProcesser 等 | BMS 数据 |
|
|||
|
|
| `AlarmEventProcessers.h` | CTeleSignalingProcesser, CRealtimeAlarmProcesser, CHistoryAlarmProcesser 等 | 告警/事件 |
|
|||
|
|
| `EMSStrategyProcessers.h` | CDownstreamSchedulingTaskRead/WriteProcesser 等 | EMS 储能策略参数 |
|
|||
|
|
| `EMSBatteryProcessers.h` | CDownstreamSafeProtectionRead/WriteProcesser 等 | 电池安全/校准参数 |
|
|||
|
|
| `EMSControlProcessers.h` | CDownstreamEMSControlProcesser | EMS 控制指令 |
|
|||
|
|
| `TariffParmsProcessers.h` | CDownstreamTariffTypeRead/WriteProcesser 等 | 电价参数 |
|
|||
|
|
| `RemoteUpgradeProcessers.h` | CUpstreamUpgradeTaskQueryProcesser 等 | 远程升级 |
|
|||
|
|
| `RemoteManageProcessers.h` | CDownstreamSshStart/StopProcesser | 远程 SSH |
|
|||
|
|
| `OfflineProcessers.h` | CUpstreamOfflineRequestProcesser | 离线数据请求 |
|
|||
|
|
| `FaultRecordProcessers.h` | CUpstreamFaultRecRequestProcesser | 故障录波 |
|
|||
|
|
| `AuthorizationProcessers.h` | 授权相关帧处理 | 授权交互 |
|
|||
|
|
| `StatisticsProcessers.h` | CRevenueStatisticsProcesser 等 | 收益统计 |
|
|||
|
|
| `SetupProcessers.h` | CDownstreamTermUpdateProcesser 等 | 终端更新/TOU 设置 |
|
|||
|
|
|
|||
|
|
**注册机制:** `CFrameManager` 构造函数中通过 `mapType2ProcesserCreator` 将 `CLOUD_FRAME_TYPE_*` 映射到各 Processor 的 `CreateInstance` 工厂函数,并按 `mapFrameType2Priority` 设定上报优先级。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. 主流程工作流程
|
|||
|
|
|
|||
|
|
### 4.1 程序启动流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
A[main 启动] --> B{运行环境已创建?}
|
|||
|
|
B -- 否 --> Z1[退出 -100]
|
|||
|
|
B -- 是 --> C[清除云平台授权状态]
|
|||
|
|
C --> D[创建日志实例]
|
|||
|
|
D --> E[创建必要目录]
|
|||
|
|
E --> F{云功能已禁用?}
|
|||
|
|
F -- 是 --> Z2[退出 0]
|
|||
|
|
F -- 否 --> G[初始化运行时长统计]
|
|||
|
|
G --> H{进程已运行?}
|
|||
|
|
H -- 是 --> Z3[退出 0]
|
|||
|
|
H -- 否 --> I[注册信号处理]
|
|||
|
|
I --> J[CAuthManager::Execute 阻塞授权]
|
|||
|
|
J -- 失败 --> Z4[退出 -5]
|
|||
|
|
J -- 成功 --> K[重置 CStateManager 状态标志]
|
|||
|
|
K --> L[CConfigManager::Initialize]
|
|||
|
|
L --> M[CProtocolSinglton::Create]
|
|||
|
|
M --> N[CCommuInteraction::Initialize]
|
|||
|
|
N --> O[可选: OfflineDataTask / FaultRecordTask 初始化]
|
|||
|
|
O --> P[启动 CThreadWatchDog]
|
|||
|
|
P --> Q[进入主循环 while true]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 授权管理流程
|
|||
|
|
|
|||
|
|
#### EMS 终端(直连云)
|
|||
|
|
|
|||
|
|
1. `CCloudConnectivityDetector` 循环探测默认/XML 配置的服务器地址,直到 TCP 可连通
|
|||
|
|
2. `CAuthQueryHandler` 循环发送授权查询,直到云平台返回许可
|
|||
|
|
3. 写入 `StationConfig.xml`,通知 `librd_NotifyCloudAuthorized(1)`
|
|||
|
|
4. 启动 `CAuthDistributeTask`(detached 线程),向 `ems_cfg.xml` 配置的子终端分发授权
|
|||
|
|
5. 主流程继续初始化通信模块
|
|||
|
|
|
|||
|
|
#### 非 EMS 终端(ABMS/PMS,直连或透传)
|
|||
|
|
|
|||
|
|
1. 并行执行:
|
|||
|
|
- `CAuthReceiveHandler`:监听 EMS 授权广播(端口 10090)
|
|||
|
|
- `CCloudConnectivityDetector`:探测云平台连通性
|
|||
|
|
2. **若先收到 EMS 广播** → 判定为透传终端,`librd_SetSelfTerminalForwarding(1)`
|
|||
|
|
3. **若先连通云平台** → 执行授权查询:
|
|||
|
|
- 许可成功 → 直连终端
|
|||
|
|
- 拒绝/无响应 → 继续等待 EMS 广播(透传)
|
|||
|
|
4. main 循环中持续调用 `pAuthManager->ReceiveAuthBroadcast()` 接收授权更新
|
|||
|
|
|
|||
|
|
### 4.3 主循环职责(200ms 周期)
|
|||
|
|
|
|||
|
|
主线程在 `while(true)` 中执行:
|
|||
|
|
|
|||
|
|
1. 检查 `CStateManager::NeedQuit()` — 信号触发退出
|
|||
|
|
2. 进程/线程喂狗
|
|||
|
|
3. 非 EMS:接收授权广播
|
|||
|
|
4. **授权异常恢复**:若检测到解绑/拉黑/未注册/电站不匹配/协议未签署/断连需重授权:
|
|||
|
|
- 停止 `CCommuInteraction`
|
|||
|
|
- 释放协议单例
|
|||
|
|
- 重新执行 `CAuthManager::Execute()`
|
|||
|
|
- 重载配置、重建协议、重启通信
|
|||
|
|
5. 启动 `CCommuInteraction`(若未运行)
|
|||
|
|
6. 启动 `COfflineDataTask` / `CFaultRecordTask`(若启用且设备上报开启)
|
|||
|
|
7. 检查守护进程状态、重启请求
|
|||
|
|
8. 检查 `CRemoteSshHelper::IsExpired()` 并自动停止过期 SSH
|
|||
|
|
9. 定时刷新日志、更新运行时长(5 分钟)
|
|||
|
|
|
|||
|
|
### 4.4 CCommuInteraction 通信线程流程
|
|||
|
|
|
|||
|
|
`Handle()` 每次循环(休眠 20ms)按固定顺序执行:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
flowchart TD
|
|||
|
|
H0[Handle 入口] --> H1{首次运行?}
|
|||
|
|
H1 -- 是 --> H1a[LogoutCloud + 初始化 CDataCache]
|
|||
|
|
H1 -- 否 --> H2
|
|||
|
|
H1a --> H2{需要退出?}
|
|||
|
|
H2 -- 是 --> EXIT[返回 -1]
|
|||
|
|
H2 -- 否 --> H3[ConnectCloud TCP连接]
|
|||
|
|
H3 -- 失败 --> RET0[返回 0 重试]
|
|||
|
|
H3 -- 成功 --> H4[LoginCloud 登录]
|
|||
|
|
H4 -- 失败 --> H4a{授权异常?}
|
|||
|
|
H4a -- 是 --> EXIT
|
|||
|
|
H4a -- 否 --> RET0
|
|||
|
|
H4 -- 成功 --> H5[处理未完成升级任务]
|
|||
|
|
H5 --> H6[CheckDownstreamCommandResults 查询控制结果]
|
|||
|
|
H6 --> H7[HandleDownstreamData 接收并处理下行]
|
|||
|
|
H7 --> H8[HandleUpstreamData 按优先级上报上行]
|
|||
|
|
H8 --> H9{EMS转发有效?}
|
|||
|
|
H9 -- 是 --> H10[ForwardUpstreamData 转发子终端上行]
|
|||
|
|
H9 -- 否 --> H11
|
|||
|
|
H10 --> H11[ForwardFaultRecord 转发故障录波]
|
|||
|
|
H11 --> H12[ForwardOfflineData 转发离线数据]
|
|||
|
|
H12 --> H13{5分钟无响应?}
|
|||
|
|
H13 -- 是 --> H13a[LogoutCloud 重连]
|
|||
|
|
H13 -- 否 --> H14[定时更新在线时长]
|
|||
|
|
H14 --> OK[返回 1]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.4.1 连接与登录
|
|||
|
|
|
|||
|
|
- **ConnectCloud**:通过 `CCommunicatorHelper::Connect()` 建立 TCP,更新 `librd` 连接状态,指数退避重连
|
|||
|
|
- **LoginCloud**:
|
|||
|
|
1. `CLoginProcesser` 构造登录请求帧
|
|||
|
|
2. `CFrameHelper::EncodeUpstreamFrame` 组包
|
|||
|
|
3. `CCommunicatorHelper::Send` 发送
|
|||
|
|
4. 接收并解析登录响应,调用 `CConfigManager::UpdateLoginResponse`
|
|||
|
|
5. 更新 `CDataCache` 上线时间,设置 `bCloudLoggined = true`
|
|||
|
|
|
|||
|
|
#### 4.4.2 下行数据处理(云平台 → 终端)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
ReceiveDownstreamFrame → CFrameManager::DecodeDownstreamFrame
|
|||
|
|
→ 获取 CDataProcesser
|
|||
|
|
→ 分支判断:
|
|||
|
|
├─ 心跳响应 → DecodeDownstreamHeartBeatResponse
|
|||
|
|
├─ 离线数据响应 → DecodeDownstreamOfflineDataResponse
|
|||
|
|
├─ 故障录波响应 → DecodeDownstreamFaultRecordResponse
|
|||
|
|
├─ 升级任务查询响应 → DecodeDownstreamUpgradeTaskQueryResponse
|
|||
|
|
├─ 下行命令 → CDownstreamCommand::HandleDownstreamRequest
|
|||
|
|
│ ├─ 终端更新
|
|||
|
|
│ ├─ 升级任务通知
|
|||
|
|
│ ├─ 参数读写(策略/电池/电价/SSH等)
|
|||
|
|
│ └─ 控制指令
|
|||
|
|
└─ 需转发 → CForwardHelper::ForwardDownstreamData(EMS→子终端)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.4.3 上行数据处理(终端 → 云平台)
|
|||
|
|
|
|||
|
|
遍历 `CFrameManager::GetPriority2DataProcesser()` 优先级 map(数值越小优先级越高):
|
|||
|
|
|
|||
|
|
1. 调用 `pProcesser->TimeToEncodeUpstreamRequest()` 判断是否到时上报
|
|||
|
|
2. 填充数据 `FillUpstreamRequestData()`
|
|||
|
|
3. 编码并组帧 `EncodeUpstreamRequest` + `CFrameHelper::EncodeUpstreamFrame`
|
|||
|
|
4. `SendUpstreamFrame` 发送
|
|||
|
|
5. 等待响应帧,解析并更新上报状态
|
|||
|
|
6. 特殊帧:心跳、升级任务查询、离线/录波响应等单独处理
|
|||
|
|
|
|||
|
|
### 4.5 授权异常自愈机制
|
|||
|
|
|
|||
|
|
当云平台在登录或交互中返回以下状态时,`CStateManager` 置位,通信线程退出,主循环触发重授权:
|
|||
|
|
|
|||
|
|
| 状态标志 | 触发场景 |
|
|||
|
|
|---------|---------|
|
|||
|
|
| `IsAgreementUnsigned` | 协议未签署(V2400+ 协议) |
|
|||
|
|
| `IsNotRegisterd` | 终端未在云平台登记 |
|
|||
|
|
| `IsUnbindWithStation` | 与电站解绑 |
|
|||
|
|
| `IsInBlacklist` | 进入黑名单 |
|
|||
|
|
| `IsStationDismatched` | 电站 ID 不匹配 |
|
|||
|
|
| `IsDisconnectedForReobtainAuth` | 连接断开需重新获取授权 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 关键协作时序
|
|||
|
|
|
|||
|
|
### 5.1 正常通信时序
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant Main as main线程
|
|||
|
|
participant CI as CCommuInteraction
|
|||
|
|
participant CH as CCommunicatorHelper
|
|||
|
|
participant FM as CFrameManager
|
|||
|
|
participant DP as CDataProcesser
|
|||
|
|
participant Cloud as 云平台
|
|||
|
|
|
|||
|
|
Main->>CI: Start(true)
|
|||
|
|
loop 每20ms
|
|||
|
|
CI->>CH: Connect()
|
|||
|
|
CH->>Cloud: TCP连接
|
|||
|
|
CI->>FM: GetDataProcesser(LOGIN)
|
|||
|
|
FM->>DP: CLoginProcesser
|
|||
|
|
DP->>DP: EncodeUpstreamRequest
|
|||
|
|
CI->>CH: Send(登录帧)
|
|||
|
|
CH->>Cloud: 登录请求
|
|||
|
|
Cloud-->>CH: 登录响应
|
|||
|
|
CI->>FM: DecodeDownstreamFrame
|
|||
|
|
CI->>FM: 遍历优先级队列
|
|||
|
|
FM->>DP: TimeToEncodeUpstreamRequest?
|
|||
|
|
DP->>DP: Fill + Encode
|
|||
|
|
CI->>CH: Send(数据帧)
|
|||
|
|
CH->>Cloud: 上行数据
|
|||
|
|
Cloud-->>CH: 下行命令/响应
|
|||
|
|
CI->>FM: DecodeDownstreamFrame
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 下行控制指令时序
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant Cloud as 云平台
|
|||
|
|
participant CI as CCommuInteraction
|
|||
|
|
participant DC as CDownstreamCommand
|
|||
|
|
participant DP as CDataProcesser
|
|||
|
|
participant RD as librunning_data
|
|||
|
|
|
|||
|
|
Cloud->>CI: 下行控制/参数帧
|
|||
|
|
CI->>DC: HandleDownstreamRequest
|
|||
|
|
DC->>DP: DecodeDownstreamRequest
|
|||
|
|
DP->>RD: 写入控制/参数到运行数据
|
|||
|
|
DC->>DP: EncodeUpstreamResponse
|
|||
|
|
CI->>Cloud: 上行响应(立即确认)
|
|||
|
|
Note over DC,RD: 异步执行控制指令
|
|||
|
|
loop 周期检查
|
|||
|
|
DC->>DC: CheckDownstreamCommandResults
|
|||
|
|
DC->>RD: 查询执行结果
|
|||
|
|
DC->>Cloud: 上报最终结果
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 配置与编译开关
|
|||
|
|
|
|||
|
|
| 宏/开关 | 位置 | 作用 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| `__ENABLE_CLOUD_TASK__` | main.cpp | 启用 CCommuInteraction |
|
|||
|
|
| `__ENABLE_AUTH_TASK__` | main.cpp | 启用授权管理 |
|
|||
|
|
| `__ENABLE_OFFLINE_TASK__` | OfflineDataTask.h | 启用离线数据任务 |
|
|||
|
|
| `__ENABLE_FAULT_TASK__` | FaultRecordTask.h | 启用故障录波任务 |
|
|||
|
|
| `CURRENT_TERMINAL_TYPE` | CMake 产品宏 | 区分 EMS / PMS / ABMS 编译 |
|
|||
|
|
| `CURRENT_CLOUD_PROTOCOL_VERSION` | 协议版本宏 | 控制协议特性(如协议签署) |
|
|||
|
|
| `IS_DEVICE_UPLOAD_ENABLE` | 配置宏 | 控制离线/录波任务启动 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 7. 设计特点总结
|
|||
|
|
|
|||
|
|
1. **策略模式 + 工厂注册**:新增云平台帧类型只需在 `processers` 添加 Processor 并在 `CFrameManager` 注册,无需修改 `CCommuInteraction` 主逻辑
|
|||
|
|
2. **下行命令集中处理**:`CDownstreamCommand` 封装所有下行控制,与上报逻辑解耦
|
|||
|
|
3. **优先级队列上报**:`mapPriority2DataProcesser` 保证登录、告警等高优先级数据优先发送
|
|||
|
|
4. **双模连接**:通过授权流程自动识别直连云 / EMS 透传两种拓扑
|
|||
|
|
5. **授权自愈**:主循环监控授权状态,异常时自动停服→重授权→重启通信
|
|||
|
|
6. **Pimpl 惯用法**:各类均使用 `*Private` / `*Data` 内部类隐藏实现细节
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8. 相关文档
|
|||
|
|
|
|||
|
|
- 类关系详图:见 [cloud_interact_class_reference.md](./cloud_interact_class_reference.md)
|
|||
|
|
- 云平台协议帧定义:参考 `include/interface/ICloudProtocol.h` 及协议文档
|
|||
|
|
- EMS 子终端配置:`ems_cfg.xml`(授权分发)
|
|||
|
|
- 云通信参数:`CloudParameters.xml` / `StationConfig.xml`
|