Skip to content

集度 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 刷写框架层报告与安全工具层五大部分。

mermaid
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

关键设计原则

  1. 面向 OTX 的 C API:所有对外函数通过 OTX_API 宏导出,OTX 脚本以字符串和缓冲区方式传参。jidu.hotxproxy.halgorithm.h 三个头文件构成 API 契约,分别覆盖业务通信、工具函数和安全算法三大领域。

  2. 单例数据中心DataCenter 将车辆订单信息、ECU 安全常量、OTA 证书、EOL 密钥、AES 密钥等服务器端获取的数据统一缓存,避免重复网络请求。

  3. 继承式刷写器体系ECUFlasher(抽象接口)→ MultipleECUFlasher(多 ECU 基类)→ ParallelECUFlasher / SequenceECUFlasher 的继承树,配合 ECUFlasherManager 的 ECU 注册与优先级调度。

  4. 事件驱动与观察者模式:刷写框架通过 ECUFlasherEventHandler 发布生命周期事件,报告系统通过 ReportCollectorEventHandler 发布采集完成事件,上层 jidu_flasher.cppjidu_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.hJSON 解析、字符串校验、时间工具、分级日志jsonValueaddJsonKeystrContainsget_currentTimeStringloggersetLoggerLevel
jidu.h服务器通信、证书管理、订单查询、安全常量、刷写状态、车辆环境查询callServerget_jd_orderInfo_*get_jd_certInfo_*get_jd_swdlConstants_byEcuNameget_jd_ecuFotaStatus_byEcuNameget_jd_vehicleActiveStatus
algorithm.h加密/解密、哈希、编解码、校验码计算、SeedToKeyaes_cipherdes_cbc_pkcs5_encryptsha256ecdsa_signaturebase64_encodecrc16_ibmseedToKey

设计特点:所有 API 函数均被 OTX_API 宏修饰(即 extern "C"),确保 C 语言调用兼容性。字符串参数采用 char* + outBufferSize 的缓冲区模式,二进制数据采用 uint8_t* + 长度参数。函数返回值通常为 int 类型,正数表示成功时的数据长度,负数表示各类错误码。

Sources: src/otxproxy.h src/jidu.h src/algorithm.h

核心子系统详解

1. HTTP 通信层

通信层的继承关系为 HttpClientJiduClientHttpClient 封装了 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 标识服务域名典型用途
eolEOL 生产线服务CCP 数据、TPMS、车辆订单、工位汇总、报告上传
pkiPKI 安全服务安全常量查询、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_VehicleOrderInfoJD_VEHICLE_ORDER_t车辆订单:VIN、CCP 编码、车型、ECU 列表、基线版本等
m_EcuSafetyConstantmap<string, JD_ECU_SAFETY_CONSTANT_t>按 ECU 名称索引的安全常量(swdl/immo/sal/common)
m_EolKeyJD_EOL_KEY_tEOL 全量密钥(immoKey、dkData、powerRootKey 等)
m_OtaCertJD_OTA_CERT_tOTA 服务 CA 证书和客户端证书
m_EcuCertInfoJD_EcuCertInfo_tECU 级证书信息:CA、VID、DvcKey、P12、AES 密钥等
m_vehicleInfoVehicleInfo车辆诊断信息:ECU 列表、电池余量、充电状态、手套箱状态等
m_EcuStatusmap<string, JD_EcuStatusInfo_t>ECU 状态:在线/离线/硬件不匹配/刷写失败等
m_mapDtcDatabasemap<string, vector<JIDU_DTC_INFO_t>>DTC 数据库(按 ECU 索引)
m_callServerRecordmap<int, CallServerRecord>callServer 调用记录(用于调试追踪)

Sources: src/jidu_dataCenter.h src/jidu_macro.h

3. ECU 刷写框架(otxFlash)

刷写框架采用模板方法模式 + 策略模式设计,核心继承体系如下:

mermaid
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 参数),内部按优先级分组后委托给 ParallelECUFlasherSequenceECUFlasher 执行。

下载器层次:文件下载通过 MCDFileDownloader(基于 MCD3D 的 DoIP 诊断通信协议)实现,支持 VBF 和 Bin 两种格式,由 VbfFileDownloaderBinFileDownloader 分别处理。MCDCmdTransMCDCmdBoardcast 则负责 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-128aes_cipherECU 安全访问通信加密
DES-CBC-PKCS5des_cbc_pkcs5_encrypt/decrypt诊断数据加解密
SHA256sha256文件完整性校验
ECDSAecdsa_signature证书签名验证
Base64base64_encode/decode证书和密钥编解码
CRC16-IBMcrc16_ibm刷写文件校验
SeedToKeyseedToKey诊断安全访问密钥计算(Seed→Key 变换)
ECDSA 签名ecdsa_signatureVBF 文件 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 级日志输出,日志同时输出到控制台和文件:

级别枚举值用途
OffTrace_Level_Off = 0关闭所有日志
LoggerTrace_Level_Logger = 1基础跟踪(通过 OTX_APIlogger() 函数)
ErrorTrace_Level_Error = 2错误信息
WarnTrace_Level_Warn = 3警告信息
InfoTrace_Level_Info = 4一般信息
DebugTrace_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 x86build-win32.batotxproxy.dlllibcurl、libxml2、MCD3D、OpenSSL、OTX Runtime
Windows x86_64build-win64.batotxproxy.dll同上(x64 版本)
Linux x86_64build-unix-x86_64.shlibotxproxy.solibuv、libxml2、libcurl、OpenSSL(.a 静态链接)
Android (arm64/armv7)CMake 交叉编译libotxproxy.solibuv(Android 预编译)
RK3568 (嵌入式 Linux)CMake 交叉编译libotxproxy.so对应平台预编译库

构建产物(DLL/SO + 头文件)安装到 out/ 目录下按平台分类的子目录中。

Sources: CMakeLists.txt src/CMakeLists.txt


阅读路线建议

作为刚接触本项目的开发者,建议按以下顺序深入阅读各子系统文档:

  1. 构建与环境:先了解如何编译运行——快速上手:构建与环境配置
  2. API 入口:理解 OTX 运行时如何调用本插件——otxproxy.h:向 OTX 运行时暴露的 C 语言 API 契约
  3. HTTP 通信:掌握与集度服务器的通信机制——JiduClient:与集度服务器的 HTTPS 双向认证通信客户端callServer 接口设计
  4. 数据中心:了解数据缓存与配置管理——DataCenterCVehicleConfig
  5. ECU 刷写:深入刷写框架——刷写器架构总览ParallelECUFlasher
  6. 安全与算法:了解加密和密钥体系——加密算法集SeedToKey 与 CRC16