1. 项目概述
"Liunx + can simulation + wireshark"这个技术组合在工业通信和汽车电子领域有着广泛的应用场景。作为一名长期从事嵌入式系统开发的工程师,我经常需要搭建这样的环境来调试CAN总线通信问题。这个组合之所以强大,是因为它实现了从底层硬件模拟到上层协议分析的完整闭环。
Linux系统提供了稳定可靠的运行环境,can-utils工具包实现了CAN接口的配置和通信,而Wireshark则是网络协议分析的事实标准工具。三者结合可以完成从总线数据生成、传输到捕获分析的全流程工作。在实际项目中,这种组合特别适合以下场景:
- 汽车ECU开发时的通信验证
- 工业设备CAN总线故障诊断
- 嵌入式系统通信协议逆向工程
- 教学演示环境搭建
2. 环境准备与工具安装
2.1 Linux系统选择与配置
对于CAN模拟和分析工作,我推荐使用Ubuntu 20.04 LTS或更新版本。这个发行版对CAN工具链的支持最为完善,社区资源也最丰富。以下是系统配置的关键步骤:
- 更新系统软件源:
bash复制sudo apt update && sudo apt upgrade -y
- 安装必要的开发工具:
bash复制sudo apt install build-essential git cmake -y
- 配置用户权限(将当前用户加入dialout组以便访问串口设备):
bash复制sudo usermod -a -G dialout $USER
注意:执行用户组变更后需要重新登录才能生效
2.2 CAN工具链安装
Linux下的CAN支持主要通过SocketCAN实现,这是内核原生支持的CAN协议栈。安装步骤如下:
- 安装can-utils工具包:
bash复制sudo apt install can-utils -y
- 验证内核模块:
bash复制lsmod | grep can
如果没有输出,需要加载相关内核模块:
bash复制sudo modprobe can
sudo modprobe can_raw
sudo modprobe vcan
- 创建持久化配置(避免每次重启都手动加载模块):
bash复制echo "can" | sudo tee -a /etc/modules
echo "can_raw" | sudo tee -a /etc/modules
echo "vcan" | sudo tee -a /etc/modules
2.3 Wireshark安装与配置
Wireshark的安装相对简单,但需要注意一些权限配置:
- 安装Wireshark:
bash复制sudo apt install wireshark -y
- 配置非root用户抓包权限:
bash复制sudo dpkg-reconfigure wireshark-common
选择"Yes"允许非root用户抓包
- 将当前用户加入wireshark组:
bash复制sudo usermod -a -G wireshark $USER
- 安装CAN协议解析插件:
bash复制sudo apt install wireshark-doc wireshark-dev -y
提示:安装完成后需要重新登录使组权限生效
3. CAN模拟环境搭建
3.1 虚拟CAN接口创建
在实际没有物理CAN设备的情况下,我们可以使用Linux的虚拟CAN接口:
- 创建虚拟CAN接口:
bash复制sudo ip link add dev vcan0 type vcan
- 激活接口:
bash复制sudo ip link set up vcan0
- 验证接口状态:
bash复制ip -d link show vcan0
正常输出应该显示"state UP"和"NOARP"标志。
3.2 CAN数据发送与接收测试
使用can-utils工具包中的工具进行基本通信测试:
- 在一个终端启动接收:
bash复制candump vcan0
- 在另一个终端发送测试数据:
bash复制cansend vcan0 123#1122334455667788
在接收终端应该能看到类似如下的输出:
code复制vcan0 123 [8] 11 22 33 44 55 66 77 88
3.3 高级CAN模拟技巧
对于更复杂的模拟场景,可以考虑以下方法:
- 使用cangen生成随机CAN数据:
bash复制cangen vcan0 -v -I i -L 8 -D r -g 100
参数说明:
- -v:详细输出
- -I i:使用递增ID
- -L 8:数据长度8字节
- -D r:随机数据
- -g 100:间隔100ms
- 录制和回放CAN数据:
bash复制# 录制数据到文件
candump -l vcan0
# 回放数据
canplayer -I candump.log
4. Wireshark抓包与分析
4.1 基本抓包配置
- 启动Wireshark:
bash复制wireshark
- 选择捕获接口:
- 在接口列表中找到"vcan0"或对应的物理CAN接口
- 点击"Start"开始捕获
- 基本过滤技巧:
can:只显示CAN帧can.id == 0x123:过滤特定ID的帧can.len == 8:过滤数据长度为8的帧
4.2 高级分析技巧
- 协议解码:
Wireshark可以解析多种基于CAN的高层协议,如:
- CANopen
- J1939
- ISO-TP
- 统计功能:
- "Statistics" → "Protocol Hierarchy":查看协议分布
- "Statistics" → "Conversations":查看通信对端统计
- "Statistics" → "IO Graphs":绘制流量图表
- 自定义着色规则:
通过"View" → "Coloring Rules"可以设置特定条件的报文颜色,例如:
- 错误帧
- 特定ID范围的帧
- 特定数据模式的帧
4.3 典型应用场景分析
场景1:CAN总线负载分析
- 使用IO Graphs绘制总线负载
- 设置过滤条件:
can - 调整Y轴单位为"Bits/Tick"
- 观察峰值负载是否超过总线容量(典型CAN总线最大1Mbps)
场景2:异常帧检测
- 过滤错误帧:
can.flags.error - 分析错误类型(位错误、格式错误等)
- 结合时间戳分析错误发生规律
场景3:协议逆向工程
- 捕获未知协议的通信数据
- 通过"Follow CAN Stream"功能重组数据流
- 分析ID分配规律和数据字段含义
5. 常见问题与解决方案
5.1 接口不可用问题
问题现象:
code复制SIOCSIFFLAGS: Operation not permitted
解决方案:
- 检查用户是否具有足够权限
- 确认内核模块已加载:
bash复制lsmod | grep can
- 尝试使用sudo执行命令
5.2 Wireshark无法捕获CAN数据
问题现象:
Wireshark接口列表中看不到CAN接口
解决方案:
- 确认安装了libpcap开发包:
bash复制sudo apt install libpcap-dev
- 重新编译Wireshark:
bash复制sudo apt-get install build-essential \
qt5-default qttools5-dev-tools \
libqt5svg5-dev qtmultimedia5-dev \
libpcap-dev bison flex
./configure
make
sudo make install
5.3 数据发送接收异常
问题现象:
发送的数据与接收的不一致
解决方案:
- 检查CAN接口配置:
bash复制ip -details link show vcan0
- 确认波特率设置(物理接口):
bash复制sudo ip link set can0 type can bitrate 500000
- 检查终端电阻(物理接口需要120Ω终端电阻)
6. 性能优化与高级技巧
6.1 提高捕获效率
- 使用捕获过滤器减少数据量:
bash复制wireshark -f "can.id >= 0x100 && can.id <= 0x200"
- 调整缓冲区大小:
bash复制sudo sysctl -w net.core.rmem_max=2097152
sudo sysctl -w net.core.wmem_max=2097152
- 使用dumpcap代替直接捕获:
bash复制dumpcap -i vcan0 -w capture.pcapng
6.2 自动化测试脚本
结合Shell脚本实现自动化测试:
bash复制#!/bin/bash
# 设置虚拟CAN接口
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
# 启动后台捕获
dumpcap -i vcan0 -w test.pcapng &
PID=$!
# 发送测试数据
for i in {1..100}; do
cansend vcan0 ${i}#$(printf "%08x" $RANDOM)
sleep 0.1
done
# 停止捕获
kill $PID
# 分析结果
wireshark test.pcapng
6.3 物理接口扩展
当需要连接真实CAN设备时:
- 安装USB-CAN适配器驱动(以周立功CAN为例):
bash复制sudo apt install can-isotp can-utils
- 配置物理接口:
bash复制sudo ip link set can0 type can bitrate 500000
sudo ip link set up can0
- 验证连接:
bash复制candump can0
在实际项目中,我发现这个技术组合特别适合以下复杂场景:
- 汽车ECU的自动化测试
- 工业设备通信协议兼容性测试
- 嵌入式系统通信故障诊断
- 教学和研究中的协议分析
通过合理配置和脚本化,可以构建出高效的开发和测试环境,大幅提高工作效率。
