Userspace USB Transport
Communicates directly via libusb. No kernel module, no kext signing, no sudo required after initial udev setup. Plug in and go.
Open-source USB driver for the SM2 Pro (Scanmatik 2 Pro) J2534 CAN adapter. python-can compatible. No Windows required. No kernel driver. No kext.
pip install sm2can
Everything you need to use your SM2 Pro hardware on the platform you actually work on.
Communicates directly via libusb. No kernel module, no kext signing, no sudo required after initial udev setup. Plug in and go.
Registers as a native python-can Bus interface. can.Bus(interface='sm2') works out of the box with your existing CAN workflows.
Automatic frame format and checksum detection across Scanmatik protocol variants. Extensible codec framework for protocol evolution.
Built-in pcap/pcapng decoder extracts and reverse-engineers the Scanmatik wire protocol from a single Windows USB capture. No Wireshark or tshark required.
Clean room reverse engineering with case law citations. Sega v. Accolade, Sony v. Connectix, EU Directive 2009/24/EC. Every byte observed, nothing stolen.
Install via brew tap aldoguzman97/sm2can or pip install sm2can. First-class packaging for macOS and Linux with CLI tools included.
What's working, what's next.
Three lines to talk CAN. Everything else is handled.
import can # SM2 Pro auto-detected via python-can plugin bus = can.Bus(interface='sm2') # Send a CAN frame msg = can.Message( arbitration_id=0x340, data=[0x04, 0x00, 0x00, 0x04, 0x70, 0x00, 0x89, 0x11] ) bus.send(msg) # Receive response = bus.recv(timeout=1.0)
# Probe your SM2 Pro hardware $ sm2can-probe # Decode a Windows USB capture $ sm2can-capture decode capture.pcapng # Interactive CAN shell $ sm2can --bitrate 500000 # Version check $ sm2can --version sm2can 0.1.0 # Install from Homebrew tap $ brew tap aldoguzman97/sm2can $ brew install sm2can
Tested and targeted devices.
Primary target. USB VID 0x20A2, PID 0x0001. Vendor-specific USB class, 2 bulk endpoints. Requires 12V from OBD connector for full operation.
USBEarlier hardware revision. Same USB protocol family. May work with minimal adaptation once protocol bytes are confirmed.
USBSPP (Serial Port Profile) transport architecture scaffolded. Ready for community implementation. 10-50ms latency — suitable for diagnostics, not real-time control.
Bluetooth · PlannedWhat people ask before plugging in.
Yes. SM2CAN is a userspace USB driver that communicates via libusb — no kernel extension or driver signing needed. Install with pip install sm2can and your SM2 Pro works on macOS 12+.
Yes. Full Linux support with included udev rules for automatic device permissions. Works on any distribution with Python 3.8+ and libusb.
Yes. SM2CAN registers as a native python-can Bus plugin via entry points. After installation, can.Bus(interface='sm2') works with all your existing python-can code, scripts, and tools.
Yes. Clean room reverse engineering of purchased hardware for interoperability is well-established in US and EU law. Sega v. Accolade (1992), Sony v. Connectix (2000), and EU Directive 2009/24/EC all affirm this right. See LEGAL.md in the repository for full citations.
The actual Scanmatik protocol bytes. The device requires 12V from the OBD connector to boot its application firmware — USB 5V alone leaves the bulk endpoints silent. One 5-minute USB capture from a Windows session completes the protocol decode for everyone. See the CONTRIBUTING guide.
The most impactful contribution is a USB capture: install USBPcap on Windows, plug in your SM2 Pro with 12V from the OBD harness, run a short Scanmatik session, and submit the .pcapng file to the GitHub issues page. The built-in capture decoder handles the rest.