13 KiB
13 KiB
🏎️ F1 24 UDP Telemetry 规范总览
📌 官方文档
- 官方规范 Word 文档:EA Forums — Data Output from F1 24 v27.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
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 辆车的物理数据。
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 Eliminationm_safetyCarStatus: 0=无, 1=实体安全车, 2=虚拟安全车, 3=编队圈m_weatherForecastSamples[64]: 天气预测(最多 64 样本,适配冲刺赛周末)m_weekendStructure[12]: 周末赛程结构m_sector2LapDistanceStart/m_sector3LapDistanceStart: 赛段起点距离
3. Lap Data Packet(ID=2)
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)
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)
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)
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 等) 设计,包含更多细节:
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 的主要变化
- 会话包中新增模拟/规则选项
- 新增安全车事件详情(
SCAR) - 大厅和参与者包中新增在线名称、Your Telemetry、F1 World Tech Level
- 圈速包中新增与前车/领先者的分钟差距字段
- 最终排名包改为结果界面每 5 秒重复发送
- 新增 Time Trial 包(ID=14)
- Motion Ex 包新增底盘高度(plank height)、悬挂侧倾角、底盘偏航角
- 新增碰撞事件(
COLL) - 新增周末赛程结构(
m_weekendStructure) - 天气预测数组从 56 扩展到 64
- 圈速包新增速度陷阱数据
- Car Setup 包新增发动机制动参数 + 下次进站前翼值