车联网can总线协议初探
can总线协议
CAN总线协议(Controller Area Network)是一种用于车联网的串行通信协议。它最初由德国Bosch公司在20世纪80年代为汽车电子控制系统而开发,旨在解决不同电子控制单元(ECU)之间的通信问题。以下是CAN总线协议的一些关键特点:
- 高可靠性和实时性:CAN协议支持快速的数据传输和错误检测与纠正,确保了通信的高可靠性和实时性。
- 多主架构:CAN总线是一种多主(multi-master)架构,这意味着任何节点都可以在总线上发送消息,无需中央控制器。
- 短帧格式:CAN总线使用短帧格式(8字节的数据),这使得通信效率高,且可以满足汽车控制系统对实时性的要求。
- 错误检测机制:CAN协议具有多种错误检测机制,如位填充、帧校验、应答校验和错误检测码,以确保数据传输的完整性和可靠性。
- 消息优先级:CAN总线协议使用消息标识符来确定优先级。较低数值的标识符拥有更高的优先级,这使得紧急信息可以优先传输。
- 速度和距离:CAN协议支持的最大传输速率可达1Mbps,但速率和距离成反比。典型的汽车应用中,CAN总线的长度可达几百米。
- 应用广泛:除了汽车领域,CAN总线协议还广泛应用于工业自动化、医疗设备和其他需要可靠通信的嵌入式系统中。
- 扩展性:CAN总线可以与其他网络协议(如CAN FD、LIN、FlexRay等)集成,以满足更高的数据速率和功能需求。
CAN总线协议在车联网中发挥着关键作用,使得不同的汽车电子控制单元可以有效地协同工作,提升了汽车的智能化和自动化水平。
ICSim模拟
ICSim 包括一个带有车速表、门锁指示灯、转向信号灯和控制面板的仪表板。模拟控制器允许用户与模拟汽车网络进行交互,应用加速、刹车、控制门锁和转向信号。所以可以通过ICSim模拟汽车的行为,并抓取ICSim的can报文
安装ICSim环境,需要首先安装ICSim所需依赖库:
1 |
|
要发送、接收和分析 CAN 包,我们需要 CAN 分析工具。Can-utils 是一组 Linux 实用程序,允许 Linux 与车载 CAN 网络进行通信。Can-utils 包含 4个我们经常使用的主要工具:
1 |
|
然后将ICSim下载下来
1 |
|
切换到ICSim目录,执行”make”命令,就可以编译成功。编译成功后,先运行setup_vcan.sh文件创建vcan0网卡
然后执行./icsim vcan0
接着另起一个窗口执行./controls vcan0
下面,我们可以使用如下键位来操作控制器
1 |
|
我们可以使用”candump vcan0”来抓取CAN包裹流量,这时我们对控制器进行操作就会抓取相应命令的流量。如下图,左侧可以看到抓取的流量直接打印到屏幕上,显示流量时还是比较乱的
这时我们可以使用”candump -l vcan0”,candump会自动将抓取的流量包放入candump-xxx.log文件中
想要停止抓取可以按”ctrl+c”。查看一下抓取流量包,第一列,括号内的是时间戳,第二列中vcan0为我们的虚拟can接口。后面的是ID和数据,ID和数据以#号分割。
candump可以监听并记录原始数据,会有很多对我们无用的数据。can-utils工具包中还有一款可以根据仲裁ID进行分组显示,并对变化的数据以红色显示,使我们比较容易分辨,它就是cansniffer。我们使用”cansniffer -c vcan0”命令来对vcan0进行监听。
我们可以测试一下,当我按下左方向键时,仪表盘开始出现左转向的灯。同时左侧的流量包开始变动,但是不太好观察到哪里出现了变化。
看网上的文章可以截图将ID这 一列固定在左侧,然后进行左转向的时候观察哪里发生了变化,这里就不详细截图了,直接说结果吧,最终发现”188#01000000”这一条是对转向进行操作的包裹,然后用同样的方法可以发现右转向是”188#02000000”,我们也可以使用cansend进行验证
1 |
|
测试加油的指令时,上面的操作也可以比较方便的分析出加油指令ID和数据。这里不在重复讲解,上面的方法固然好用,但是也有不适用的时候,比如情况比较复杂,出现的ID变化或者较多。我们还有一种方法可以分析出对车辆的指令。我们首先使用”candump -l vcan0”进行流量抓取,抓取过程中进行加油门操作,然后松开油门,使其速度将为最低,最后停止抓取流量。
这样一来,整个的过程就可以抓取到log文件中。我们使用重放的发送,发送这个log文件中的所有内容。
命令如下,使用”canplayer -I candump-xxx.log”命令就会将抓取到的流量重新发送一边。发送后可以观察到我们上面加速和减速的整个过程,接下里我们就要使用二分法截取加速的部分。
最后经过分析,发现”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 |
|
下载appimage时,无需安装,直接运行相应的可执行文件即可!
1 |
|
运行SavvyCAN后,我们可以看到:
如果我们打算将SavvyCAN与ICSim搭配使用,所以,我们还需要安装qtserialbus。
安装qt5
1 |
|
下载qt5后,我们需要安装/运行它,具体命令如下所示:
1 |
|
记下路由名称,因为后面会用到的。
一旦安装了qt5,接下来就得安装qtserialbus了,因为该软件没有包含在官方的Ubuntu存储库中,所以,我们还得自己动手,才能丰衣足食。
1 |
|
编译SavvyCAN
为了使用qtserialbus,我们还需要通过qmake编译之前下载的SavvyCAN的AppImage文件,具体命令如下所示:
1 |
|
启动SavvyCAN
启动我们刚刚编译好的SavvyCAN,而不是我们之前下载的appimage文件。
请记住,如果您想在真正的汽车上运行它,而不是使用qtserialbus的话,则可以直接使用appimage文件,而不必费劲巴拉地编译SavvyCAN了。
这样就可以连接到我们的ICSim了
savvyCAN工具部分功能与我们上面使用的can-utils工具相同,下图为RE tools中的sniffer功能,与我们上面操作使用的cansniffer功能相同,但是savvyCAN中变化的数据使用了颜色进行标记,更便于我们辨识数据。
savvyCAN工具的重点即为fuzz功能,点击”Send Frames-fuzzing”就会出现下图中的fuzzing window,这个窗口中的功能适用于我们想要fuzz否个ID范围,并且可以自定义fuzz的数据。
下图中为我测试0x244 ID的fuzz效果