前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】SocketCAN设备调试与开发(模拟器)

【Linux】SocketCAN设备调试与开发(模拟器)

作者头像
DevFrank
发布2024-07-24 15:00:08
580
发布2024-07-24 15:00:08
举报
文章被收录于专栏:C++开发学习交流

大家都知道,车辆底盘系统是通过CAN进行通信的,而常见的有USB-CAN和SocketCAN两种,前者是通过USB口接入PC的,代表的有周立功、创芯等(较便宜),后者是通过网口接入PC的,代表的有Kvaser。

USB-CAN一般Windows端的资料会多些,有做好的上位机和Qt、C#、MATLAB等二次开发接口,但Linux的支持只有一个测试样例,需要自己去写;SocketCAN对全平台支持都很好,除了Windows的丰富资料外,在Linux端只需安装net-tools和SocketCAN驱动,然后就可以使用utils的命令去控制。

CAN认识

CAN 是控制器局域网络(Controller Area Network)的简称,是实现汽车所有或部分部件之间通信的中枢神经系统,由以研发和生产汽车电子产品著称的德国 BOSCH 公司开发并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。在使用 CAN 作为车内通信系统之前,汽车制造商使用的是点对点布线系统,当汽车内部电子单元越来越多时,这种布线系统会显得特别庞大且维护成本太高,后来通过使用 CAN 来解决这个问题。

CAN 总线可以被认为是一个嘈杂、拥挤、慢速版的以太网局域网,只是流量是 UDP 而不是 TCP。值得注意的是,并不是所有的汽车控制系统都使用 CAN,而且 CAN 不仅仅是汽车系统中使用的通信协议,还可能有其它协议,如蓝牙、LIN、MOST、FlexRay等。在实际场景中,CAN 并不是唯一的攻击面,可能还存在很多其它的攻击面。

ICSim总线设备模拟器

参考了这篇,补充完善一些内容。

对于没有SocketCAN设备的童鞋来说,ICSim为我们研究开发提供了一种可能,同时可以练习can-utils操作,另外,使用模拟器可以隔离硬件环境,防止硬件受损。

简单来说,ICSim(Instrument Cluster Simulator for SocketCAN)是一个开源的车辆仪表模拟器,该模拟器包含controls和ICSim两个模块,其中controls负责生成模拟的车辆数据,以CAN报文的方式发送给虚拟的CAN接口,ICSim从虚拟CAN接口(vcan0)读取CAN报文,并在仪表上更新对应零件的状态,如车速、转向、车门状态等等。

ICSim安装:

代码语言:javascript
复制
sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils
git clone https://github.com/zombieCraig/ICSim.git

ICSim配置和编译:

代码语言:javascript
复制
./setup_vcan.sh
make

配置完后会生成两个可执行文件:

在这里插入图片描述
在这里插入图片描述

ICSim启动:

代码语言:javascript
复制
./icsim vcan0
./controls vcan0

会生成汽车模拟仪表盘和控制面板:

车门测试

车门状态报文一直在定时发送,但每当按下一次开门按钮,报文中的数据(DATA)会发生一次变化。通过变化找到CAN报文(CAN逆向)。

转向灯测试

转向灯报文也是一直在定时发送,当按下按钮,报文发生一次变化。通过变化找到CAN报文(CAN逆向)。

实车CAN测试

通过OBD接口测试。

CAN-Utils

Linux 内核中内置了 SocketCAN、can-utils、vcan等工具链,作用是发送和接收 CAN 数据,对数据进行编码或解码。

can-utils 是一套 Linux 特有的实用工具,它可以让 Linux 与车辆上的 CAN 网络进行通信,为了发送、接收和分析 CAN 数据包,需要安装 CAN utils:

代码语言:javascript
复制
sudo apt-get install can-utils

canutils 主要包括 5 个常用的工具:

  1. cansniffer 用于嗅探数据包(只显示正在变化的报文)(cansniffer -c can0)
  2. cansend 发送一条报文数据(cansend can0 0C9#8021C0071B101000)
  3. candump 转储所有接收的数据包(candump can0)
  4. canplayer 重播 CAN 数据包
  5. cangen 随机生成 CAN 数据包

回环测试(自发自收):

代码语言:javascript
复制
candump can0&
cansend can0 123#0011223344556677

在实车中,将CAN设备插入汽车的OBD-II端口和计算机的USB端口。在Linux提示符中运行以下命令启动CAN接口:

代码语言:javascript
复制
sudo ip link set can0 up type can bitrate 500000

这将以500 kbps的比特率打开can0接口(如果你只有一个设备连接,总是can0),这是标准的。

Linux通过SocketCAN在内核中内置CAN支持,使得编写自己的附加程序变得很容易。你可以与can总线交互,就像你与任何其他网络交互一样,即通过套接字socket。

Wireshark

Wireshark是一个网络测试工具,支持Linux。安装启动如下:

代码语言:javascript
复制
sudo apt-get install wireshark
sudo wireshark

启动后,可以读取对应网卡:

SavvyCAN

前面介绍了can-utils和wireshark,下面介绍一种更加专业、好用的CAN分析工具。

SavvyCAN 是一个 CAN 总线逆向和捕获工具提供了更多额外的功能,它除了能够轻轻的浏览、过滤数据包和仲裁 ID,还可以在 CAN 帧上执行脚本、Fuzzing,以及内置了几个逆向工具。

安装SaccyCAN(二进制文件):

代码语言:javascript
复制
wget https://github.com/collin80/SavvyCAN/releases/download/V199.1/SavvyCAN-305dafd-x86_64.AppImage
chmod 744 SavvyCAN-305dafd-x86_64.AppImage
./SavvyCAN-305dafd-x86_64.AppImage

启动后如下:

以上是打开了一个CAN Log文件。要想获取ICSim的数据,会发现二进制版的SavvyCAN没有开启接口:

在这里插入图片描述
在这里插入图片描述

因此需要编译源代码获得完整功能(首先安装Qt5):

代码语言:javascript
复制
git clone https://github.com/collin80/SavvyCAN
cd SavvyCAN
/opt/Qt5.12.4/5.12.4/gcc_64/bin/qmake CONFIG+=debug
make
./SavvyCAN

参考了这个博客

对汽车安全有兴趣的可以多了解一下,最好有机会去采集一下实车数据。

以上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CAN认识
  • ICSim总线设备模拟器
    • 车门测试
      • 转向灯测试
        • 实车CAN测试
        • CAN-Utils
        • Wireshark
        • SavvyCAN
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档