1. 项目概述
"Liunx + can simulation + wireshark"这个技术组合在汽车电子、工业控制等领域有着广泛的应用场景。作为一名在嵌入式系统领域工作多年的工程师,我经常需要搭建这样的测试环境来验证CAN总线通信协议、分析网络数据包以及调试硬件设备间的交互问题。
这个实操手册系列已经进行到第5期,今天我将分享一个完整的CAN总线仿真与抓包分析环境搭建方案。不同于官方文档的抽象描述,我会结合自己踩过的坑和实战经验,手把手带你从零开始构建这个技术栈。
2. 环境准备与工具链配置
2.1 Linux系统选择与配置
推荐使用Ubuntu 18.04/20.04 LTS版本,这两个版本对CAN总线工具链的支持最为完善。安装完成后需要执行以下基础配置:
bash复制sudo apt update
sudo apt upgrade -y
sudo apt install build-essential linux-headers-$(uname -r)
注意:内核头文件必须与当前运行的内核版本完全匹配,否则后续驱动编译会失败。使用
uname -r命令可以查看当前内核版本。
2.2 CAN工具链安装
完整的CAN相关工具链包含以下组件:
bash复制sudo apt install can-utils libsocketcan-dev libsocketcan2
关键工具说明:
candump:实时显示CAN总线数据cansend:向CAN总线发送数据帧canplayer:回放记录的CAN数据cangen:生成随机CAN数据用于测试
2.3 Wireshark安装与CAN插件配置
bash复制sudo apt install wireshark
sudo dpkg-reconfigure wireshark-common # 选择允许非root用户抓包
安装完成后需要为Wireshark添加CAN协议支持:
- 下载最新版
wireshark-can插件源码 - 编译安装插件:
bash复制./autogen.sh
./configure
make
sudo make install
3. CAN虚拟接口创建与配置
3.1 虚拟CAN接口创建
Linux内核自带了虚拟CAN驱动模块,加载方式如下:
bash复制sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
验证接口状态:
bash复制ip -d link show vcan0
正常输出应显示vcan0: <NOARP,UP,LOWER_UP>状态。
3.2 CAN总线参数配置(可选)
对于需要模拟真实CAN总线特性的场景,可以设置以下参数:
bash复制sudo ip link set vcan0 type can bitrate 500000
sudo ip link set up vcan0
常用bitrate值:
- 汽车CAN:500kbps
- 工业CAN:250kbps/1Mbps
- CAN FD:2Mbps以上
4. CAN数据生成与捕获实战
4.1 使用cangen生成测试数据
bash复制cangen vcan0 -g 100 -I 123 -L 8 -D 1122334455667788
参数说明:
-g 100:每100ms发送一帧-I 123:CAN ID为0x123-L 8:数据长度8字节-D:十六进制数据内容
4.2 使用candump实时监控
新开终端执行:
bash复制candump vcan0
将看到类似输出:
code复制vcan0 123 [8] 11 22 33 44 55 66 77 88
4.3 Wireshark抓包分析
启动Wireshark并选择vcan0接口:
bash复制wireshark -i vcan0 -k
抓包界面操作技巧:
- 在过滤栏输入
can只显示CAN协议数据 - 右键数据包 -> "Decode As..." -> 选择CAN协议
- 使用统计功能分析报文频率和ID分布
5. 高级应用场景
5.1 CAN网关模拟
创建两个虚拟CAN接口并建立桥接:
bash复制sudo ip link add dev vcan0 type vcan
sudo ip link add dev vcan1 type vcan
sudo ip link set up vcan0
sudo ip link set up vcan1
# 使用can-gw建立桥接
sudo modprobe can-gw
sudo cangw -A -s vcan0 -d vcan1 -e
5.2 CAN数据记录与回放
记录CAN数据到文件:
bash复制candump -l vcan0
生成的文件可以用canplayer回放:
bash复制canplayer -I candump-2023-07-20_123456.log
5.3 CAN FD支持
对于需要CAN FD的场合,加载相应驱动:
bash复制sudo modprobe can_raw
sudo modprobe can_dev
sudo ip link add dev vcan0 type vcan fd on
sudo ip link set up vcan0
6. 常见问题排查
6.1 Wireshark无法识别CAN接口
症状:Wireshark接口列表中没有vcan0
解决方案:
- 检查当前用户是否在wireshark组:
bash复制groups | grep wireshark
- 如果没有,添加用户到组:
bash复制sudo usermod -a -G wireshark $USER
- 重新登录生效
6.2 CAN数据发送失败
错误信息:write: No buffer space available
解决方法:
bash复制sudo ip link set vcan0 txqueuelen 1000
6.3 高负载下丢包问题
优化方案:
- 提高socket缓冲区大小:
bash复制sudo sysctl -w net.core.rmem_max=262144
sudo sysctl -w net.core.wmem_max=262144
- 使用RT_PREEMPT内核降低延迟
7. 性能优化技巧
- 降低系统延迟:
bash复制sudo apt install linux-lowlatency
sudo apt install rt-tests
cyclictest -m -p90 -n -h100 -q -D 1m
- 优先级设置:
bash复制chrt -f 99 candump vcan0
- CPU隔离:
bash复制sudo systemctl set-property --runtime -- user.slice AllowedCPUs=2-3
sudo systemctl set-property --runtime -- system.slice AllowedCPUs=0-1
在实际项目中,这个技术栈帮我解决过多个棘手问题。有一次客户报告CAN通信偶发失败,我们通过这个环境重现了问题,最终发现是总线负载率超过70%导致的仲裁失败。通过Wireshark的统计功能,我们很快定位到某个ECU异常高频发送诊断报文的情况。