4、环境搭建:安装Python、安装必要的库(如python-can、udsoncan)、配置网络接口
好,咱们正式开始动手了。
这一章,说白了就是“磨刀”。刀磨不快,后面砍柴肯定费劲。我见过不少同行,上来就写代码,结果连CAN报文都发不出去,最后发现是库没装对,或者网卡没配好。嗯,咱们别走这个弯路。
4.1 安装Python环境
我个人习惯用Python 3.8以上的版本。为什么?因为python-can和udsoncan这两个库,在3.8上跑得最稳。我曾经在Python 3.6上踩过坑,有个异步调用的bug,折腾了我一下午。
安装步骤很简单:
- 去Python官网下载安装包(别去第三方网站,我吃过亏)。
- 安装时记得勾选“Add Python to PATH”。
- 打开命令行,输入
python --version确认安装成功。
python -m venv doip_env,然后激活它。
4.2 安装必要的库
这里有两个核心库:python-can 和 udsoncan。一个管底层通信,一个管上层协议解析。
安装命令:
pip install python-can
pip install udsoncan
你可能会问:“就这两个?” 嗯,其实还有。比如 netifaces 用来查看网络接口,psutil 用来监控进程。但我建议你先装这两个核心的,后面用到什么再补。
我记得有一次,我在客户现场调试,发现udsoncan死活装不上。后来一看,是pip版本太旧了。先升级一下:
python -m pip install --upgrade pip
python3-dev 或者 libpcap-dev。不然编译时会报错。我曾经在Ubuntu 20.04上栽过这个跟头。
4.3 配置网络接口
DoIP走的是以太网,不是CAN总线。所以你得先搞清楚,你的电脑用哪张网卡跟ECU通信。
我个人习惯用 ipconfig(Windows)或者 ifconfig(Linux)看一眼。找到那个IP地址是169.254.x.x或者192.168.x.x的网卡,记下它的名字。
举个例子,Windows下可能是“以太网适配器 2”,Linux下可能是“eth0”或“enp0s3”。
然后,在代码里指定它:
import can
# 指定网络接口
bus = can.interface.Bus(
interface='udp_multicast',
channel='192.168.0.1:13400',
receive_own_messages=False
)
这里有个坑:channel 参数填的是ECU的IP和端口。默认DoIP端口是13400。但有些ECU会改端口号,你得看它的诊断描述文档。
4.4 验证环境是否正常
装完了,配好了,怎么知道能不能用?
写个简单的测试脚本:
import can
bus = can.interface.Bus(
interface='udp_multicast',
channel='192.168.0.1:13400'
)
# 发送一个诊断请求(比如读取VIN)
msg = can.Message(
arbitration_id=0x6E1,
data=[0x22, 0xF1, 0x90],
is_extended_id=False
)
bus.send(msg)
# 接收响应
response = bus.recv(timeout=2)
if response:
print(f"收到响应: {response.data.hex()}")
else:
print("超时,没收到响应")
如果打印出了响应数据,恭喜你,环境搭好了。如果超时,别急。先检查网线,再检查IP,最后检查防火墙。我遇到过最奇葩的一次,是Windows防火墙把UDP包给拦了。
嗯,环境搭建就这些。说白了就是三步:装Python、装库、配网卡。别嫌简单,基础打牢了,后面写代码才顺手。