资讯动态

THE CAR HACKER’S HANDBOOK 解读第二章

发布时间:2026/8/20 0:43:43 来源:尧图企业网站定制
总线协议本章讨论车辆通信中常见的不同总线协议。总线协议控制着数据包在车辆网络中的传输多个网络和数百个传感器在这些总线系统上通信发送控制车辆行为及网络在任何时刻掌握信息。其中一种协议CAN 总线存在于所有车辆的标准位置OBD-II 连接器上。不过车辆 CAN 总线传输的数据包本身并未统一。车辆关键通信如转速管理和制动发生在高速 CAN 线上而非关键通信如车门锁和空调控制则用在低速 CAN 线上。1、CAN 总线CAN 是一种在制造业和汽车行业中使用的简单协议。现代车辆配备了许多小型嵌入式系统和电子控制单元(ECU)这些设备可以使用 CAN 协议进行通信。CAN 通过两根导线运行CAN 高电平(CANH)、CAN 低电平(CANL)。CAN 采用差分信号意味着信号进入时CAN 会在一条线路上提高电压同时降低另一条线路的电压。差分信号用于对噪声具备容错性的环境如汽车系统和制造业。上图为 CAN 差分信号使用 PicoScope 捕获的信号该设备同时监听 CANH(顶部较深的线)和 CANL(图底较浅的线)。传感器和 ECU 配置收发器用于检查是否同时触发两个信号如果不是收发器会将该数据包作为噪声来拒绝。2、OBD-II 连接器许多车辆配置了 OBD-II 连接器也成为诊断链路接口(DLC)用于车辆内部网络通信。通常在方向盘柱下方或仪表盘其他相对容易接近的位置。3、寻找 CAN 连接CAN 在寻找电缆时很容易找到他的静止电压是 2.5V。当信号输入时会增加或减去 1 V。CAN 线穿过车辆连接 ECU 和其他传感器且总是双线成对。如果用万用表检查车辆内的电线电压会发现它们静止电压为 2.5 V或者波动 1 V如果发现一根传输电压为 2.5 V的线几乎可以判断是 CAN。可以在 OBD-II 连接器的第 6 和第 14 针脚找到 CANH 和 CANL 连接。在图中6号和14号引脚用于标准高速CAN线路HS-CAN。中速和低速通信使用其他引脚。注这里的 CANH 和 CANL 指的是 CAN 高电平和低电平与传输速度无关仅代表这两个针脚为标准高速CAN(500kbps)。一些汽车在中速和低速中使用 CAN但许多车用不同的通信协议。我们会发现并非所有的总线都通过 OBD-II 暴露。4、CAN 总线包发布CAN 包有两种类型标准包和拓展包。拓展包类似于标准包但有更大的空间存放 ID。标准数据包每个 CAN 总线都包含 4 个关键元素仲裁 ID仲裁 ID 是一条广播信息用于识别试图通信设备的 ID尽管任何一个设备都可以发送多个仲裁 ID。如果同时沿总线发送两个 CAN 数据包仲裁 ID 较低的会优先处理紧急程度也会更高。标识符拓展(IDE)对于标准 CAN 来说始终为 0。数据长度码(DLC),这是数据的大小范围是 0-8字节。标准 CAN 总线数据包携带最大数据大小可达 8 字节但有些系统会填充数据包达到 8 字节。这里一定要清晰一点CAN 数据包中的数据长度才是8字节也就是图中 Data 部分整个 CAN 数据包实际上要 44 到 108 个字节(标准帧)。这里再介绍一下 CAN 总线包的特性他其实是广播式的同一网段所有 ECU 都能看到每个数据包和 UDP 差不多这里我们整体拆解一下 CAN 数据包。1、帧开始首先最开头的部分帧开始1bits 大小我们也能观察到图中电路的变化电路水平从 1 变为 0 了相当于告诉大家我要开发发包了。2、仲裁ID紧接着 11 bits 的仲裁 ID(Arbitration ID),这是报文 ID这部分越小优先级越高。3、远程发送请求(RTR)我们看到仲裁 ID 后面跟着 1 bits 的数据这是远程发送请求(RTR),0 代表数据帧(我要发送数据)1 代表远程帧(我要获取数据)。4、标志扩展位(IDE)与保留位(R0/R)在整个仲裁 ID 结束后我们能看但两个单独的字节其中 IDE 为标志扩展位0 代表标准帧(11 位 bits ID)1 代表扩展帧(29 位 bits ID)。还有 1 字节的保留位目前固定为 0 留以后升级协议使用(比如 CAN FD 就在动这里)。5、数据长度码(DLC)与数据段4 字节组成代表后面 Data 段字节数 0-8。Data,0-64 bits(8 字节)。6、校验段(CRC)这里是循环冗余校验15 bits 大小。7、校验界定符DEL1 bit,固定为 1。8、应答段与帧结束EOFACK1 bit,发送方发 1接收方收到了会将其置为 0,作为回应。7 bits全是1代表数据结束。5、ISO-TP 协议ISO 15765-2,也称为 ISO-TP是一种通过 CAN 总线发送数据包的标准通过 CAN 数据包串联将 8 字节 CAN 限制扩展到支持最多 4095 字节。ISO-TP 最常见的用途是诊断和 KWP 消息(CAN 的替代协议)但也可用于需要通过 CAN 传输大量数据时。can-utils 程序包含 isotptun,这是一个可用于 SocketCAN 的概念验证隧道工具允许两个设备通过 CAN 进行 IP 隧道传输。为了将 ISO-TP 封装 CAN第一个字节用于扩展寻址每个数据包只剩 7 字节用于数据。以下这张图作为区分我们所提及的 ISO 15765-2也就是 ISO-TP他本质适用于传输的。这里这些协议栈相互交错比较难区分。协议区分这里再归纳一下UDS (ISO 14229 汽车诊断协议)主要作用于应用层他是定义了诊断服务 ID(SID) 和数据格式。他只规定请求什么和如何响应完全独立于底层的通信介质。核心字段如SID(0x22 读服务 0x2E 写服务) Indentifier(如 0xF190 VIN码)DoIP (ISO 13400 基于 IP 的诊断通信协议)是位于传输层/网络层拓展他本质是诊断仪与网关之间的边缘节点协议他利用 TCP/IP 承载 UDS主要在复杂的 IP 网络中定位车辆并建立诊断逻辑连接。他的核心机制就是路由激活、车辆发现、节点地址映射解决从“外网”进入到“内网”的准入问题。ISO-TP (ISO 15765-2 CAN 传输协议)他定位于传输层其实他的本质是 CAN 总线专用的数据拆解与流控协议。因为底层 CAN 链路层的数据长度(DLC)受限制他必须在应用层和链路层之间做一个切片管理。他的核心机制才是 SF(单帧)、FF(首帧)、CF(连续帧)、FC(流控帧)。而我们最熟悉的是 CAN 协议 (ISO 11898)他的定位是数据链路层与物理层它的本质是汽车底层串行通信协议。他只负责在总线上进行位仲裁、拆分信号传输、CRC 验证和基础数据帧投递。6、CANopen 协议CANopen 是基于 CAN 总线的高层协议他最核心的特点就是把 11 位的 CAN ID 给拆了。Function Code(4位)代表这帧报文功能(如紧急停止、发送数据)Node ID(7位)代表是哪个设备的 ID。合起来这两个叫做 COB-ID。该协议的核心灵魂是对象字典CANopen :每个设备里都有一个大表叫对象字典每一行都有一个 Index(索引) 和 Sub-index(子索引)比如索引 0x6060 对应模式选择0x6040 对应控制字如果想改参数就直接去这张表中找对应行即可。7、 本地互联网协议(LIN)本地互连网络LIN是所有车辆协议中最便宜的一种。它的设计是为了补充 CAN。它没有仲裁或优先权代码;相反单个主节点负责所有传输。这里就截个图简单介绍一下。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价