Co-authored-by: Cursor <cursoragent@cursor.com>
17 KiB
平台联网任务功能说明(CCU601E_D / plat_comm)
本文档描述 CCU601E_D\app\plat_comm 目录内平台联网任务的整体架构、状态机、链路层与业务层分工,以及与计量、Flash、OCPP 的衔接。内容基于当前工程源码归纳;各子模块细节见文末关联文档。
1. 模块定位
| 项目 | 说明 |
|---|---|
| 任务 | FreeRTOS 任务 TASK_ID_PlatComm,入口 v_Plat_Comm,周期约 100ms(由任务睡眠配置决定)。 |
| 职责 | 多平台(最多 2 路)的 TCP 建链 → 平台登录 → 周期收发 → 私有逻辑;与 FTP 远程升级 / 诊断日志上传 分时调度;对上层屏蔽 4G / 网线 差异。 |
| 协议栈 | 业务协议由 MasterFuncArray 注册(当前工程默认 OCPP 1.6 + WebSocket);传输由 bs_connect_impl 统一 发送/接收。 |
| 全局控制块 | BS_TASK_CTRL_DATA s_bs_task_ctrl(plat_comm_task.c / plat_comm_task.h)。 |
2. 编译开关与平台槽位
定义见 app/publicdata/public_define.h(摘要):
| 宏 | 典型值 | 含义 |
|---|---|---|
MAX_BS_NUM |
2 | 同时支持的平台通道数(槽位 0 / 1)。 |
BS_OCPP_EN |
1 | OCPP 协议栈参与编译。 |
BS_IES_EN |
1 | 积成平台(plat_comm/ieszt/,登录+心跳);详见 ieszt/IES积成平台功能说明.md。 |
BS_GWSDK_EN |
0 | 国网 SDK 平台(gwsdk/,本仓库目录可能未包含)。 |
BS_TLS_MBEDTLS_EN |
视工程 | 网口 wss:// 时 MCU 侧 mbedTLS 封装。 |
LWIP_FTP_UPGRADE_ENABLE |
视工程 | 网线 LwIP FTP 固件下载状态机。 |
运行时使能与联网方式不只看宏,还读系统配置:
E_BS_GET_SYS_DATA_PLAT_EN:u8_gunNo= 0 → 平台 A,= 1 → 平台 B;0 关闭、1 使能。E_BS_GET_SYS_DATA_NET_TYPE:0 = 4G(EC200A),1 = 网线(LwIP)。
初始化在 v_plat_data_init()(plat_comm_task.c)中写入各槽位 bs_enable、u8_netType。
3. 目录结构一览
plat_comm/
├── plat_comm_task.c / .h # 联网任务主循环、平台函数表、重连入口
├── 平台联网任务功能说明.md # 本文档
├── impl/
│ ├── bs_connect_impl.c / .h # TCP/TLS 建链、统一 v_bs_send / u16_bs_recv
│ └── bs_public_impl.c / .h # 桩枪数据桥接、未结订单、FTP 调度、OCPP 配置读写
├── ocpp/ # OCPP 1.6(详见 ocpp/OCPP功能模块说明.md)
├── ieszt/ # 积成 IESZT(详见 ieszt/IES积成平台功能说明.md)
├── 4g_module/ # EC200A AT、TCP、FTP(详见 4G模块AT指令配置功能说明.md)
└── lwip_module/ # 网口 socket、LwIP FTP 升级(详见 lwip_ftp功能说明.md)
4. 联网任务主状态机(v_Plat_Comm)
4.1 平台函数表 MasterFuncArray
每个使能槽位绑定一组回调(plat_comm_task.c):
| 回调 | OCPP 实现 | 作用 |
|---|---|---|
v_bs_data_init |
v_ocpp_init_data |
上电/全量复位:OCPP 上下文、离线 MV FRAM、定时器等。 |
v_bs_tcp_connect |
v_ocpp_tcp_connect |
TCP + WebSocket 握手(内部先 u8_tcp_connect)。 |
v_bs_logon_connect |
v_ocpp_logo_on |
BootNotification 登录,成功置 u8_log_on_flag。 |
v_bs_recv_data |
v_ocpp_recv_data → ocpp_recv |
收包并解析 JSON(CALL / CALLRESULT)。 |
v_bs_send_ctrl |
v_ocpp_send_ctrl → ocpp_send_mag_ctrl |
周期/事件驱动主动上送(Heartbeat、MV、StopTx 等)。 |
v_bs_private_logic |
v_ocpp_private_logic |
超时重连、未结订单、离线 MV 落盘、鉴权检查等。 |
未使能槽位(bs_enable == 0)在本轮循环中跳过。
BS_IES_EN 时槽位 0 常为 "ieszt"(v_ies_*),协议态在 s_bs_task_ctrl.s_ies_data(含 IES_SEND_TIMER + s_timerCnt[],与 OCPP s_timerCnt 同套路),详见 ieszt/IES积成平台功能说明.md。
4.2 单槽位连接状态(S_BS_CTRL_DATA)
| 字段 | 含义 |
|---|---|
u8_TCP_connect_flag |
1 = 传输层已就绪(OCPP 下为 TCP+WS 成功)。 |
u8_log_on_flag |
1 = 平台登录成功(BootNotification Accepted/Pending)。 |
u8_netType |
0 = 4G,1 = 网线。 |
fd |
网口 socket 描述符;4G 路径不使用。 |
is_secure / tls_ctx |
网口 wss 时 TLS 会话(BS_TLS_MBEDTLS_EN)。 |
u8_updata_flag |
远程升级进行中:0 无,1 FTP 固件,2 SDK OTA 等。 |
u8_4g_soft_tcp_reconnect |
4G:软重连(仅 QICLOSE+QIOPEN,不整网重驻网)。 |
s_gundata[] |
每枪:txFlag_tradUpload、txFlag_startResult、txFlag_autoStart 等与 OCPP/flow 协同。 |
4.3 每周期调度顺序(v_plat_comm_network_round)
对每个使能槽位 i:
若 u8_TCP_connect_flag == 0
→ v_bs_tcp_connect() // 建链
否则若 u8_log_on_flag == 0
→ v_bs_logon_connect() // 登录
否则
→ v_bs_send_ctrl() // 已登录:主动发送
→ v_bs_recv_data() // 收包(任意阶段均可收)
→ v_bs_private_logic(i) // 私有逻辑(未结单、离线 MV、超时等)
日志示例:[0] tcp connect、[0] logOn is ok(Plat_Comm_LOG)。
4.4 与 FTP 的分时调度(4G 重点)
u8_plat_comm_ftp_transfer_active() 为真时(u8_updata_flag != 0,或 4G 下 u8_log_file_upload 置位):
- 偶数周期:仅
v_plat_comm_network_round()(保证 OCPP 仍能 recv/send)。 - 奇数周期:仅
v_plat_comm_ftp_round()→v_ftp_update_action()+ 双路v_bs_recv_data()(收 +QFTP* 等 URC)。
无 FTP 时:每周期只跑联网,相位复位。
原因:4G 与 FTP 共用一根 UART;若在同一周期内既跑大量 AT 又跑 QISEND,易出现粘连、
break off=0。详见4g_module/4G模块AT指令配置功能说明.md。
5. 重连与初始化策略(v_set_bs_renew)
void v_set_bs_renew(U8_T u8_bs)(plat_comm_task.c)为各模块统一的「断链重连」入口:
| 联网方式 | 行为 |
|---|---|
| 网线 | v_bs_eth_close_socket:关 socket、清 fd、u8_TCP_connect_flag,避免 LwIP socket 泄漏导致「再也连不上」。 |
| 4G | 清 TCP 标志、fd=-1,置 u8_4g_soft_tcp_reconnect=1(下次 u8_tcp_connect 走软重开 Socket)。 |
| 公共 | u8_log_on_flag=0;不在此处调用 v_bs_data_init,避免每次断线都 整模组重驻网。 |
全量 OCPP 复位(含 v_ocpp_mv_offline_init、运行态 RAM)由 v_ocpp_init_data / v_ocpp_init_data_ex 在 上电 或 TCP 长时间失败(如 RX 超时 2min)时触发,与软重连区分。
OCPP 侧 WS 握手失败会关 socket 并清 u8_TCP_connect_flag,下一周期重试(v_ocpp_tcp_connect)。
6. 连接实现层(impl/bs_connect_impl)
6.1 URL 解析
parse_websocket_url_simple(url, ws_url_t *) 解析配置中的服务器串,得到:
host、port、path(WebSocket 路径)is_secure:ws://→ 0,wss://→ 1apn_str(4G 用,来自变量区 APN)
全局 url_info 供网口/4G 共用。
6.2 u8_tcp_connect(u8_id)
u8_netType |
路径 |
|---|---|
| 0(4G) | 若 u8_4g_soft_tcp_reconnect:s8_ec200a_tcp_socket_soft_reopen();失败累计达 EC200A_TCP_SOFT_REOPEN_FAIL_MAX 再 v_bs_4G_data_init()。否则 s8_ec200a_4g_init() 推进模组状态机至 Socket 就绪。 |
| 1(网线) | eth_do_tcp_connect:netif_is_link_up 检查 → lwip_tcp_connect → 可选 bs_tls_client_connect(wss)。成功写 fd,返回 1。 |
6.3 统一收发
| 接口 | 4G | 网线 |
|---|---|---|
v_bs_send |
透传 v_4g_send_data / 非透传 v_ec200a_tcp_app_send(QISEND/QSSLSEND) |
lwip_tcp_send 或 bs_tls_client_send |
u16_bs_recv |
u16_4g_recv_data / u16_ec200a_tcp_app_recv(QIRD/QSSLRECV) |
lwip_tcp_recv / bs_tls_client_recv;对端关闭或 errno 异常 → eth_close_socket |
每次 v_bs_send 后 mSleep(Plat_Send_Sleep)(默认 50ms),并累加 u8_sendCnt 用于任务末尾睡眠补偿。
接收缓冲区上限:BS_BUF_SIZE_RECV(约 3KB,远程升级 JSON 可能较长)。
7. 公共实现层(impl/bs_public_impl)
面向 flow / meter / fault / UI / OCPP 的统一数据与控制 API,是「业务世界」与「平台任务」的边界。
7.1 主要能力分类
| 分类 | 代表接口 | 说明 |
|---|---|---|
| 系统/枪数据读 | u32_bs_get_sys_data、u8_get_str_data |
枪状态、电量、SOC、订单流水号、桩编号、4G 信号等。 |
| 充电控制 | v_bs_charge_action_ctrl |
启停充、改订单字段(含 preTradeNo 写入计量日志)。 |
| 状态/订单标志 | v_bs_log_txFlag_tradUpload、u8_bs_get_flow_state |
与 s_gundata、flowctrl 联动。 |
| 未结订单 | s8_plat_get_unsettled_order |
优先 EEPROM 掉电临时单,再 Flash 未结索引;OCPP 补单数据源。 |
| 结算确认 | v_bs_platform_settlement_confirm |
StopTx 成功后删未结索引。 |
| FTP | v_ftp_update_action |
按 t_ftp_update_info 与 u8_netType 分发 4G / LwIP FTP。 |
| OCPP 配置 | u8_set_ocpp_cfg_info、v_get_ocpp_cfg_info |
读写 Flash 中的 OCPP 配置项。 |
| 本地鉴权 | v_ocpp_offline_local_authentication_check、u8_card_info_add |
离线卡列表与即插即充。 |
7.2 未结订单来源(与掉电续传)
s8_plat_get_unsettled_order 顺序:
- EEPROM 临时记录(
v_check_temp_chg_record_valid):充电中每 60s 快照;真正掉电后上电读出,置E_FAULT_13073(异常掉电)。充电中(flow=2)不当作掉电单,避免误 StopTx。 - Flash 未结列表(
unsettled_order_mng):正常结束但未收到平台确认的订单索引。
计量侧:v_meterlog_restore_temp_from_eeprom 上电恢复 RAM;preTradeNo 更新后立即写 EEPROM(见 meter_calculate_impl.c)。
7.3 FTP 全局参数 T_FTP_UPDATE_INFO
由 OCPP UpdateFirmware / GetDiagnostics 解析 parse_ftp_url() 填入:
- 服务器地址、端口、用户、密码、路径、文件名
u8_netType:决定走 4G AT FTP 还是 LwIP FTPu8_log_file_upload(OCPP 扩展):1 = 诊断日志上传,0 = 固件升级
v_ftp_update_action() 每 FTP 半周期推进一步,避免阻塞 PlatComm。
8. 4G 子系统(4g_module/)
| 项目 | 说明 |
|---|---|
| 模组 | Quectel EC200A |
| 业务 TCP | QIOPEN / QSSLOPEN(wss 时模组内置 TLS),PDP EC200A_TCP_PDP_CTX_ID |
| FTP | 独立 PDP EC200A_FTP_PDP_CTX_ID,与业务 TCP 禁止同 context |
| 模式 | EC200A_TCP_USE_TRANSPARENT_MODE:透传 vs QISEND/QIRD 缓冲模式 |
| 与 PlatComm | 仅通过 bs_connect_impl 的 v_bs_send/u16_bs_recv 接入;FTP 由 v_ftp_update_action 驱动 |
详细 AT 流程、QFTPGET/QFREAD 分片、与 OCPP 互斥宏 → 4g_module/4G模块AT指令配置功能说明.md。
9. 网口子系统(lwip_module/)
| 文件 | 职责 |
|---|---|
lwip_module.c |
lwip_tcp_connect / send / recv / close,非阻塞 socket |
lwip_ftp_upgrade.c |
网线 FTP 固件下载 状态机(PASV/RETR/按 1024B 写 Flash) |
eth_do_tcp_connect 在 PHY link down 时不建连;重连前必须 v_bs_eth_close_socket。
详细状态机与触发条件 → lwip_module/lwip_ftp功能说明.md。
10. OCPP 子系统(ocpp/)
在 BS_OCPP_EN 下,OCPP 作为 MasterFuncArray 中的一套 Master 实现:
TCP (u8_tcp_connect)
→ WebSocket 握手 (websocket_build)
→ BootNotification (v_ocpp_logo_on)
→ ocpp_send_mag_ctrl:Heartbeat / StatusNotification / MeterValues / Start&StopTransaction …
→ ocpp_recv → recv_mags:平台下行与 CALLRESULT
→ v_ocpp_private_logic:未结单 s8_unsettled_order_chaek、离线 MV 桥接、RX 超时重连
离线 MeterValues:未连接或未登录时 BS_ocpp_mv_offline_bridge 写 Flash;联网后 session 补发(在线会话)或 unsettled 补发(掉电/未结单)。
完整 PDU 列表、未结单状态机、session_001x 类问题修复说明 → ocpp/OCPP功能模块说明.md。
11. 端到端数据流(示意)
11.1 正常充电上送(已登录)
flowchart TB
subgraph tasks
FC[FlowCtrl / Meterfee]
PC[PlatComm v_Plat_Comm]
end
subgraph ocpp
SEND[ocpp_send_mag_ctrl / send_mag]
WS[ws_send / bs_websocket]
end
subgraph link
BS[v_bs_send / u16_bs_recv]
TCP[u8_tcp_connect 4G or LwIP]
end
FC -->|订单/枪状态| PUB[bs_public_impl]
PUB --> SEND
PC --> SEND
SEND --> WS --> BS --> TCP
TCP --> CSMS[CSMS]
CSMS --> TCP --> BS --> WS --> RECV[ocpp_recv / recv_mags]
RECV --> PUB
PC --> RECV
11.2 掉电后补单(简化)
sequenceDiagram
participant M as meter/EEPROM
participant P as bs_public_impl
participant O as BS_ocpp_ctrl
participant S as CSMS
M->>P: s8_plat_get_unsettled_order
P->>O: s_unsettled_order_data
alt 无 preTradeNo
O->>S: Authorize
S->>O: Accepted
O->>S: StartTransaction
S->>O: transactionId
end
O->>S: MeterValues 离线补发
O->>S: StopTransaction PowerLoss
12. 关键全局变量与调试
| 符号 | 位置 | 用途 |
|---|---|---|
s_bs_task_ctrl |
plat_comm_task.c |
双平台连接态、枪标志、OCPP ocpp_data、IES s_ies_data |
t_ftp_update_info |
bs_public_impl.c |
FTP 升级/日志参数 |
url_info |
bs_connect_impl.c |
解析后的 host/port/TLS |
private_ocpp_data |
BS_ocpp_ctrl.c |
OCPP 定时器、未结单指针、pending 通知 |
Plat_Comm_LOG / OCPP_PRINTF_LOG |
宏 | 任务日志(TASK_ID_PlatComm / 0xFF) |
常见日志关键字
| 日志 | 含义 |
|---|---|
[n] tcp connect |
第 n 槽传输层就绪 |
[n] logOn is ok |
BootNotification 成功 |
Load pwr-loss order gun= |
EEPROM 掉电单加载 |
Unsettled: send StopTx |
未结单补 StopTransaction |
MV offline: session send ok |
在线会话离线 MV 补发 |
ws handshake fail |
WS 失败,将重试 TCP |
End rx TO, relink / RX TO, relink |
收包超时触发 v_set_bs_renew |
13. 关联文档索引
| 文档路径 | 内容 |
|---|---|
ocpp/OCPP功能模块说明.md |
OCPP 报文、未结单、离线 MV、Boot/Heartbeat、平台下行指令 |
ieszt/IES积成平台功能说明.md |
IES 0x68 协议、S_BS_IES_CTRL_DATA、登录/心跳与 PlatComm 七回调 |
4g_module/4G模块AT指令配置功能说明.md |
EC200A 初始化、透传/非透传、FTP 与 OCPP 分时、配置宏 |
lwip_module/lwip_ftp功能说明.md |
网线 FTP 升级状态机、与 v_ftp_update_action 关系 |
BSP/flash_file_mgr/(工程内) |
订单 Flash、未结索引、OCPP 离线 MV FRAM/SPI |
app/meter_calculate/(工程内) |
订单 RAM、EEPROM 临时单、周期存盘 |
14. 维护说明
- 新增平台协议:在
plat_comm/下增加子目录,实现MasterFuncPtl七个回调,并在MasterFuncArray中注册;BS_*_EN与E_BS_GET_SYS_DATA_PLAT_EN对齐。 - 修改建链逻辑:优先改
bs_connect_impl.c,业务层保持v_bs_send/u16_bs_recv不变。 - FTP 与 OCPP 并发:改
plat_comm_task.c相位策略或ec200a_4g_cfg.h互斥宏前,须在 4G 实机 验证 QISEND 与 QFTP 不互相破坏。 - 未结/掉电单:同时核对
bs_public_impl.c、meter_calculate_impl.c、BS_ocpp_ctrl.c三处,避免 EEPROM 周期快照被误判为掉电单。
文档版本:与 CCU601E_D plat_comm 源码同步维护;若宏或文件名变更,请以实际编译配置为准。