# opensovd-cpp **Repository Path**: caojian258/opensovd-cpp ## Basic Information - **Project Name**: opensovd-cpp - **Description**: SOVD cpp imlement - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-08-02 - **Last Updated**: 2026-09-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: SOVD, Cpp17, UDS ## README # opensovd-cpp Eclipse OpenSOVD(ISO 17978, Service-Oriented Vehicle Diagnostics)Server 的 C++17 实现。 当前迭代支持:实体发现(areas / components / apps)、数据读写(/data)、故障管理(/faults)、例程(/operations)、会话管理(/modes、/locks)。 诊断数据由可插拔的 `DiagnosticBackend` 接口提供,首版附带内存 Mock 后端。 ## 构建 ```bash cmake -B build cmake --build build ``` 依赖(cpp-httplib、nlohmann/json、tl::expected、GoogleTest)由 CMake FetchContent 自动获取,需要网络。 ## 运行 ```bash ./build/sovd-server [port] # 默认 8080 ``` ## 测试 ```bash ctest --test-dir build --output-on-failure ``` ## API 一览(base path: /vehicle/v15) | 方法 | 路径 | 说明 | |---|---|---| | GET | `/vehicle/v15/{areas,components,apps}` | 列举实体 | | GET | `/vehicle/v15/{areas,components,apps}/{id}` | 实体详情 | | GET | `/vehicle/v15/components/{id}/data` | 列举 data resources | | GET | `/vehicle/v15/components/{id}/data/{dataId}` | 读取数据 | | PUT | `/vehicle/v15/components/{id}/data/{dataId}` | 写入数据,body: `{"data": }` | | GET | `/vehicle/v15/components/{id}/faults[?status=]` | 查询故障(可按状态过滤) | | GET | `/vehicle/v15/components/{id}/faults/{code}` | 故障详情 | | DELETE | `/vehicle/v15/components/{id}/faults/{code}` | 清除单个故障 | | DELETE | `/vehicle/v15/components/{id}/faults` | 清除全部故障 | | GET | `/vehicle/v15/components/{id}/modes` / `.../modes/session` | 列举模式 / 读取当前诊断会话 | | PUT | `/vehicle/v15/components/{id}/modes/session` | 切换诊断会话(`{"value": "default\|extended\|programming"}`,非 default 需持锁) | | GET/POST | `/vehicle/v15/components/{id}/locks` | 查询当前锁 / 创建独占锁(`{"lifetime": 秒}`,默认 60,上限 3600) | | GET/PUT/DELETE | `/vehicle/v15/components/{id}/locks/{lockId}` | 锁详情 / 续约(需 `{"lifetime": 秒}`)/ 释放(释放或过期自动回 default 会话) | 错误响应遵循 SOVD 格式:`{"error_code": "...", "message": "..."}`。 ## CDA 模式(连接真实/模拟 ECU) `sovd-server` 支持两种后端: - `--mock`(默认):内存 Mock 后端,用于开发与演示。 - `--ecu`:CdaBackend——经本地兄弟仓库 `../opensovd-cda-cpp` 的 DoIP/UDS/MDD 库 连接 ECU,由 MDD 诊断数据库驱动: ```bash ./build/sovd-server 20002 \ --ecu flxc1000:testdata/FLXC1000.mdd:127.0.0.1:13400:0x1001 \ --source-addr 0x0E00 ``` `--ecu` 参数格式:`::::<目标地址(hex)>`,可重复配置多个 ECU。 构建时通过 CMake 变量 `CDA_SOURCE_DIR`(默认 `../opensovd-cda-cpp`)定位 cda 仓库。 operations 端点:`GET .../operations` 列举、`POST .../operations/{id}/executions` 同步执行。 执行结果按 MDD 的 DOP 结构化解码,响应对形状为 `{"status": "finished", "result": {"<参数名>": {"value": …, "label"?: …, "unit"?: …}}}` (无 RequestResults 变体时 result 为 null;变体响应无 VALUE 参数时为空对象)。 data 读写按 MDD 的 DOP 结构化解码/编码: 读取响应对形状为 `{"data": {"<参数名>": {"value": …, "label"?: …, "unit"?: …}}}` (label 来自 TEXT_TABLE,unit 来自 Unit displayName);写入接受 `{"data": {"value": …}}` 或裸值 `{"data": …}`,TEXT_TABLE 字段可用标签或数字。故障项追加 `statusBits` (DOP 位域参数名 → 布尔)。已知限制:ECU 断线后本迭代不会自动重连(重启 server 恢复); operations 执行忽略请求参数(按 MDD 固定请求字节执行)。 ## 架构 - `sovd_core`:领域层 —— 实体注册表、Discovery/Data/Fault 服务、`DiagnosticBackend` 抽象 与 `InMemoryMockBackend`。不依赖 HTTP,可独立测试。 - `sovd_transport`:传输层 —— SOVD REST 路由(cpp-httplib)、JSON 序列化、错误映射。 - `sovd-server`:可执行文件,组装后端、服务与路由。 错误在领域层以 `tl::expected` 传递,在传输层边界统一映射为 HTTP 状态码 + SOVD 错误 JSON。 ## 参考 - [eclipse-opensovd/opensovd](https://github.com/eclipse-opensovd/opensovd) - [eclipse-opensovd/opensovd-core](https://github.com/eclipse-opensovd/opensovd-core)(Rust 参考实现) - ISO 17978 (SOVD)