集度 OTX 代理插件(otxproxy)是一个编译为动态链接库(Windows 下输出 otxproxy.dll,Linux/Unix 下输出 libotxproxy.so)的 C++ 工程。它在 OTX 诊断运行时框架与集度汽车云端服务器之间充当协议适配与业务编排中间层——对上以 C 语言 API 契约向 OTX 脚本暴露 JSON 处理、车辆订单查询、安全常量获取、证书管理、ECU 刷写控制、诊断报告上传等核心功能;对下通过 HTTPS 双向认证与集度四大服务域(EOL、PKI、CFG、DIAG)通信。
Sources: README.md
架构总览
下图展示了本插件的宏观分层架构与模块间依赖关系。整个系统可划分为对外 API 层、业务逻辑层、通信与数据中心层、ECU 刷写框架层和报告与安全工具层五大部分。
graph TB
subgraph OTX_RUNTIME["OTX 运行时 (诊断脚本)"]
OTX[OTX 脚本调用 C API]
end
subgraph API_LAYER["对外 API 层"]
PROXY_H["otxproxy.h<br/>JSON / 字符串 / 时间 / 日志"]
JIDU_H["jidu.h<br/>callServer / 证书 / 订单 / 安全常量 / 刷写状态"]
ALGO_H["algorithm.h<br/>加密 / 哈希 / 编解码 / SeedToKey"]
end
subgraph BIZ_LAYER["业务逻辑层"]
JIDU_CPP["jidu.cpp<br/>ECU 表 / API 实现 / 业务编排"]
FLASHER["jidu_flasher.cpp<br/>刷写任务编排 / 硬件版本检查 / FOTA 状态跟踪"]
DTC["jidu_dtc.cpp<br/>DTC 读取 / 白名单过滤 / 掩码重载"]
REPORT["jidu_report.cpp<br/>报告采集 / 事件处理 / 上传调度"]
end
subgraph COMM_LAYER["通信与数据中心层"]
JIDU_CLIENT["JiduClient<br/>HTTPS 双向认证 / 请求路由 / 脱敏"]
HTTP_CLIENT["HttpClient<br/>libcurl 封装 / 证书管理"]
URI_TABLE["jidu_uri.h<br/>请求类型→URI 映射表"]
DATA_CENTER["DataCenter<br/>订单 / 安全常量 / 证书缓存"]
ENV_CFG["EnvConfig<br/>多环境切换"]
VEH_CFG["CVehicleConfig<br/>整车软件包配置 / 刷写文件匹配"]
end
subgraph FLASH_LAYER["ECU 刷写框架层 (otxFlash)"]
FLASH_IFACE["ECUFlasher 接口"]
FLASH_MGR["ECUFlasherManager<br/>ECU 注册 / 文件绑定 / 优先级调度"]
PARALLEL["ParallelECUFlasher<br/>TaskPool 并行刷写"]
SEQUENCE["SequenceECUFlasher<br/>顺序刷写"]
SINGLE["SingleECUFlasher<br/>单 ECU 刷写"]
MCD_DL["MCDFileDownloader<br/>DoIP 文件下载"]
VBF_DL["VbfFileDownloader / BinFileDownloader"]
EVENTS["事件系统<br/>发布/订阅生命周期事件"]
end
subgraph REPORT_LAYER["诊断报告系统 (otxReport)"]
COLLECTOR["ReportRecordCollector<br/>工位数据分块采集"]
TRANSPORTER["ReportTransporter<br/>异步队列传输"]
STATION_DATA["StationData / PrintResult<br/>报告数据模型"]
end
subgraph UTIL_LAYER["安全与工具层"]
AES["AES / DES-CBC"]
SHA["SHA256 / ECDSA"]
CRC["CRC16 / SeedToKey"]
VBF["VBF 解析器<br/>RSA 签名验证"]
TRACER["Tracer 分级日志"]
BINARY["CBinary 二进制缓冲"]
STRING["MyStringUtils / DateFormat"]
end
OTX --> PROXY_H
OTX --> JIDU_H
OTX --> ALGO_H
PROXY_H --> JIDU_CPP
JIDU_H --> JIDU_CPP
ALGO_H --> AES
ALGO_H --> SHA
ALGO_H --> CRC
JIDU_CPP --> JIDU_CLIENT
JIDU_CPP --> DATA_CENTER
JIDU_CPP --> FLASHER
JIDU_CPP --> DTC
JIDU_CPP --> REPORT
JIDU_CLIENT --> HTTP_CLIENT
JIDU_CLIENT --> URI_TABLE
FLASHER --> FLASH_LAYER
REPORT --> REPORT_LAYER
FLASH_LAYER --> EVENTS
FLASH_LAYER --> VBF
REPORT_LAYER --> JIDU_CLIENT关键设计原则:
面向 OTX 的 C API:所有对外函数通过
OTX_API宏导出,OTX 脚本以字符串和缓冲区方式传参。jidu.h、otxproxy.h、algorithm.h三个头文件构成 API 契约,分别覆盖业务通信、工具函数和安全算法三大领域。单例数据中心:
DataCenter将车辆订单信息、ECU 安全常量、OTA 证书、EOL 密钥、AES 密钥等服务器端获取的数据统一缓存,避免重复网络请求。继承式刷写器体系:
ECUFlasher(抽象接口)→MultipleECUFlasher(多 ECU 基类)→ParallelECUFlasher/SequenceECUFlasher的继承树,配合ECUFlasherManager的 ECU 注册与优先级调度。事件驱动与观察者模式:刷写框架通过
ECUFlasherEventHandler发布生命周期事件,报告系统通过ReportCollectorEventHandler发布采集完成事件,上层jidu_flasher.cpp和jidu_report.cpp订阅并响应。
Sources: src/otxproxy.h src/jidu.h src/algorithm.h src/jidu_dataCenter.h
项目目录结构
otxproxy/
├── CMakeLists.txt ← 根构建脚本,定义平台、第三方库路径
├── src/
│ ├── CMakeLists.txt ← 源文件构建脚本,产出 otxproxy.dll/.so
│ ├── otxproxy.h ← 对外 API:JSON、字符串、时间、日志
│ ├── otxproxy.cpp ← 上述 API 的实现(cJSON、Tracer、DateFormat)
│ ├── jidu.h ← 对外 API:callServer、证书、订单、安全常量、刷写
│ ├── jidu.cpp ← 核心业务逻辑(4850+ 行),ECU 表定义、API 实现
│ ├── jidu_client.h/.cpp ← JiduClient:HTTPS 双向认证通信客户端
│ ├── HttpClient.h/.cpp ← HttpClient:基于 libcurl 的 HTTP 基类
│ ├── jidu_uri.h ← 请求类型(iType)→ URI/Method/Host 映射表(100 项)
│ ├── jidu_dataCenter.h/.cpp ← DataCenter:订单、安全常量、证书统一缓存
│ ├── jidu_envConfig.h/.cpp ← EnvConfig:Dev/Test/Staging/Prod 多环境切换
│ ├── jidu_vehicleConfig.h/.cpp← CVehicleConfig:整车软件包配置与刷写文件匹配
│ ├── jidu_orderInfo.cpp ← 订单信息解析
│ ├── jidu_flasher.cpp ← 刷写任务编排(1144 行),FOTA 状态跟踪
│ ├── jidu_dtc.cpp ← DTC 故障码读取、白名单过滤、掩码重载
│ ├── jidu_report.cpp ← 报告采集、事件处理与传输调度(924 行)
│ ├── jidu_macro.h ← 全局数据结构定义(车辆订单、ECU 配置、安全常量等)
│ ├── algorithm.h ← 对外 API:AES、DES、SHA256、ECDSA、CRC16、Base64 等
│ ├── algorithm.cpp ← 算法实现
│ ├── tracer.h/.cpp ← Tracer:6 级分级日志系统
│ ├── binary.h/.cpp ← CBinary:高效二进制数据缓冲区操作类
│ ├── DateFormat.h/.cpp ← Dateformat:时间格式化与时间戳工具
│ ├── MyStringUtils.h/.cpp ← MyStringUtils:字符串分割、替换、大小写转换等
│ ├── FileUtils.h/.cpp ← FileUtils:目录遍历与文件存在性检查
│ ├── TimeUtils.h/.cpp ← 跨平台时间函数封装
│ ├── FlashFileUtils.h/.cpp ← 刷写文件路径工具
│ ├── sole.hpp ← UUID 生成库
│ ├── aes/ ← AES 加密算法(自定义实现,非 OpenSSL)
│ ├── vbf/ ← VBF 文件解析:Header、Block、RSA 签名验证
│ ├── cjson.c/.h ← cJSON:轻量级 JSON 解析库
│ ├── dirent.h ← Windows 目录遍历兼容头
│ ├── otxFlash/ ← ECU 刷写框架
│ │ ├── ECUFlasher.hpp ← 抽象刷写接口
│ │ ├── ECUFlasherImpl.hpp/.cpp ← 刷写实现类
│ │ ├── ECUFlasherManager.hpp/.cpp ← ECU 注册、文件绑定、优先级调度
│ │ ├── MultipleECUFlasher.hpp/.cpp ← 多 ECU 刷写基类
│ │ ├── ParallelECUFlasher.hpp/.cpp ← 并行刷写引擎
│ │ ├── SequenceECUFlasher.hpp/.cpp ← 顺序刷写模式
│ │ ├── SingleECUFlasher.hpp/.cpp ← 单 ECU 刷写模式
│ │ ├── MCDFileDownloader.hpp/.cpp ← DoIP 文件下载(MCD3D 协议)
│ │ ├── MCDCmdTrans.hpp/.cpp ← MCD 命令传输
│ │ ├── MCDCmdBoardcast.hpp/.cpp ← MCD 命令广播
│ │ ├── BinFileDownloader.hpp/.cpp← Bin 格式文件下载器
│ │ ├── VbfFileDownloader.hpp/.cpp← VBF 格式文件下载器
│ │ ├── ECU.hpp/.cpp ← ECU 实体
│ │ ├── File.hpp/.cpp ← 刷写文件实体
│ │ ├── DownloadArgs.hpp/.cpp ← 下载参数
│ │ ├── event/ ← 刷写生命周期事件
│ │ └── taskpool/ ← 任务池(并行调度引擎)
│ ├── otxReport/ ← 诊断报告系统
│ │ ├── ReportRecordCollector.hpp/.cpp ← 工位数据分块采集
│ │ ├── ReportTransporter.hpp/.cpp ← 异步队列传输
│ │ ├── ReportQueue.hpp/.cpp ← 线程安全队列
│ │ ├── StationData*.hpp/.cpp ← 工位数据模型
│ │ ├── PrintResult*.hpp/.cpp ← 打印结果模型
│ │ ├── JsonSerializable.hpp ← JSON 序列化接口
│ │ └── ReportTransportAction.hpp ← 传输行为接口
│ └── otxinc/otx/ ← OTX 框架头文件
├── test/ ← 测试工程
├── third_parts/ ← 第三方预编译库
│ ├── curl/Windows/ ← libcurl(HTTPS 通信)
│ ├── libuv/ ← libuv(跨平台异步 I/O)
│ ├── libxml2/Windows/ ← libxml2(XML 解析)
│ ├── mcd3d/Windows/ ← MCD3D(DoIP 诊断协议栈)
│ ├── otx/Windows/ ← OTX 运行时库
│ └── iconv/Windows/ ← 字符编码转换
├── build-win32.bat ← Windows 32 位构建脚本
├── build-win64.bat ← Windows 64 位构建脚本
└── build-unix-x86_64.sh ← Linux x86_64 构建脚本Sources: CMakeLists.txt src/CMakeLists.txt
对外 API 契约:三个头文件
本插件通过三个头文件向 OTX 运行时暴露全部功能,这些头文件在构建时被安装到输出目录的 include/ 子目录。
| 头文件 | 核心职责 | 关键函数 |
|---|---|---|
otxproxy.h | JSON 解析、字符串校验、时间工具、分级日志 | jsonValue、addJsonKey、strContains、get_currentTimeString、logger、setLoggerLevel |
jidu.h | 服务器通信、证书管理、订单查询、安全常量、刷写状态、车辆环境查询 | callServer、get_jd_orderInfo_*、get_jd_certInfo_*、get_jd_swdlConstants_byEcuName、get_jd_ecuFotaStatus_byEcuName、get_jd_vehicleActiveStatus |
algorithm.h | 加密/解密、哈希、编解码、校验码计算、SeedToKey | aes_cipher、des_cbc_pkcs5_encrypt、sha256、ecdsa_signature、base64_encode、crc16_ibm、seedToKey |
设计特点:所有 API 函数均被 OTX_API 宏修饰(即 extern "C"),确保 C 语言调用兼容性。字符串参数采用 char* + outBufferSize 的缓冲区模式,二进制数据采用 uint8_t* + 长度参数。函数返回值通常为 int 类型,正数表示成功时的数据长度,负数表示各类错误码。
Sources: src/otxproxy.h src/jidu.h src/algorithm.h
核心子系统详解
1. HTTP 通信层
通信层的继承关系为 HttpClient → JiduClient。HttpClient 封装了 libcurl 的 HTTP GET/POST 操作和双向 TLS 证书配置。JiduClient 在此基础上实现了与集度服务器的业务通信,核心入口为 callServer(int iType, string inParams, ...)。
请求路由通过 jidu_uri.h 中的静态映射表 vtable[100] 完成——根据传入的 iType 整数索引查找对应的 HTTP 方法(GET/POST)、目标服务域(eol/pki/cfg/diag)和 URI 路径。
四大服务域:
| Host 标识 | 服务域名 | 典型用途 |
|---|---|---|
eol | EOL 生产线服务 | CCP 数据、TPMS、车辆订单、工位汇总、报告上传 |
pki | PKI 安全服务 | 安全常量查询、EOL 密钥管理、证书签发/吊销、AES 密钥获取 |
cfg | 配置服务 | 换件初始化数据上传、渠道软件版本状态 |
diag | 诊断/售后服务 | 车辆信息获取、VSP 文件列表、证书种子、DTC 上传、环境切换 |
请求生命周期包含预处理(callServer_preHandler)和后处理(callServer_affterHandler)两个阶段,后者负责响应解析与数据脱敏。
Sources: src/jidu_client.h src/jidu_uri.h src/HttpClient.h
2. 数据中心(DataCenter)
DataCenter 是全局单例缓存层,存储从服务器端获取的各类数据,供上层 API 快速访问。核心存储结构包括:
| 数据成员 | 类型 | 说明 |
|---|---|---|
m_VehicleOrderInfo | JD_VEHICLE_ORDER_t | 车辆订单:VIN、CCP 编码、车型、ECU 列表、基线版本等 |
m_EcuSafetyConstant | map<string, JD_ECU_SAFETY_CONSTANT_t> | 按 ECU 名称索引的安全常量(swdl/immo/sal/common) |
m_EolKey | JD_EOL_KEY_t | EOL 全量密钥(immoKey、dkData、powerRootKey 等) |
m_OtaCert | JD_OTA_CERT_t | OTA 服务 CA 证书和客户端证书 |
m_EcuCertInfo | JD_EcuCertInfo_t | ECU 级证书信息:CA、VID、DvcKey、P12、AES 密钥等 |
m_vehicleInfo | VehicleInfo | 车辆诊断信息:ECU 列表、电池余量、充电状态、手套箱状态等 |
m_EcuStatus | map<string, JD_EcuStatusInfo_t> | ECU 状态:在线/离线/硬件不匹配/刷写失败等 |
m_mapDtcDatabase | map<string, vector<JIDU_DTC_INFO_t>> | DTC 数据库(按 ECU 索引) |
m_callServerRecord | map<int, CallServerRecord> | callServer 调用记录(用于调试追踪) |
Sources: src/jidu_dataCenter.h src/jidu_macro.h
3. ECU 刷写框架(otxFlash)
刷写框架采用模板方法模式 + 策略模式设计,核心继承体系如下:
classDiagram
class ECUFlasher {
<<abstract>>
+download()* bool
+getRemainTime(ECU)* uint64_t
+addEventHandler(handler)*
+clearEventHandlers()*
}
class ECUFlasherImpl {
+addECU(name, id, link, priority, ...)
+addECUFile(name, fileType, pinCode, keyInfo, parser)
+download() bool
+downloadFile(ECU, File)* bool
+fireECUDownloadStart(arg)
+fireFileDownloadProgress(arg)
}
class MultipleECUFlasher {
#mECUs: vector~ECU*~
+getECUs() vector~ECU*~
+addECU(ecu)
}
class ECUFlasherManager {
-mPriorityECUs: map~int,vector~ECU*~~
-mECUs: map~string,ECU*~
-mPool: TaskPool*
+addECU(name, id, ...)
+addECUFile(name, fileType, ...)
+download() bool
}
class ParallelECUFlasher {
-mPool: TaskPool*
-mCompletedECUs: atomic_int
+download() bool
-downloadECU(ECU)
+taskWork(Task) static
}
class SequenceECUFlasher {
+download() bool
}
class SingleECUFlasher {
+download() bool
}
class ECUFlasherEventHandler {
<<interface>>
+onECUDownloadStart(arg)*
+onECUDownloadEnd(arg)*
+onECUResetStart(arg)*
+onECUResetEnd(arg)*
+onFileDownloadStart(arg)*
+onFileDownloadEnd(arg)*
+onFileDownloadProgress(arg)*
}
ECUFlasher <|-- ECUFlasherImpl
ECUFlasher <|-- MultipleECUFlasher
ECUFlasherImpl <|-- MultipleECUFlasher
MultipleECUFlasher <|-- ParallelECUFlasher
MultipleECUFlasher <|-- SequenceECUFlasher
MultipleECUFlasher <|-- SingleECUFlasher
MultipleECUFlasher <|-- ECUFlasherManager
ECUFlasherManager ..|> ECUFlasherEventHandler三种刷写模式:
| 模式 | 类 | 行为 |
|---|---|---|
| 并行刷写 | ParallelECUFlasher | 基于 TaskPool 线程池,多个 ECU 同时刷写;通过原子计数器跟踪完成数 |
| 顺序刷写 | SequenceECUFlasher | 按 ECU 优先级依次刷写,前一个完成后再启动下一个 |
| 单 ECU 刷写 | SingleECUFlasher | 仅处理单个 ECU 的刷写流程 |
ECUFlasherManager 是推荐的顶层入口:它聚合了 ECU 注册、刷写文件绑定、优先级分组和并行度控制(parallelSize 参数),内部按优先级分组后委托给 ParallelECUFlasher 或 SequenceECUFlasher 执行。
下载器层次:文件下载通过 MCDFileDownloader(基于 MCD3D 的 DoIP 诊断通信协议)实现,支持 VBF 和 Bin 两种格式,由 VbfFileDownloader 和 BinFileDownloader 分别处理。MCDCmdTrans 和 MCDCmdBoardcast 则负责 MCD 命令的单播和广播传输。
Sources: src/otxFlash/ECUFlasher.hpp src/otxFlash/ECUFlasherManager.hpp src/otxFlash/ParallelECUFlasher.hpp src/otxFlash/MultipleECUFlasher.hpp
4. 诊断报告系统(otxReport)
报告系统采用生产者-消费者模式,核心组件如下:
| 组件 | 职责 |
|---|---|
ReportRecordCollector | 采集工位测试数据(基本信息、Block/Item 层级结构),通过事件通知完成 |
ReportTransporter | 启动独立线程,从 ReportQueue 取出报告文本,回调 ReportTransportAction.doTransport() 执行上传 |
ReportQueue | 线程安全队列,存储待传输的报告 JSON 字符串 |
StationDataReportRecord | 工位数据报告的数据模型,支持 toJsonString() 序列化 |
PrintResultReportRecord | 打印结果报告的数据模型 |
数据流:OTX 脚本调用 collectBegin() → 按 Block/Item 层级填充数据 → collectEnd() 触发 onBlockCompleted 事件 → 报告 JSON 入队 → ReportTransporter 线程从队列取出 → 调用 callServer(31) 上传至 EOL 服务器。
Sources: src/otxReport/ReportRecordCollector.hpp src/otxReport/ReportTransporter.hpp src/jidu_report.cpp
5. 安全与算法工具集
algorithm.h 暴露了完整的密码学工具链,覆盖刷写安全访问、证书签名验证和数据编解码三大场景:
| 算法 | 函数 | 应用场景 |
|---|---|---|
| AES-128 | aes_cipher | ECU 安全访问通信加密 |
| DES-CBC-PKCS5 | des_cbc_pkcs5_encrypt/decrypt | 诊断数据加解密 |
| SHA256 | sha256 | 文件完整性校验 |
| ECDSA | ecdsa_signature | 证书签名验证 |
| Base64 | base64_encode/decode | 证书和密钥编解码 |
| CRC16-IBM | crc16_ibm | 刷写文件校验 |
| SeedToKey | seedToKey | 诊断安全访问密钥计算(Seed→Key 变换) |
| ECDSA 签名 | ecdsa_signature | VBF 文件 RSA 签名验证 |
| P12 解析 | parse_cert_p12 | 客户端证书 PEM 提取 |
VBF 文件解析器(VBFParserSmall)负责解析 Vector Binary Format 格式的刷写文件,提取 Header 信息(软件版本、硬件版本、签名数据)和 Block 数据,并内建 RSA 签名验证能力。
Sources: src/algorithm.h src/vbf/VBFParserSmall.h src/aes/aes.h
6. 日志与跟踪系统
Tracer 提供 6 级日志输出,日志同时输出到控制台和文件:
| 级别 | 枚举值 | 用途 |
|---|---|---|
| Off | Trace_Level_Off = 0 | 关闭所有日志 |
| Logger | Trace_Level_Logger = 1 | 基础跟踪(通过 OTX_API 的 logger() 函数) |
| Error | Trace_Level_Error = 2 | 错误信息 |
| Warn | Trace_Level_Warn = 3 | 警告信息 |
| Info | Trace_Level_Info = 4 | 一般信息 |
| Debug | Trace_Level_Debug = 5 | 详细调试信息 |
编译器时间戳在库加载时自动记录(通过静态变量 version 的初始化触发 loadFirst() 函数),便于定位构建版本。
Sources: src/tracer.h src/otxproxy.cpp
7. ECU 信息表
jidu.cpp 中定义了完整的 ECU 静态信息表 ecutable[JD_EUC_COUNT](共 59 个 ECU),每个 ECU 包含:
- ecuId:ECU 标识符(如
0x6011表示 BGM) - ecuName:ECU 名称(如
"TCAM"、"CDC"、"ACU") - doIp:DoIP 诊断地址
- ccpPose:CCP 编码中的位偏移
- isHighPwr:是否为高压平台 ECU
这张表为 ECU 名称与 ID 互查、DoIP 地址解析、CCP 编码解析提供了基础数据。
Sources: src/jidu.cpp
构建与平台支持
项目基于 CMake 构建系统,支持以下目标平台:
| 平台 | 构建脚本 | 输出格式 | 关键依赖 |
|---|---|---|---|
| Windows x86 | build-win32.bat | otxproxy.dll | libcurl、libxml2、MCD3D、OpenSSL、OTX Runtime |
| Windows x86_64 | build-win64.bat | otxproxy.dll | 同上(x64 版本) |
| Linux x86_64 | build-unix-x86_64.sh | libotxproxy.so | libuv、libxml2、libcurl、OpenSSL(.a 静态链接) |
| Android (arm64/armv7) | CMake 交叉编译 | libotxproxy.so | libuv(Android 预编译) |
| RK3568 (嵌入式 Linux) | CMake 交叉编译 | libotxproxy.so | 对应平台预编译库 |
构建产物(DLL/SO + 头文件)安装到 out/ 目录下按平台分类的子目录中。
Sources: CMakeLists.txt src/CMakeLists.txt
阅读路线建议
作为刚接触本项目的开发者,建议按以下顺序深入阅读各子系统文档:
- 构建与环境:先了解如何编译运行——快速上手:构建与环境配置
- API 入口:理解 OTX 运行时如何调用本插件——otxproxy.h:向 OTX 运行时暴露的 C 语言 API 契约
- HTTP 通信:掌握与集度服务器的通信机制——JiduClient:与集度服务器的 HTTPS 双向认证通信客户端 → callServer 接口设计
- 数据中心:了解数据缓存与配置管理——DataCenter → CVehicleConfig
- ECU 刷写:深入刷写框架——刷写器架构总览 → ParallelECUFlasher
- 安全与算法:了解加密和密钥体系——加密算法集 → SeedToKey 与 CRC16