车联网can总线协议初探

can总线协议

CAN总线协议(Controller Area Network)是一种用于车联网的串行通信协议。它最初由德国Bosch公司在20世纪80年代为汽车电子控制系统而开发,旨在解决不同电子控制单元(ECU)之间的通信问题。以下是CAN总线协议的一些关键特点:

  1. 高可靠性和实时性:CAN协议支持快速的数据传输和错误检测与纠正,确保了通信的高可靠性和实时性。
  2. 多主架构:CAN总线是一种多主(multi-master)架构,这意味着任何节点都可以在总线上发送消息,无需中央控制器。
  3. 短帧格式:CAN总线使用短帧格式(8字节的数据),这使得通信效率高,且可以满足汽车控制系统对实时性的要求。
  4. 错误检测机制:CAN协议具有多种错误检测机制,如位填充、帧校验、应答校验和错误检测码,以确保数据传输的完整性和可靠性。
  5. 消息优先级:CAN总线协议使用消息标识符来确定优先级。较低数值的标识符拥有更高的优先级,这使得紧急信息可以优先传输。
  6. 速度和距离:CAN协议支持的最大传输速率可达1Mbps,但速率和距离成反比。典型的汽车应用中,CAN总线的长度可达几百米。
  7. 应用广泛:除了汽车领域,CAN总线协议还广泛应用于工业自动化、医疗设备和其他需要可靠通信的嵌入式系统中。
  8. 扩展性:CAN总线可以与其他网络协议(如CAN FD、LIN、FlexRay等)集成,以满足更高的数据速率和功能需求。

CAN总线协议在车联网中发挥着关键作用,使得不同的汽车电子控制单元可以有效地协同工作,提升了汽车的智能化和自动化水平。

ICSim模拟

ICSim 包括一个带有车速表、门锁指示灯、转向信号灯和控制面板的仪表板。模拟控制器允许用户与模拟汽车网络进行交互,应用加速、刹车、控制门锁和转向信号。所以可以通过ICSim模拟汽车的行为,并抓取ICSim的can报文

安装ICSim环境,需要首先安装ICSim所需依赖库:

1
sudo apt install libsdl2-dev libsdl2-image-dev

要发送、接收和分析 CAN 包,我们需要 CAN 分析工具。Can-utils 是一组 Linux 实用程序,允许 Linux 与车载 CAN 网络进行通信。Can-utils 包含 4个我们经常使用的主要工具:

1
2
3
4
5
sudo apt install can-utils
#candump : 显示、过滤和记录CAN数据到文件。candump并不会解码数据。
#canplayer : 对记录的CAN数据进行重放。
#cansend : 发送CAN数据。
#cansniffer : 显示CAN数据并高亮显示变化的字节。

然后将ICSim下载下来

1
git clone https://github.com/zombiecraig/IcSim.git

切换到ICSim目录,执行”make”命令,就可以编译成功。编译成功后,先运行setup_vcan.sh文件创建vcan0网卡

然后执行./icsim vcan0

image-20240813100329415

接着另起一个窗口执行./controls vcan0

image-20240813100452654

下面,我们可以使用如下键位来操作控制器

1
2
3
4
5
6
7
8

上方向键加速
向左方向键左转
向右方向键右转
右shift+A/X开左车门(前/后)
右shift+B/Y开右前车门(前/后)
左shift+A/X关左车门(前/后)
左shift+B/Y关右前车门(前/后)

image-20240813100521151

我们可以使用”candump vcan0”来抓取CAN包裹流量,这时我们对控制器进行操作就会抓取相应命令的流量。如下图,左侧可以看到抓取的流量直接打印到屏幕上,显示流量时还是比较乱的

image-20240813100645439

这时我们可以使用”candump -l vcan0”,candump会自动将抓取的流量包放入candump-xxx.log文件中

image-20240813100726682

想要停止抓取可以按”ctrl+c”。查看一下抓取流量包,第一列,括号内的是时间戳,第二列中vcan0为我们的虚拟can接口。后面的是ID和数据,ID和数据以#号分割。

image-20240813100759574

candump可以监听并记录原始数据,会有很多对我们无用的数据。can-utils工具包中还有一款可以根据仲裁ID进行分组显示,并对变化的数据以红色显示,使我们比较容易分辨,它就是cansniffer。我们使用”cansniffer -c vcan0”命令来对vcan0进行监听。

image-20240813100858367

我们可以测试一下,当我按下左方向键时,仪表盘开始出现左转向的灯。同时左侧的流量包开始变动,但是不太好观察到哪里出现了变化。

image-20240813101429325

看网上的文章可以截图将ID这 一列固定在左侧,然后进行左转向的时候观察哪里发生了变化,这里就不详细截图了,直接说结果吧,最终发现”188#01000000”这一条是对转向进行操作的包裹,然后用同样的方法可以发现右转向是”188#02000000”,我们也可以使用cansend进行验证

