Files
lingniu-vehicle-ingest/vehicle-data-platform/docs/oneos-vehicle-live-api-contract.md

110 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OneOS 氢能车辆实况接口交付契约
契约版本:1.9.0;修订日期:2026-09-08。对应 `/api/v1/vehicles/realtime/query``/mileage/query``/hydrogen-consumption/query` 的增量交付。实际发布版本、上线时间及脱敏联调证据由发布验收记录提供,本文不将开发完成等同于线上验收完成。
## 兼容性与授权
认证继续使用 `Authorization: Bearer <appKey>`;成功响应继续包含 `code / message / data / traceId`。原请求参数不变;新字段增量添加。`plateNumbers` 省略或空数组表示全部有效授权车辆,指定名单时按授权校验后查询,消费者必须核对 VIN、车牌和日期,不能只按车牌串接不同车辆。报警、违章、企业名称、Seeker 本地车辆编号均不在本次新增范围。
完整机器契约见服务 `/open-api/openapi.yaml`(路径以服务文档入口为准),内嵌 HTML 同步说明新增字段。
## 实时储氢与定位
| 字段 | 类型/单位 | 本次口径 |
| --- | --- | --- |
| remainingHydrogenKg | number/nullkg | 优先 GB32960 广东扩展 0x34 终端上报;缺质量时同帧最大氢压/氢温与 VIN 全车水容积作实气估算;保留真实零 |
| remainingHydrogenPercent | number/null% | 剩余质量 / 35 MPa、15°C 满充模型质量 × 100;缺容量 null/MISSING,超过100 null/INVALID,不以SOC替代 |
| hydrogenRecordTime | RFC 3339/null | 精确匹配 raw_frames 原始同帧采集时间,非合并快照更新时间 |
| hydrogenDataStatus | enum | NORMAL/PARTIAL/STALE/MISSING/UNSUPPORTED/INVALID;两项有效为 NORMAL(估算由来源区别);仅一项有效为 PARTIAL |
| remainingHydrogenKgStatus / remainingHydrogenPercentStatus | enum | 分别为 NORMAL/STALE/MISSING/UNSUPPORTED/INVALID,客户端独立判断 |
| hydrogenValueSource / hydrogenSourceProtocol | string/null | kg 来源 REPORTED 仅确认终端上报,ESTIMATED 为平台模型估算;储氢协议独立于位置 protocol |
| hydrogenStaleAfterSeconds | integer/null,秒 | GB32960 服务陈旧阈值 300;并非协议规定更新频率 |
| hydrogenExpectedIntervalSeconds | integer/null,秒 | 各协议未确认上报周期,当前为 null |
| gpsFixStatus | FIXED/NO_FIX/UNKNOWN | 来源为实际位置报文定位位,不根据在线、运动或记录年龄推断 |
| locationRecordTime | RFC 3339/null | 位置实际采集时间,可与主记录 recordTime 不同 |
| coordinateSystem | WGS84/GCJ02/UNKNOWN | 仅 GB2025 显式坐标类型 1/2 对应 WGS84/GCJ02GB2016/JT808/MQTT 暂无确证为 UNKNOWN |
终端上报接受 0–200 kg,平台估算接受 0–500 kg;非有限值、超出范围或采集时间超过请求时刻 1 分钟标 INVALID/null。估算压力需为070 MPa、温度为−40–726.85°C(沿用模型输入域,不是车辆安全阈值),且必须来自同一原始帧;压力0有效,缺温度不填默认值。超过 300 秒的有效质量保留数值并标 STALE,客户端需提示陈旧;PARTIAL 仍需逐字段判断。两字段有效时聚合为 NORMAL;估算与否查看来源。百分比超过100拒绝该百分比,kg仍独立可用,聚合 PARTIAL(陈旧时 STALE);EXCEEDS_NOMINAL_FULL_CAPACITY 表示超出本次模型参考,不是车辆安全判定。原始帧未找到返回 MISSING;补充历史查询共享 3 秒预算,查询异常或超时降级为 MISSING/UNKNOWN 并保留旧实时字段,不以合并快照伪造采集时间。因此 MISSING 既可能暂无记录,也可能本次未取得可信证据,不能据此断言设备不支持。
有界回补仅针对具有 GB 最新快照原始帧引用、且精确帧氢量为 MISSING 的车辆:查询该快照 `received_at` 向前 5 分钟内含氢量、氢压或氢温键的原始帧,按 `event_time DESC, ts DESC` 检查最近5条候选;最新仅有不完整温压时可取次新完整原始帧,最新显式异常仍阻止回补。窗口以快照接收时间为基准,不是 API 当前时间;离线车辆可返回真实的 STALE。显式 null 或异常候选不被过滤成旧正常值;已有 NORMAL/INVALID/PARTIAL/STALE 不回补,不能掩盖最新异常。回补所得氢量及 hydrogenRecordTime 始终来自同一原始帧,仍共享 3 秒预算;超时或无记录维持 MISSING。该策略不会扫描全部历史,也不承诺找到窗口外最近一条氢量。
储氢覆盖 GB32960 终端质量上报,以及具备有效同帧压力/温度和已配置 VIN 全车容积的车辆;MQTT/JT808 当前不支持储氢。GB32960 或尚无协议记录的车辆,完全没有储氢字段时两字段状态为 MISSING;有容量但无读数原因 MISSING_HYDROGEN_MEASUREMENT。收到压力/温度或终端质量但缺容积时比例 MISSING。没有容积时可保留终端上报 kg,百分比 null/MISSING;没有终端质量时无法估算 kg,两个数值均可为空。最大氢压与最大氢温不保证来自同一瓶,以全车容积计算属于近似估算,不是逐瓶质量求和,也没有逐瓶完整性检测能力。
定位使用位置行的 event_id 对应原始报文:GB 定位状态 bit0=0 表示 FIXEDJT808 bit1=1 表示 FIXED;缺少可信定位位为 UNKNOWN。NO_FIX 时位置不可用、经纬度 null。历史 FIXED 可与 offline 同时存在;显示历史位置需提示位置时间,UNKNOWN 坐标系不得擅自作为 GCJ02 上图。现有 `protocol` 是实时唯一协议字段,枚举 GB32960/MQTT/JT808`sourceProtocol` 属于里程接口。`online=false` 时 motionStatus=offline;在线且所选速度>3 km/h 为 driving,否则 idle。
## 实时估算追溯字段
以下新增字段始终序列化,无法生成时为 null。`hydrogenValueSource` 描述 kg 来源,`remainingHydrogenPercentSource` 独立描述比例来源;即使 kg 是 REPORTED,比例也是 ESTIMATED。质量 NORMAL 只表示通过当前规则,不代表直接测量。
| 字段 | 口径 |
| --- | --- |
| remainingHydrogenPercentSource | ESTIMATED;缺计算条件为 null |
| hydrogenFullCapacityKg | 未舍入的实际满充质量分母,kg |
| hydrogenTankCapacityL | 已启用 VIN 配置全车水容积,L,0<V≤10000,无默认车型值 |
| hydrogenFullPressureMPa / hydrogenReferenceTemperatureC | 35 MPa / 15°C |
| hydrogenEstimatePressureMPa / hydrogenEstimateTemperatureC | 仅平台估算 kg 时采用的同帧原始压力/温度 |
| hydrogenPressureTemperatureSource | MAX_SENSOR_AGGREGATE:最大传感值聚合,不保证同瓶 |
| hydrogenCalculationVersion | REAL_GAS_35MPA_15C_V1 |
| hydrogenCapacitySource | vehicle_hydrogen_tank_capacity |
| hydrogenPercentReason | MISSING_HYDROGEN_MEASUREMENT、INVALID_MASS_READING、INVALID_PRESSURE_TEMPERATURE、INCOMPLETE_PRESSURE_TEMPERATURE、MISSING_TANK_CAPACITY、MASS_CALCULATION_FAILED 或 EXCEEDS_NOMINAL_FULL_CAPACITY;无原因时 null |
显式无效质量不改用压力估算掩盖异常;有效终端上报优先。百分比使用舍入前的质量与满充分母计算,输出质量及比例保留3位小数,因此显示值复算可能出现舍入差异。两个字段独立可空,不将超过100的百分比悄悄截断为100,不用质量状态NORMAL掩盖比例异常。
## 实时估算参考条件
本次按业务确认的 **35 MPa、15°C** 作为满充参考。UNECE 文件对 NWP 的定义采用 15°C 均温满充后稳定压力,并用当前氢密度与 NWP、15°C 参考密度的比值定义储氢 SOC。35 MPa 是本次明确选用的业务参数,不表示接口自动验证了每辆车的铭牌额定压力;这也不是动力电池 SOC。[定义来源:ECE/TRANS/WP.29/2023/110](https://unece.org/sites/default/files/2024-07/ECE_TRANS_WP.29_2023_110E.pdf)
估算复用 `PressureHydrogenMassKg` 的现有 NIST 实气模型与 VIN 储氢水容积:
```text
满充质量 = PressureHydrogenMassKg(35 MPa, 15°C, VIN 储氢容积 L)
估算剩余质量 = PressureHydrogenMassKg(同帧氢压 MPa, 同帧氢温 °C, VIN 储氢容积 L)
储氢百分比 = 剩余质量 / 满充质量 × 100
```
分母是上述参考条件下的全车氢质量,不是扣除不可用余量后的可用容量,也不是压力除以 35 MPa。模型不代表传感器实测或法规认证;逐瓶缺失及温压分布无法仅由总容积和单组遥测识别。接口保留估算来源与参数供追溯。此变化仅作用于实时储氢展示,不修改当日用氢量计算。
## 日统计身份与时间
两个接口均以 Asia/Shanghai 自然日请求,新增时间为 RFC 3339 带时区,不改变原 dataTime / updatedAt 的含义。
| 接口 | 字段 | 来源及空值 |
| --- | --- | --- |
| 用氢 | vin | 授权车辆 VIN,与实时和里程核对 |
| 用氢 | statisticsStartTime / statisticsEndTime | FINAL 为 evidence 区间 min(startTime) / max(endTime);这是证据包络,不保证连续覆盖。PRELIMINARY 只有 lastEventTime 水位,start=null;证据缺失或异常为 null |
| 用氢 | updatedAt | 同一 daily_energy 行的 updated_at,无统计行为 null |
| 里程 | statisticsStartTime / statisticsEndTime | 同一所选来源 MIN(first_event_time) / MAX(latest_event_time)start 可为前一日跨日基线采样,不能夹到 00:00 伪造自然日起始;end 等于 dataTime;历史结转的当日 0 里程、无记录或异常缺少有效边界时为 null |
两个接口独立读取投影,**没有共同快照或严格同步统计保证**。同日、NORMAL、相近 updatedAt 均不足以证明可以相除。客户端至少需边界非空且一致,并核查证据覆盖/来源口径;边界仅为包络,相等也不是完整连续同区间的证明。无法证明可比时百公里氢耗为空,保留各自指标展示。里程沿用历史累计值时日里程补 0,是既有兼容规则,不证明当天真实测得零里程。
## 日用氢量算法与质量
当前算法标识为 `PRESSURE_NIST_VALID_BOUNDARY_CHARGE_CYCLE_V3_5`;客户端应展示实际 `algorithmVersion`,不能据名称自行推定公式或锁定未来版本。
数据基础是 GB32960 氢气压力(MPa)、温度(摄氏度)与车型配置的储氢系统水容积,经 NIST 实气压缩因子换算质量(kg):
```text
Tk = 温度 + 273.15
m = P × 1000 × 0.00201588 × V / (8.314472 × Tk × Z)
```
V 为储氢容积升数,Z 为代码实现的 NIST 压缩因子。算法筛选有效运行分界点,识别日内加氢后分段计算首末质量下降;不直接拿两次 API 响应相减。加氢识别包含持续压力回升与净质量增加补充规则;纯电异常压降、工作状态、运行边界与仪表里程异常参与质量判定。缺少足够有效边界为 `NO_DATA`。此输入不包含逐瓶完整性证明,不能将部分瓶数据包装成已测量全车总量。
压力边界无法产生有效正耗氢且满足混动里程等条件时,可用燃料电池电压电流积分折算氢量兜底;此时质量降为 `SUSPECT` 并在 `qualityReason` 说明。`hydrogenConsumptionKg` 返回物理用氢结果,不是 SOC、剩余氢量或 SOC 平衡校正量。压力法本身也是模型估算,不应对外宣称为质量流量计直接测量。
| qualityStatus | status | 数值与使用要求 |
| --- | --- | --- |
| OK | NORMAL | 可用于日内监控;还需校验计算阶段和可比区间 |
| SUSPECT | DATA_ANOMALY | 保留数值供审计,禁止作为正常百公里氢耗输入 |
| NO_DATA | NO_DATA | 用氢量为 null;没有统计行时质量/阶段等旧可选字段可能省略 |
`calculationPhase``PRELIMINARY``FINAL`。流式初步结果可变化,`NORMAL + PRELIMINARY + OK` 仅适用于明确标注“初步”的日内监控;不能当成最终日报。`FINAL` 表示已执行批量重算,仍可因补传、参数或算法修订再次重算,并非不可变账单。实际完成时间读取 `updatedAt`;接口不承诺每日固定时刻已经完成 FINAL。正式报表应同时要求 FINAL、OK、NORMAL、有效时间区间,并留存版本和查询快照。
## Seeker 必须同步适配
1. Go 上游模型增加储氢、GPS、质量及时间字段,映射 `remainingHydrogenKg → leftHydrogen``remainingHydrogenPercent → originalLeftHydrogen`;前端分别判断两个字段,保留真实 0,null 显示“—”并提示原因。
2. `socPercent` 仍为动力电池 SOC,不得替代储氢百分比。`timeDifferenceSeconds / 3600` 是记录年龄(小时),不是实际离线持续时间;移除“72 小时即 GPS 正常”的判断。
3. 按 VIN、规范化车牌及 date 合并三个接口;本地 truckNum、筛选、排序保持原口径。新字段不会自动接入不在本仓库的 Seeker 代码。
4. 百公里氢耗由 Seeker 计算 `hydrogenConsumptionKg / dailyMileageKm × 100`,单位 kg/100km。必须保证分子分母有效、里程大于 0、两行 NORMAL、氢量质量 OK,且统计区间可比较;否则返回 null。真实用氢量 0 与正里程可产生 0。历史字段 `dayHydrogenPercent` 并非百分比。
5. 联调需覆盖真实零、部分字段支持、陈旧、无记录、未支持协议、异常、离线历史位置、无定位、零里程及统计重算。页面验收须在 Seeker 完成上述接入后单独进行。