macOS native CLI for ZLG USBCANFD-100U-mini CAN FD analyzer
Project description
ZLG USBCANFD-100U-mini macOS 驱动方案
在 Mac (Apple Silicon) 上使用周立功 USBCANFD-100U-mini CAN FD 分析仪。 通过逆向工程实现了纯 Python 原生驱动,无需 Docker / VM / Windows。
方案一:原生驱动(推荐)
架构
Mac (Python + pyusb)
│
├── AES-128 认证握手
├── UCFD_CMD 协议 (EP01 OUT → EP81 IN)
└── CANFD 数据流 (EP83 IN)
│
USBCANFD-100U-mini (USB)
│
CAN FD 总线
纯 Python 直接通过 pyusb 操控 USB 设备,无中间层。
前提条件
brew install libusb
pip install pyusb pycryptodome
使用方法
# 插入 USBCANFD-100U-mini
cd ~/code/zlg-proxy
python3 zlg_native.py
核心文件
| 文件 | 说明 |
|---|---|
zlg_native.py |
原生驱动,直接 pyusb 收发 CANFD |
初始化序列(关键顺序)
cmd(0x03, 0, aes_encrypt(random_16)) # 1. AES 认证
cmd(0x13, 0) # 2. Reset
cmd(0x01, 0) # 3. 启用数据转发 ← 关键!
cmd(0x06, 0) # 4. 清空缓冲
cmd(0x15, 0, u32(1)) # 5. 使能 120Ω 终端电阻
cmd(0x11, 0, can_config) # 6. InitCAN
cmd(0x12, 0) # 7. StartCAN
# 然后从 EP83 IN 持续读取 CANFD 数据包
命令发送方式
# 每个命令拆成两次 EP01 写入:
dev.write(0x01, header_8bytes) # 8B: magic + cmd_id + ch + idx + data_len
dev.write(0x01, padded_1024bytes) # 1024B: data + CRC16 + 零填充
# 响应从 EP81 读取:
response = dev.read(0x81, 4096) # 12B 头 + data + 2B CRC
方案二:Docker 桥接
当需要调用 ZLG 官方 VCI API(VCI_Transmit、VCI_ReceiveFD 等)时使用。
架构
┌─────────────────────────────────────────────────────┐
│ Mac (ARM) │
│ │
│ ┌───────────────┐ TCP:19876 ┌──────────────┐ │
│ │ Docker x86_64 │◄────────────►│ USB 代理 │ │
│ │ │ │ usb_proxy.py │ │
│ │ libusbcanfd.so │ │ ↕ pyusb │ │
│ │ (ZLG官方库) │ │ ↕ │ │
│ │ ↕ │ │ USBCANFD │ │
│ │ libusb_shim.so │ │ -100U-mini │ │
│ │ (TCP转发) │ └──────────────┘ │
│ └───────────────┘ │
└─────────────────────────────────────────────────────┘
使用方法
# 终端1: 启动 USB 代理
python3 usb_proxy.py
# 终端2: 构建并运行
docker build -t zlg-can .
docker run --rm --platform linux/amd64 \
-e PROXY_HOST=host.docker.internal \
-e PROXY_PORT=19876 \
zlg-can
文件说明
| 文件 | 说明 |
|---|---|
usb_proxy.py |
Mac 端 USB-over-TCP 代理 |
libusb_shim.c |
假 libusb-1.0.so,截获 USB 调用转发到代理 |
zlg_test.py |
Docker 内测试脚本,调用 ZLG VCI API |
Dockerfile |
x86_64 Linux 容器构建文件 |
library/ |
ZLG 官方驱动库 |
CAN FD 配置参数
设备类型: 43 (ZCAN_USBCANFD_MINI)
1Mbps 仲裁域
clock = 60000000 (60MHz)
mode = 0 (Normal + ISO CANFD)
tseg1 = 22, tseg2 = 5, sjw = 3, smp = 0, brp = 1
5Mbps 数据域
tseg1 = 7, tseg2 = 2, sjw = 2, smp = 0, brp = 0
注意:brp=0 表示预分频=1,ZLG API 中 brp 值 = 实际预分频 - 1
逆向工程协议文档
USB 端点
| 端点 | 方向 | 用途 |
|---|---|---|
| EP 0x01 | OUT | 命令发送(8B 头 + 1024B 数据) |
| EP 0x81 | IN | 命令响应(12B 头 + data + CRC) |
| EP 0x02 | OUT | CAN 帧发送(Send 通道) |
| EP 0x82 | IN | 8B ACK(回显端点) |
| EP 0x83 | IN | CAN FD 数据接收(UCFD 格式) |
UCFD_CMD 命令格式
偏移 大小 说明
0 1B 0x55 (magic)
1 1B cmd_id
2 1B channel
3 1B sync_idx (递增)
4-7 4B data_len (u32 LE)
8+ NB data
8+N 2B CRC16-IBM
发送方式:拆成两次 EP01 写入
- 8 字节头部
- 1024 字节数据块(data + CRC + 零填充到 1024)
命令 ID 表
| ID | 功能 | 数据 |
|---|---|---|
| 0x01 | 启用数据转发 | 无 |
| 0x03 | AES-128 认证 | 16B 加密数据 |
| 0x06 | 清空缓冲区 | 无 |
| 0x11 | InitCAN | 20B 配置结构 |
| 0x12 | StartCAN | 无 |
| 0x13 | ResetCAN | 无 |
| 0x15 | SetReference | 4B u32 值 |
| 0x41 | ReadBoardInfo | 无 |
| 0x44 | ReadCANStatus | 无 |
AES-128-ECB 认证
- 密钥:
3f7d935c80a3443fcdb4280614ef9d05 - 流程: 生成 16B 随机数 → AES 加密 → 作为 cmd=0x03 的数据发送
- 设备验证后返回 16B 加密响应
CRC16-IBM
- 多项式: 0x8005
- 初始值: 0xFFFF
- 反射模式(LSB first)
- 覆盖范围: UCFD_CMD 头部 + 数据(不含 CRC 本身)
EP83 CAN 数据包格式
偏移 大小 说明
0 1B 0x55 (magic)
1 1B 0xF2 (CAN数据标记) / 0xF3 (CANFD数据标记)
2-3 2B 包序号
4-7 4B 总大小
8-11 4B 帧数量
12-15 4B 时间戳基准
16-19 4B 其他标记
20+ NB CAN 帧数组
已验证功能
- AES 认证握手
- 设备打开 (SYS 绿灯)
- 120Ω 终端电阻使能 (软件控制, ref_type=0x18)
- CAN FD 初始化 (1Mbps/5Mbps)
- CAN 控制器启动 (CAN 绿灯)
- 自发自收 CAN/CANFD 帧
- 外部 CAN FD 总线实时接收 (原生 + Docker 两种方案)
- 帧解析器优化(EP83 数据偏移校准)
- CAN 帧发送到外部总线
注意事项
- 初始化顺序关键:必须 Resistance → InitCAN → StartCAN,否则 StartCAN 返回 err=3
- cmd=0x01 不可省略:这个"启用数据转发"命令是固件开始推送 CAN 数据到 EP83 的开关
- 终端电阻通过软件使能 (VCI_SetReference, ref_type=0x18, value=u32(1))
- 设备断开后需要重新拔插 USB 才能重连
- Docker 方案需要 Colima/OrbStack 的
host.docker.internal网络支持
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zlgcan_macos-0.1.0.tar.gz.
File metadata
- Download URL: zlgcan_macos-0.1.0.tar.gz
- Upload date:
- Size: 6.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c17d4d5525e445833574c6e45f63f5b3d86016265154054425f416e8678c018
|
|
| MD5 |
801e1e05494a56d4c14c6dc4162d257f
|
|
| BLAKE2b-256 |
04e02db57a82c11c1a63b05e61f8c345c998658261a02edc1eae428658e4d6df
|
File details
Details for the file zlgcan_macos-0.1.0-py3-none-any.whl.
File metadata
- Download URL: zlgcan_macos-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43ae71149196e9a5f6543469292ac7413c441d03dc06a837579534abeb0157f6
|
|
| MD5 |
964ac15e156e198f83b42b9f759a0919
|
|
| BLAKE2b-256 |
36bde53ff057a6310a6057e4fd3c995fdcd2816780f876cebfc08852ac15911a
|