Open-source macOS/Linux driver for SM2 Pro (Scanmatik 2 Pro) J2534 CAN adapter
Project description
SM2CAN — Open-Source Driver for SM2 Pro CAN Adapters on macOS & Linux
SM2CAN is a userspace USB driver that enables SM2 Pro (and compatible) J2534 CAN adapters to work on macOS and Linux — platforms the manufacturer's driver does not support. It integrates with python-can, making it a drop-in replacement for any CAN interface.
Disclaimer: This project is not affiliated with, endorsed by, or sponsored by the manufacturer of the SM2 Pro hardware. All trademarks are property of their respective owners. This driver was developed using clean room reverse engineering of a legitimately purchased device for the sole purpose of interoperability. See LEGAL.md for full details.
Project Status
| Component | Status | Notes |
|---|---|---|
| USB transport (libusb) | ✅ Complete | Tested on macOS 13+ and Ubuntu 22.04+ |
| USB hardware detection | ✅ Complete | Auto-detects VID 0x20A2 PID 0x0001 |
| Protocol decoder | 🔧 Needs capture | Community USB captures welcome |
| Protocol auto-detection | ✅ Scaffolded | Tries multiple frame format variants |
python-can Bus interface |
✅ Complete | interface='sm2' via entry point |
| CLI tools | ✅ Complete | sm2can probe, monitor, send |
| USB capture analysis | ✅ Complete | Parses pcap/pcapng from USBPcap |
| Homebrew formula | ✅ Ready | brew tap aldoguzman97/sm2can |
| Linux udev rules | ✅ Included | Non-root USB access |
| Bluetooth SPP transport | 📋 Planned | Architecture ready for future support |
How You Can Help
One USB capture from a Windows session completes this driver. If you can run Wireshark + USBPcap on Windows while connected to a vehicle:
pip install sm2can
sm2can-capture guide # Step-by-step capture instructions
sm2can-capture decode mycapture.pcapng # Auto-analyzes the protocol
See CONTRIBUTING.md for the 5-minute capture guide.
Installation
Homebrew (macOS)
brew tap aldoguzman97/sm2can
brew install sm2can
pip (macOS & Linux)
pip install sm2can
From source
git clone https://github.com/aldoguzman97/sm2can.git
cd sm2can
pip install -e ".[dev]"
Prerequisites
| Platform | Command |
|---|---|
| macOS | brew install libusb |
| Debian/Ubuntu | sudo apt install libusb-1.0-0-dev |
| Fedora/RHEL | sudo dnf install libusb1-devel |
| Arch | sudo pacman -S libusb |
Python 3.8 or later required.
Linux: USB Permissions
To use without sudo:
sudo cp scripts/99-sm2pro.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
# Log out and back in (user must be in 'plugdev' group)
Quick Start
Detect hardware
sm2can probe
Monitor CAN bus
sm2can monitor --bitrate 500000
Send a CAN frame
sm2can send 0x7DF 0201000000000000 --bitrate 500000
Use with python-can
import can
# SM2CAN registers as a python-can interface plugin automatically
bus = can.Bus(interface='sm2', channel=0, bitrate=500000)
# Receive
msg = bus.recv(timeout=1.0)
if msg:
print(f"0x{msg.arbitration_id:03X}: {msg.data.hex()}")
# Send
bus.send(can.Message(
arbitration_id=0x7DF,
data=bytes([0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
))
bus.shutdown()
Direct API
from sm2can import SM2Device
with SM2Device() as dev:
dev.open(bitrate=500000)
dev.send(0x7DF, bytes([0x02, 0x01, 0x00, 0, 0, 0, 0, 0]))
frame = dev.recv(timeout=1.0)
if frame:
print(f"0x{frame.arbitration_id:03X}: {frame.data.hex()}")
Supported Hardware
| Device | USB ID | Interface | Status |
|---|---|---|---|
| SM2 Pro (original) | 20A2:0001 |
USB + BT | Primary target |
| SM2 Pro (clones) | 20A2:0001 |
USB | Should work (same USB protocol) |
Power Requirements
Important: The SM2 Pro requires 12V on the OBD-II connector to boot its application firmware. On USB 5V power alone, the microcontroller enumerates on the bus but the CAN transceiver and command handler do not start. Connect to a vehicle with ignition ON, or supply 12V externally.
OBD-II bench power pinout:
| Pin | Function |
|---|---|
| 16 | +12V (battery) |
| 4 | Chassis ground |
| 5 | Signal ground |
A 12V / 1A wall adapter wired to these pins is sufficient.
Architecture
┌──────────────────────────────────────────────────────────┐
│ Your Application / python-can / opendbc / UDS client │
├──────────────────────────────────────────────────────────┤
│ SM2Bus (can_interface.py) │
│ python-can BusABC — registered via entry point │
├──────────────────────────────────────────────────────────┤
│ SM2Device (device.py) │
│ High-level: open / close / send / recv / background RX │
├──────────────────────────────────────────────────────────┤
│ ProtocolCodec (protocol.py) │
│ Encode / decode binary protocol frames │
├────────────────────┬─────────────────────────────────────┤
│ USBTransport │ BluetoothTransport (planned) │
│ (usb_transport.py)│ (bluetooth_transport.py) │
│ Bulk EP via libusb│ SPP via platform-native APIs │
├────────────────────┴─────────────────────────────────────┤
│ Hardware: EP 0x02 OUT / EP 0x81 IN / 64-byte packets │
└──────────────────────────────────────────────────────────┘
Why userspace instead of a kernel driver? A kernel extension (kext on macOS, .ko on Linux) requires code signing, kernel version compatibility, and administrator installation. A userspace driver via libusb installs with pip, works everywhere, and cannot crash your kernel. The SM2 Pro's simple 2-endpoint bulk design is ideal for this approach.
Roadmap
- USB transport layer
- Protocol codec with auto-detection framework
- python-can
Businterface - CLI tools (
probe,monitor,send) - USB capture decoder for protocol analysis
- Homebrew formula
- Linux udev rules
- Complete protocol specification (pending community captures)
- Bluetooth SPP transport
- CAN-FD support (if hardware supports it)
- ISO-TP (ISO 15765) pass-through
- SAE J2534 API shim layer
Contributing
See CONTRIBUTING.md. The most impactful contribution is a USB capture from Windows — one file completes the protocol specification for everyone.
Legal
This project uses clean room reverse engineering to achieve interoperability with legitimately purchased hardware. No proprietary code, firmware, or documentation was used. See LEGAL.md for full details including applicable case law.
License
MIT — see LICENSE.
Copyright (c) 2026 Aldo Guzman (@aldoguzman97)
Acknowledgments
- pyusb — Cross-platform USB access
- python-can — CAN bus abstraction
- libusb — Userspace USB I/O
- Everyone who contributes USB captures
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
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 sm2can-0.1.0.tar.gz.
File metadata
- Download URL: sm2can-0.1.0.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c36292878f51a2972736f2adc25b02e90064be5b6bad639bb55533838f2eb7e5
|
|
| MD5 |
1706558d6ca10728d5897b87e7e0b406
|
|
| BLAKE2b-256 |
e54a739933ceecb360473b8f55cc66ed6d462517e529b6d681968d7eb9bb9ff3
|
File details
Details for the file sm2can-0.1.0-py3-none-any.whl.
File metadata
- Download URL: sm2can-0.1.0-py3-none-any.whl
- Upload date:
- Size: 5.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c3166f5a301f26a9e64d7d3ff6c893a33dd3bfae0605c5ad55e8b5a78f7ccf3
|
|
| MD5 |
2881286f01366e21a7b928b052d198a5
|
|
| BLAKE2b-256 |
11b93ec2e0a73c16f71b46367b045b348501ec3175757d971b1f87e9ff56128c
|