【01】基于CPAL实现的CAN报文E2E保护—AUTOSAR-E2E profile 5介绍及python计算
摘要:E2E(端到端)是车载通信中保障ECU间可靠性的机制,通过CRC、Counter和DataID等手段检测信息丢失、重复、损坏等问题。在AUTOSAR中,E2E负责数据完整性保护、防止重放攻击等,与COM、PDU-Router等模块协同工作。E2E Profile5采用CRC-16/CCITT-FALSE算法,包含DataID、Counter和CRC字段,其中DataID隐式传输参与计算。示例
目录
1 什么是E2E
E2E ——端到端(End to End)在车载通信领域指的是一种保障 ECU 之间通信“可靠性和一致性”的机制,它通常通过 CRC、Counter、DataID 等手段,在配合 AUTOSAR 的通信模块一起工作。
参考AUTOSAR_CP_EXP_LayeredSoftwareArchitecture关于E2E Protection Wrapper Approach 方法的介绍,E2E可以有效的检测信息丢失、信息重复、信息延迟、信息插入、伪装、冒充、不正确的信息寻址、信息顺序不正确、信息损坏、从一个发送者发送到多个接收者的不对称信息、来自发送者的信息仅被一部分接收者接收、阻塞访问通信通道。


-
E2E 是“附加性”机制,不会改变原始数据,而是在其基础上附加校验信息
-
CRC 循环冗余校验是整个机制的核心,E2E Profile中必须配合 Counter 和 Data ID 才能实现完整保护
2 E2E在AUTOSAR中的职责
| 类别 | 具体职责/功能 | 说明与作用 | 典型机制字段 |
|---|---|---|---|
| 数据完整性保护 | 检测数据在传输过程中是否被破坏 | 使用 CRC 检测传输过程中发生的比特错误、位翻转等 | CRC(循环冗余校验) |
| 防止重放攻击 | 检查是否收到旧帧 | 使用递增的 Counter 字段,判断帧是否是重复帧 | Counter(计数器) |
| 识别帧丢失 | 判断是否有帧丢失 | 接收方检查 Counter 是否跳变过大 | Counter(计数器) |
| 数据身份确认 | 区分不同信号源,避免 CRC 冲突 | 添加 Data ID 字段作为 CRC 计算因子,提高误判帧的识别能力 | Data ID(数据标识) |
| 长度一致性检查 | 检查实际数据长度是否符合协议 | 防止内容被截断或非法扩展(仅部分 Profile 支持) | Length、配置长度参数 |
| 兼容多种传输方式 | 适用于 CAN、FlexRay、Ethernet 等不同传输层 | 与 PDU Router、COM 模块配合实现适配 | 与通信栈模块接口 |
| 容错性和可配置性 | 根据 Profile 等级配置检测等级与策略 | 提供不同 Profile(E2E1、E2E2、E2E5...)以适配安全等级需求 | Profile 配置 |
| 支持软件可测试性 | 可通过测试帧验证 Counter 滚动、CRC 正确性 | 增强开发阶段测试能力 | 支持软错误注入与状态反馈 |
| 可集成性强 | 与 COM、PDU-Router、Diag、SoAd 等协作 | 使用接口函数与其他 BSW 模块无缝协同 | 与 BSW 层紧密协作 |
3 E2E Profile 5介绍
参考AUTOSAR Classic Platform的AUTOSAR_CP_SWS_E2ELibrary,需要可自行下载
E2E 通信字段结构
| 字段名称 | 长度 | 类型 | 是否参与 CRC | 描述 |
|---|---|---|---|---|
| Data ID | 16 bits | 隐式传输 | ✅ 是 | 消息唯一标识符。用于防止将不同数据误判为同一类型;作为 CRC 输入一部分,但不被发送。 |
| Counter | 8 bits | 显式传输 | ✅ 是 | 周期性递增的计数器,用于检测数据是否丢失、重复或顺序错误。 |
| Data/Payload | N bits | 显式传输 | ✅ 是 | 实际业务数据。CRC 校验的主要对象。 |
| CRC | 16 bits | 显式传输 | ⛔ 否(是输出) | CRC 校验值,基于 Data ID、Counter、Payload 计算得出,用于接收端完整性校验。 |
CRC-16/CCITT-FALSE参数
具体什么是CRC下一篇再讲,此处直接用。E2E Profile 5的算法为CRC-16/CCITT-FALSE,无偏移量
| 参数 | 值 |
|---|---|
| CRC长度 | 16bit |
| Counter长度 | 8bit |
| 多项式 | 0x1021 |
| 初始值 | 0xFFFF |
| 输入反转 | False |
| 输出反转 | False |
| 输出异或值 | 0x0000 |
CAN示例
| Byte Order | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| Data | 0xC7 | 0x33 | 0x00 | 0xA1 | 0xB2 | 0xC3 | 0xD4 | 0xE5 |
| Type | CRC | Counter | Data | |||||
Length 为8 bytes,其中payload数据字节为最后5 bytes
Counter 为0
Data ID 为0x1234隐式传输,参与计算但不传输,大端模式
CRC 计算序列=0x00 0xA1 0xB2 0xC3 0xD4 0xE5 0x34 0x12
计算后,CRC 值为0x33C7: CRC(ByteIndex0)为0xC7, CRC(ByteIndex1)为0x33
python计算
def crc16_ccitt_false(data: bytes) -> int:
crc = 0xFFFF
poly = 0x1021
for b in data:
crc ^= (b << 8)
for _ in range(8):
if crc & 0x8000:
crc = ((crc << 1) ^ poly) & 0xFFFF
else:
crc = (crc << 1) & 0xFFFF
return crc
# 测试
data = bytes([0x00,0xA1, 0xB2, 0xC3, 0xD4, 0xE5,0x34,0x12])
crc_result = crc16_ccitt_false(data)
print(f"CRC-16/CCITT-FALSE = 0x{crc_result:04X}")
运行结果:CRC-16/CCITT-FALSE = 0x33C7
CRC在线网站计算
CRC在线计算配置如图

后续更新CRC及CAPL实现CAN报文发送....
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)