docs: add F1 24 UDP data format reference
This commit is contained in:
@@ -0,0 +1,318 @@
|
||||
|
||||
## 🏎️ F1 24 UDP Telemetry 规范总览
|
||||
|
||||
### 📌 官方文档
|
||||
- **官方规范 Word 文档**:[EA Forums — Data Output from F1 24 v27.2x.docx](https://forums.ea.com/t5/s/tghpe58374/attachments/tghpe58374/f1-24-general-discussion-en/4624/1/Data%20Output%20from%20F1%2024%20v27.2x.docx)
|
||||
- **GitHub 开源解析库参考**:https://github.com/MacManley/f1-24-udp
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 游戏设置
|
||||
|
||||
在游戏中启用 UDP 遥测:**Game Options → Settings → Telemetry Settings**
|
||||
|
||||
| 设置项 | 推荐值 |
|
||||
|---|---|
|
||||
| `UDP Telemetry` | On |
|
||||
| `UDP Broadcast Mode` | Off(多设备时可开启) |
|
||||
| `UDP IP Address` | 接收端 IP(本机用 `127.0.0.1`) |
|
||||
| `Port` | `20777`(默认) |
|
||||
| `UDP Send Rate` | `20Hz`(默认,最高 60Hz) |
|
||||
| `UDP Format` | `2024` |
|
||||
|
||||
> ⚠️ 注意:游戏仅在玩家进入 **计时圈(timed lap)** 后才开始发送有效遥测数据。
|
||||
|
||||
---
|
||||
|
||||
## 📦 数据编码
|
||||
|
||||
- **字节序**:Little Endian
|
||||
- **对齐**:packed(无填充)
|
||||
- **最大车辆数**:22
|
||||
|
||||
### 数据类型
|
||||
|
||||
| 类型 | 说明 |
|
||||
|---|---|
|
||||
| `uint8` / `int8` | 无符号/有符号 8-bit |
|
||||
| `uint16` / `int16` | 无符号/有符号 16-bit |
|
||||
| `uint32` | 无符号 32-bit |
|
||||
| `uint64` | 无符号 64-bit |
|
||||
| `float` | 32-bit 浮点 |
|
||||
|
||||
---
|
||||
|
||||
## 📋 包头结构(PacketHeader)
|
||||
|
||||
**大小:29 bytes**
|
||||
|
||||
```c
|
||||
struct PacketHeader {
|
||||
uint16 m_packetFormat; // 2024
|
||||
uint8 m_gameYear; // 年份后两位,如 24
|
||||
uint8 m_gameMajorVersion; // 主版本号 "X.00"
|
||||
uint8 m_gameMinorVersion; // 次版本号 "1.XX"
|
||||
uint8 m_packetVersion; // 包类型版本号,从 1 开始
|
||||
uint8 m_packetId; // 包类型 ID(见下表)
|
||||
uint64 m_sessionUID; // 会话唯一 ID
|
||||
float m_sessionTime; // 会话时间戳
|
||||
uint32 m_frameIdentifier; // 帧标识符
|
||||
uint32 m_overallFrameIdentifier; // 全局帧标识符(Flashback 不回退)
|
||||
uint8 m_playerCarIndex; // 玩家车辆索引
|
||||
uint8 m_secondaryPlayerCarIndex; // 分屏第二玩家索引(255 = 无)
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🆔 包类型 ID 汇总
|
||||
|
||||
| ID | 包名称 | 说明 | 频率 | 大小 |
|
||||
|---|---|---|---|---|
|
||||
| 0 | **Motion** | 所有车辆物理运动数据 | 菜单设定频率 | 1349 B |
|
||||
| 1 | **Session** | 会话信息(赛道、剩余时间) | 2/秒 | 753 B |
|
||||
| 2 | **Lap Data** | 所有车辆圈速数据 | 菜单设定频率 | 1285 B |
|
||||
| 3 | **Event** | 会话事件 | 事件触发时 | 45 B |
|
||||
| 4 | **Participants** | 参与者列表 | 每 5 秒 | 1350 B |
|
||||
| 5 | **Car Setups** | 车辆调校参数 | 2/秒 | 1133 B |
|
||||
| 6 | **Car Telemetry** | 遥测数据(速度/油门/DRS等) | 菜单设定频率 | 1352 B |
|
||||
| 7 | **Car Status** | 车辆状态(燃油/ERS等) | 菜单设定频率 | 1239 B |
|
||||
| 8 | **Final Classification** | 最终排名 | 结果界面每 5 秒 | 1020 B |
|
||||
| 9 | **Lobby Info** | 多人游戏大厅信息 | 大厅中 2/秒 | 1306 B |
|
||||
| 10 | **Car Damage** | 车辆损伤数据 | 10/秒 | 953 B |
|
||||
| 11 | **Session History** | 圈速和轮胎历史 | 20/秒(轮询车辆) | 1460 B |
|
||||
| 12 | **Tyre Sets** | 轮胎组详细数据 | 2/秒 | 231 B |
|
||||
| 13 | **Motion Ex** | 玩家车辆扩展运动数据 | 菜单设定频率 | 237 B |
|
||||
| 14 | **Time Trial** | 计时赛专用数据 | 1/秒(仅TT) | 101 B |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 各包数据结构详解
|
||||
|
||||
### 1. Motion Packet(ID=0)
|
||||
包含所有 22 辆车的物理数据。
|
||||
|
||||
```c
|
||||
struct CarMotionData {
|
||||
float m_worldPositionX, m_worldPositionY, m_worldPositionZ; // 世界位置 (m)
|
||||
float m_worldVelocityX, m_worldVelocityY, m_worldVelocityZ; // 世界速度 (m/s)
|
||||
int16 m_worldForwardDirX, m_worldForwardDirY, m_worldForwardDirZ; // 前向向量(÷32767 归一化)
|
||||
int16 m_worldRightDirX, m_worldRightDirY, m_worldRightDirZ; // 右向向量
|
||||
float m_gForceLateral, m_gForceLongitudinal, m_gForceVertical; // G 力分量
|
||||
float m_yaw, m_pitch, m_roll; // 角度 (rad)
|
||||
};
|
||||
// PacketMotionData: PacketHeader + CarMotionData[22]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Session Packet(ID=1)
|
||||
包含当前会话完整信息,如天气、温度、赛道、规则、辅助设置等。
|
||||
|
||||
关键字段:
|
||||
- `m_weather`: 0=晴, 1=少云, 2=阴, 3=小雨, 4=大雨, 5=暴雨
|
||||
- `m_trackId`: 赛道 ID(-1=未知,见附录)
|
||||
- `m_sessionType`: 会话类型
|
||||
- `m_formula`: 0=F1 Modern, 1=F1 Classic, 2=F2, 3=F1 Generic, 4=Beta, 6=Esports, 8=F1 World, 9=F1 Elimination
|
||||
- `m_safetyCarStatus`: 0=无, 1=实体安全车, 2=虚拟安全车, 3=编队圈
|
||||
- `m_weatherForecastSamples[64]`: 天气预测(最多 64 样本,适配冲刺赛周末)
|
||||
- `m_weekendStructure[12]`: 周末赛程结构
|
||||
- `m_sector2LapDistanceStart` / `m_sector3LapDistanceStart`: 赛段起点距离
|
||||
|
||||
---
|
||||
|
||||
### 3. Lap Data Packet(ID=2)
|
||||
```c
|
||||
struct LapData {
|
||||
uint32 m_lastLapTimeInMS; // 上一圈时间 (ms)
|
||||
uint32 m_currentLapTimeInMS; // 当前圈耗时 (ms)
|
||||
uint16 m_sector1TimeMSPart; // S1 毫秒部分
|
||||
uint8 m_sector1TimeMinutesPart; // S1 分钟部分
|
||||
uint16 m_sector2TimeMSPart; // S2 毫秒部分
|
||||
uint8 m_sector2TimeMinutesPart; // S2 分钟部分
|
||||
uint16 m_deltaToCarInFrontMSPart; // 与前车差距毫秒
|
||||
uint8 m_deltaToCarInFrontMinutesPart; // 与前车差距分钟
|
||||
uint16 m_deltaToRaceLeaderMSPart; // 与领跑者差距毫秒
|
||||
uint8 m_deltaToRaceLeaderMinutesPart; // 与领跑者差距分钟
|
||||
float m_lapDistance; // 当前圈已跑距离 (m)
|
||||
float m_totalDistance; // 总行驶距离 (m)
|
||||
float m_safetyCarDelta; // 安全车时间差 (s)
|
||||
uint8 m_carPosition; // 赛道排名
|
||||
uint8 m_currentLapNum; // 当前圈数
|
||||
uint8 m_pitStatus; // 0=无, 1=进站中, 2=维修区
|
||||
uint8 m_numPitStops; // 已进站次数
|
||||
uint8 m_sector; // 0=S1, 1=S2, 2=S3
|
||||
uint8 m_currentLapInvalid; // 0=有效, 1=无效
|
||||
uint8 m_penalties; // 累计罚时 (s)
|
||||
uint8 m_driverStatus; // 0=车库, 1=飞行圈, 2=回场圈, 3=出场圈, 4=赛道上
|
||||
uint8 m_resultStatus; // 0-7 (invalid/active/finished/DNF/DSQ等)
|
||||
float m_speedTrapFastestSpeed; // 速度陷阱最快速度 (km/h)
|
||||
// ... 等
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Event Packet(ID=3)
|
||||
事件代码:
|
||||
|
||||
| 代码 | 事件 | 代码 | 事件 |
|
||||
|---|---|---|---|
|
||||
| `SSTA` | 会话开始 | `SEND` | 会话结束 |
|
||||
| `FTLP` | 最快圈速 | `RTMT` | 退赛 |
|
||||
| `DRSE` | DRS 启用 | `DRSD` | DRS 禁用 |
|
||||
| `TMPT` | 队友进站 | `CHQF` | 方格旗 |
|
||||
| `RCWN` | 冠军产生 | `PENA` | 处罚发出 |
|
||||
| `SPTP` | 速度陷阱触发 | `STLG` | 发车灯 |
|
||||
| `LGOT` | 灯灭起跑 | `DTSV` | Drive-through 已执行 |
|
||||
| `SGSV` | Stop-Go 已执行 | `FLBK` | Flashback |
|
||||
| `BUTN` | 按钮状态 | `RDFL` | 红旗 |
|
||||
| `OVTK` | 超车 | `SCAR` | 安全车事件 |
|
||||
| `COLL` | 碰撞事件 | | |
|
||||
|
||||
---
|
||||
|
||||
### 5. Car Telemetry Packet(ID=6)
|
||||
```c
|
||||
struct CarTelemetryData {
|
||||
uint16 m_speed; // 速度 (km/h)
|
||||
float m_throttle; // 油门 (0.0~1.0)
|
||||
float m_steer; // 转向 (-1.0~1.0)
|
||||
float m_brake; // 刹车 (0.0~1.0)
|
||||
uint8 m_clutch; // 离合 (0~100)
|
||||
int8 m_gear; // 档位 (1-8, N=0, R=-1)
|
||||
uint16 m_engineRPM; // 引擎转速
|
||||
uint8 m_drs; // DRS: 0=关, 1=开
|
||||
uint8 m_revLightsPercent; // 转速灯百分比
|
||||
uint16 m_revLightsBitValue; // 转速灯位值
|
||||
uint16 m_brakesTemperature[4]; // 刹车温度 (°C)
|
||||
uint8 m_tyresSurfaceTemperature[4]; // 胎面温度 (°C)
|
||||
uint8 m_tyresInnerTemperature[4]; // 胎内温度 (°C)
|
||||
uint16 m_engineTemperature; // 引擎温度 (°C)
|
||||
float m_tyresPressure[4]; // 胎压 (PSI)
|
||||
uint8 m_surfaceType[4]; // 路面类型
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. Car Status Packet(ID=7)
|
||||
```c
|
||||
struct CarStatusData {
|
||||
uint8 m_tractionControl; // 0=关, 1=中, 2=全
|
||||
uint8 m_antiLockBrakes; // 0=关, 1=开
|
||||
uint8 m_fuelMix; // 0=Lean, 1=Standard, 2=Rich, 3=Max
|
||||
uint8 m_frontBrakeBias; // 前刹车比 (%)
|
||||
float m_fuelInTank; // 燃油量 (kg)
|
||||
float m_fuelCapacity; // 油箱容量
|
||||
float m_fuelRemainingLaps; // 剩余油量可跑圈数
|
||||
uint8 m_drsAllowed; // DRS 是否允许
|
||||
uint16 m_drsActivationDistance; // DRS 激活距离 (m)
|
||||
uint8 m_actualTyreCompound; // 实际轮胎配方 (16=C5, 17=C4, 18=C3, 19=C2, 20=C1, 21=C0, 7=半雨, 8=全雨)
|
||||
uint8 m_visualTyreCompound; // 视觉轮胎配方 (16=软, 17=中, 18=硬)
|
||||
uint8 m_tyresAgeLaps; // 轮胎使用圈数
|
||||
int8 m_vehicleFiaFlags; // FIA 旗帜 (-1=未知, 0=无, 1=绿, 2=蓝, 3=黄)
|
||||
float m_enginePowerICE; // 内燃机功率 (W)
|
||||
float m_enginePowerMGUK; // MGU-K 功率 (W)
|
||||
float m_ersStoreEnergy; // ERS 储能 (J)
|
||||
uint8 m_ersDeployMode; // 0=无, 1=Medium, 2=Hotlap, 3=Overtake
|
||||
float m_ersHarvestedThisLapMGUK; // MGU-K 回收能量
|
||||
float m_ersHarvestedThisLapMGUH; // MGU-H 回收能量
|
||||
float m_ersDeployedThisLap; // 已使用 ERS 能量
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. Car Damage Packet(ID=10)
|
||||
```c
|
||||
struct CarDamageData {
|
||||
float m_tyresWear[4]; // 轮胎磨损 (%)
|
||||
uint8 m_tyresDamage[4]; // 轮胎损伤 (%)
|
||||
uint8 m_brakesDamage[4]; // 刹车损伤 (%)
|
||||
uint8 m_frontLeftWingDamage; // 前左翼损伤 (%)
|
||||
uint8 m_frontRightWingDamage; // 前右翼损伤 (%)
|
||||
uint8 m_rearWingDamage; // 尾翼损伤 (%)
|
||||
uint8 m_floorDamage; // 底板损伤 (%)
|
||||
uint8 m_diffuserDamage; // 扩散器损伤 (%)
|
||||
uint8 m_sidepodDamage; // 侧箱损伤 (%)
|
||||
uint8 m_drsFault; // DRS 故障 (0/1)
|
||||
uint8 m_ersFault; // ERS 故障 (0/1)
|
||||
uint8 m_gearBoxDamage; // 变速箱损伤 (%)
|
||||
uint8 m_engineDamage; // 引擎损伤 (%)
|
||||
uint8 m_engineMGUHWear; // MGU-H 磨损 (%)
|
||||
uint8 m_engineESWear; // ES 磨损 (%)
|
||||
uint8 m_engineCEWear; // CE 磨损 (%)
|
||||
uint8 m_engineICEWear; // ICE 磨损 (%)
|
||||
uint8 m_engineMGUKWear; // MGU-K 磨损 (%)
|
||||
uint8 m_engineTCWear; // TC 磨损 (%)
|
||||
uint8 m_engineBlown; // 引擎爆缸 (0/1)
|
||||
uint8 m_engineSeized; // 引擎卡死 (0/1)
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. Motion Ex Packet(ID=13)— 运动平台关键包
|
||||
|
||||
专为 **运动模拟平台(D-BOX 等)** 设计,包含更多细节:
|
||||
|
||||
```c
|
||||
float m_suspensionPosition[4]; // 悬挂位置 [RL, RR, FL, FR]
|
||||
float m_suspensionVelocity[4]; // 悬挂速度
|
||||
float m_suspensionAcceleration[4]; // 悬挂加速度
|
||||
float m_wheelSpeed[4]; // 各轮速度
|
||||
float m_wheelSlipRatio[4]; // 滑移率
|
||||
float m_wheelSlipAngle[4]; // 滑移角
|
||||
float m_wheelLatForce[4]; // 横向力
|
||||
float m_wheelLongForce[4]; // 纵向力
|
||||
float m_wheelVertForce[4]; // 垂向力
|
||||
float m_heightOfCOGAboveGround; // 重心高度
|
||||
float m_localVelocityX/Y/Z; // 局部速度
|
||||
float m_angularVelocityX/Y/Z; // 角速度 (rad/s)
|
||||
float m_angularAccelerationX/Y/Z; // 角加速度 (rad/s²)
|
||||
float m_frontWheelsAngle; // 前轮转角 (rad)
|
||||
float m_frontAeroHeight; // 前底盘高度
|
||||
float m_rearAeroHeight; // 后底盘高度
|
||||
float m_frontRollAngle; // 前悬挂侧倾角
|
||||
float m_rearRollAngle; // 后悬挂侧倾角
|
||||
float m_chassisYaw; // 底盘偏航角 (rad) — 可用于判断侧滑
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. 其余包简介
|
||||
|
||||
| 包 | 关键内容 |
|
||||
|---|---|
|
||||
| **Final Classification (8)** | 最终排名、圈数、积分、最佳圈速、轮胎使用记录 |
|
||||
| **Lobby Info (9)** | 多人游戏大厅的玩家信息 |
|
||||
| **Session History (11)** | 每辆车的全部圈速历史 + 轮胎使用历史(最多 100 圈) |
|
||||
| **Tyre Sets (12)** | 轮胎组详情:配方、磨损度、可用性、圈速差等 |
|
||||
| **Time Trial (14)** | 计时赛专属:玩家最佳、个人最佳、对手数据 |
|
||||
|
||||
---
|
||||
|
||||
## 🔒 隐私:Your Telemetry 设置
|
||||
|
||||
当玩家设置 `Your Telemetry = Restricted` 时,以下数据对其他玩家**归零**:
|
||||
- **Car Status**:燃油、ERS 相关数据
|
||||
- **Car Damage**:所有损伤数据
|
||||
- **Tyre Sets**:全部轮胎组数据
|
||||
|
||||
---
|
||||
|
||||
## 🆕 F1 24 相比 F1 23 的主要变化
|
||||
|
||||
1. 会话包中新增模拟/规则选项
|
||||
2. 新增安全车事件详情(`SCAR`)
|
||||
3. 大厅和参与者包中新增在线名称、Your Telemetry、F1 World Tech Level
|
||||
4. 圈速包中新增与前车/领先者的分钟差距字段
|
||||
5. 最终排名包改为结果界面每 5 秒重复发送
|
||||
6. 新增 **Time Trial 包**(ID=14)
|
||||
7. Motion Ex 包新增底盘高度(plank height)、悬挂侧倾角、底盘偏航角
|
||||
8. 新增碰撞事件(`COLL`)
|
||||
9. 新增周末赛程结构(`m_weekendStructure`)
|
||||
10. 天气预测数组从 56 扩展到 64
|
||||
11. 圈速包新增速度陷阱数据
|
||||
12. Car Setup 包新增发动机制动参数 + 下次进站前翼值
|
||||
Reference in New Issue
Block a user