4、环境搭建:安装Python、安装必要的库(如python-can、udsoncan)、配置网络接口

好,咱们正式开始动手了。

这一章,说白了就是“磨刀”。刀磨不快,后面砍柴肯定费劲。我见过不少同行,上来就写代码,结果连CAN报文都发不出去,最后发现是库没装对,或者网卡没配好。嗯,咱们别走这个弯路。

4.1 安装Python环境

我个人习惯用Python 3.8以上的版本。为什么?因为python-can和udsoncan这两个库,在3.8上跑得最稳。我曾经在Python 3.6上踩过坑,有个异步调用的bug,折腾了我一下午。

安装步骤很简单:

  1. 去Python官网下载安装包(别去第三方网站,我吃过亏)。
  2. 安装时记得勾选“Add Python to PATH”。
  3. 打开命令行,输入 python --version 确认安装成功。
小技巧: 我建议用虚拟环境。每个项目独立一套库,互不干扰。命令是 python -m venv doip_env,然后激活它。

4.2 安装必要的库

这里有两个核心库:python-canudsoncan。一个管底层通信,一个管上层协议解析。

安装命令:

pip install python-can
pip install udsoncan

你可能会问:“就这两个?” 嗯,其实还有。比如 netifaces 用来查看网络接口,psutil 用来监控进程。但我建议你先装这两个核心的,后面用到什么再补。

我记得有一次,我在客户现场调试,发现udsoncan死活装不上。后来一看,是pip版本太旧了。先升级一下:

python -m pip install --upgrade pip
注意: 如果你用的是Linux,可能需要先装 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会改端口号,你得看它的诊断描述文档。

避坑指南: 我曾经遇到过一台ECU,它的IP是动态分配的。每次上电都不一样。后来我写了个脚本,先发一个广播包,等它回复,再拿到真实IP。这个后面会细讲。

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包给拦了。

小技巧: 用Wireshark抓个包看看。如果能看到DoIP的报文发出去,但没收到回复,那问题大概率在ECU那边。如果连报文都看不到,那就是你这边没配好。

嗯,环境搭建就这些。说白了就是三步:装Python、装库、配网卡。别嫌简单,基础打牢了,后面写代码才顺手。