Skip to main content

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 写入

  1. 8 字节头部
  2. 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 帧发送到外部总线

注意事项

  1. 初始化顺序关键:必须 Resistance → InitCAN → StartCAN,否则 StartCAN 返回 err=3
  2. cmd=0x01 不可省略:这个"启用数据转发"命令是固件开始推送 CAN 数据到 EP83 的开关
  3. 终端电阻通过软件使能 (VCI_SetReference, ref_type=0x18, value=u32(1))
  4. 设备断开后需要重新拔插 USB 才能重连
  5. Docker 方案需要 Colima/OrbStack 的 host.docker.internal 网络支持

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zlgcan_macos-0.1.0.tar.gz (6.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zlgcan_macos-0.1.0-py3-none-any.whl (11.8 kB view details)

Uploaded Python 3

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

Hashes for zlgcan_macos-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1c17d4d5525e445833574c6e45f63f5b3d86016265154054425f416e8678c018
MD5 801e1e05494a56d4c14c6dc4162d257f
BLAKE2b-256 04e02db57a82c11c1a63b05e61f8c345c998658261a02edc1eae428658e4d6df

See more details on using hashes here.

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

Hashes for zlgcan_macos-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 43ae71149196e9a5f6543469292ac7413c441d03dc06a837579534abeb0157f6
MD5 964ac15e156e198f83b42b9f759a0919
BLAKE2b-256 36bde53ff057a6310a6057e4fd3c995fdcd2816780f876cebfc08852ac15911a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page