V2X 通信协议
V2X 技术概述
V2X(Vehicle to Everything)是车辆与外界通信的总称,包括 V2V、V2I、V2N、V2P 四种场景。
V2X 通信技术路线
| 技术 | 标准 | 频段 | 时延 | 覆盖 | 状态 |
|---|---|---|---|---|---|
| DSRC(C-V2X 前身) | IEEE 802.11p | 5.9GHz | < 10ms | 300-1000m | 逐步退出 |
| C-V2X PC5(LTE-V2X) | 3GPP Release 14 | 5.9GHz | < 20ms | 300-500m | 国内主流 |
| C-V2X PC5(NR-V2X) | 3GPP Release 16 | 5.9GHz | < 5ms | 300-500m | 逐步推进 |
| C-V2X Uu(蜂窝) | 4G/5G | 蜂窝频段 | 50-100ms | 全网覆盖 | 已商用 |
国内 V2X 政策
频谱分配:
工信部分配 5905-5925MHz(20MHz)用于 LTE-V2X
标准体系:
T/CSAE 53-2020:合作式智能运输系统 V2X 通信技术要求
GB/T 37376-2019:交通运输 数字证书格式
推进情况:
2021年:多个城市开展 V2X 试点
2023年:部分城市开始规模化部署
2025年:目标实现主要城市 V2X 覆盖LTE-V2X(PC5 直连通信)
PC5 接口特点
PC5 是 V2X 设备间的直连通信接口(不经过基站):
- 通信距离:300-500m(视线内)
- 时延:< 20ms(端到端)
- 频段:5.9GHz(5905-5925MHz)
- 调制:QPSK / 16QAM
- 信道带宽:10MHz
工作模式:
Mode 3:基站调度(有网络覆盖时)
Mode 4:自主调度(无网络覆盖时,分布式)V2X 消息类型
BSM(Basic Safety Message,基本安全消息):
- 发送频率:10Hz
- 内容:位置、速度、航向、加速度、刹车状态
- 用途:碰撞预警、协同驾驶
RSM(Road Side Message,路侧消息):
- 来源:路侧单元(RSU)
- 内容:交通信号、道路状况、施工信息
- 用途:信号灯协同、危险预警
MAP(Map Data,地图数据):
- 来源:RSU
- 内容:路口几何信息、车道信息
- 用途:精确路口导航
SPAT(Signal Phase and Timing,信号相位与配时):
- 来源:RSU(连接交通信号控制机)
- 内容:信号灯当前状态、剩余时间
- 用途:绿波车速引导、闯红灯预警BSM 消息格式(ASN.1)
BasicSafetyMessage ::= SEQUENCE {
msgCnt MsgCount, -- 消息计数(0-127)
id TemporaryID, -- 临时 ID(4字节,定期更换)
secMark DSecond, -- 毫秒时间戳
pos Position3D, -- 位置(经纬度+高程)
accuracy PositionalAccuracy, -- 位置精度
transmission TransmissionState, -- 档位状态
speed Speed, -- 速度(0.02 m/s 分辨率)
heading Heading, -- 航向(0.0125° 分辨率)
angle SteeringWheelAngle, -- 方向盘转角
accelSet AccelerationSet4Way, -- 加速度集合
brakes BrakeSystemStatus, -- 刹车状态
size VehicleSize -- 车辆尺寸
}C-V2X 模组集成
移远 V2X 方案
移远与合作伙伴提供完整的 C-V2X 解决方案:
硬件方案:
蜂窝模组(RG520N,5G Uu 接口)
+ V2X 模组(PC5 直连通信)
+ GNSS 模组(LC29H,高精度定位)
+ 主控 SoC(处理 V2X 消息)
软件方案:
V2X 协议栈(BSM/RSM/MAP/SPAT 消息处理)
安全认证(V2X 证书管理)
应用层(碰撞预警、信号灯协同等)V2X 应用开发示例
c
// V2X BSM 消息发送
#include "v2x_api.h"
// 初始化 V2X
void v2x_init(void) {
V2XConfig config = {
.channel = V2X_CHANNEL_172, // 5.9GHz 信道 172
.tx_power = 23, // 发射功率 23dBm
.data_rate = V2X_RATE_6M, // 6Mbps
.mode = V2X_MODE_CONTINUOUS // 连续发送
};
v2x_open(&config);
}
// 构建并发送 BSM
void send_bsm(GNSSData *gnss, VehicleData *vehicle) {
BSM bsm = {0};
// 填充 BSM 字段
bsm.msgCnt = (bsm.msgCnt + 1) % 128;
bsm.secMark = get_millisecond_of_minute();
bsm.pos.lat = (int32_t)(gnss->latitude * 1e7);
bsm.pos.lon = (int32_t)(gnss->longitude * 1e7);
bsm.pos.elevation = (int32_t)(gnss->altitude * 10);
bsm.speed = (uint16_t)(gnss->speed / 0.02f); // 0.02 m/s 分辨率
bsm.heading = (uint16_t)(gnss->heading / 0.0125f);
bsm.accelSet.Long = (int16_t)(vehicle->accel_x / 0.01f);
bsm.accelSet.Lat = (int16_t)(vehicle->accel_y / 0.01f);
bsm.brakes.wheelBrakes = vehicle->brake_applied ? 0x0F : 0x00;
bsm.size.width = vehicle->width;
bsm.size.length = vehicle->length;
// 编码并发送
uint8_t encoded[256];
int len = bsm_encode(&bsm, encoded, sizeof(encoded));
v2x_send(encoded, len);
}
// 接收并处理 BSM
void on_bsm_received(uint8_t *data, int len, int rssi) {
BSM bsm;
if (bsm_decode(data, len, &bsm) != 0) return;
// 碰撞预警检测
check_collision_warning(&bsm, rssi);
}
// 碰撞预警算法
void check_collision_warning(BSM *remote_bsm, int rssi) {
// 获取本车状态
GNSSData my_gnss;
get_my_gnss(&my_gnss);
// 计算两车距离
double distance = calculate_distance(
my_gnss.latitude, my_gnss.longitude,
remote_bsm->pos.lat / 1e7, remote_bsm->pos.lon / 1e7
);
// 计算碰撞时间(TTC)
float my_speed = my_gnss.speed;
float remote_speed = remote_bsm->speed * 0.02f;
// 简化的 TTC 计算
float relative_speed = my_speed - remote_speed;
float ttc = (relative_speed > 0) ? distance / relative_speed : 999.0f;
// 预警判断
if (distance < 50.0 && ttc < 3.0) {
trigger_collision_warning(distance, ttc);
}
}