1
cansend vcan0 188#01000000

image-20240813101951792

测试加油的指令时,上面的操作也可以比较方便的分析出加油指令ID和数据。这里不在重复讲解,上面的方法固然好用,但是也有不适用的时候,比如情况比较复杂,出现的ID变化或者较多。我们还有一种方法可以分析出对车辆的指令。我们首先使用”candump -l vcan0”进行流量抓取,抓取过程中进行加油门操作,然后松开油门,使其速度将为最低,最后停止抓取流量。
这样一来,整个的过程就可以抓取到log文件中。我们使用重放的发送,发送这个log文件中的所有内容。image-20240813102210584

命令如下,使用”canplayer -I candump-xxx.log”命令就会将抓取到的流量重新发送一边。发送后可以观察到我们上面加速和减速的整个过程,接下里我们就要使用二分法截取加速的部分。

image-20240813102303776

最后经过分析,发现”244#0000001xxx”即为加速指令。我们重放后,可以观察到加速现象。

Fuzzing

我们可以使用savvyCAN工具对can协议进行fuzz测试。

savvyCAN安装过程如下,

首先需要安装qt环境,这里我使用5.14.2版本(https://download.qt.io/archive/qt/5.14/5.14.2/)(savvyCAN环境要求>=5.14.0版本),下载".run"的在线安装程序,然后其赋予执行权限(chmod 755 qt-xxx.run),使用”./qt-xxx.run”进行安装,这里我安装完毕后的目录为”~/Qt5.14.2/5.14.2”。

SavvyCAN的安装

安装SavvyCAN是一个非常容易和简单的过程。您可以通过https://www.savvycan.com,下载适用于Linux、Mac和Windows平台的预编译二进制文件。

1
wget https://github.com/collin80/SavvyCAN/releases/download/V199.1/SavvyCAN-305dafd-x86_64.AppImage

下载appimage时,无需安装,直接运行相应的可执行文件即可!

1
2
chmod 777 SavvyCAN-305dafd-x86_64.AppImage
./SavvyCAN-305dafd-x86_64.AppImage

运行SavvyCAN后,我们可以看到:

image-20240813102925713

如果我们打算将SavvyCAN与ICSim搭配使用,所以,我们还需要安装qtserialbus。

安装qt5

1
wget https://download.qt.io/official_releases/qt/5.14/5.14.4/qt-opensource-linux-x64-5.14.2.run

下载qt5后,我们需要安装/运行它,具体命令如下所示:

1
2
chmod 777 qt-opensource-linux-x64-5.14.2.run
./qt-opensource-linux-x64-5.14.2.run

记下路由名称,因为后面会用到的。

一旦安装了qt5,接下来就得安装qtserialbus了,因为该软件没有包含在官方的Ubuntu存储库中,所以,我们还得自己动手,才能丰衣足食。

1
2
3
4
5
6
7
8
9
$ sudo apt install qtdeclarative5-dev qttools5-dev g ++

$ git clone https://github.com/qt/qtserialbus

$ cd qtserialbus

$ /home/youlin/Qt5.14.2/5.14.2/gcc_64/bin/qmake .

$ make

编译SavvyCAN

为了使用qtserialbus,我们还需要通过qmake编译之前下载的SavvyCAN的AppImage文件,具体命令如下所示:

1
$ git clone https://github.com/collin80/SavvyCAN $ cd SavvyCAN $ /home/y0g3sh/Qt5.14.2/5.14.2/gcc_64/bin/qmake CONFIG + = debug $ make

启动SavvyCAN

启动我们刚刚编译好的SavvyCAN,而不是我们之前下载的appimage文件。

请记住,如果您想在真正的汽车上运行它,而不是使用qtserialbus的话,则可以直接使用appimage文件,而不必费劲巴拉地编译SavvyCAN了。

这样就可以连接到我们的ICSim了

image-20240813103225736

savvyCAN工具部分功能与我们上面使用的can-utils工具相同,下图为RE tools中的sniffer功能,与我们上面操作使用的cansniffer功能相同,但是savvyCAN中变化的数据使用了颜色进行标记,更便于我们辨识数据。

image-20240813103332995

savvyCAN工具的重点即为fuzz功能,点击”Send Frames-fuzzing”就会出现下图中的fuzzing window,这个窗口中的功能适用于我们想要fuzz否个ID范围,并且可以自定义fuzz的数据。

下图中为我测试0x244 ID的fuzz效果
image-20240813103514377


车联网can总线协议初探
http://blogyoulin.top/2024/08/13/车联网can总线协议初探/
Author
John Doe
Posted on
August 13, 2024
Licensed under