目录

1 什么是E2E

2 E2E在AUTOSAR中的职责

3 E2E Profile 5介绍

E2E 通信字段结构

CRC-16/CCITT-FALSE参数

CAN示例

python计算

CRC在线网站计算


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报文发送....

Logo

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

更多推荐