CAN Commander is a comprehensive tool designed for the reverse engineering of CAN (Controller Area Network) bus systems. This project aims to provide a robust platform for automotive enthusiasts, engineers, and security researchers to interact with and analyze CAN networks, facilitating a deeper understanding and manipulation of communication.
C
1,078
42 commits
updated Apr 25, 2026
Documentation for the Flipper-side CAN Commander app (can_commander).
This document focuses on:
.injprof, .dbcprof)Current app version in source: v2.3.1 (PROGRAM_VERSION in can_commander.h).
Minimum supported ESP32 firmware: v2.2. The app handshakes the firmware
version at boot and surfaces a warning if your CAN Commander board is running
older firmware. See §10 for details.
CAN Commander on Flipper is a UART-driven UI/controller for the CAN Commander ESP32 firmware. It is far more than a basic UI designed to speed up in-field CAN reverse engineering and injection.
Core behavior:
App startup sequence:
Ping) and runs the firmware version
check (GetInfo).v2.2, a status screen with the warning and
update URL is pushed on top of the main menu - back returns to the main
menu and the warning will not re-show during the session.Connection retries:
Important navigation behavior:
Back from an active tool stops that tool automatically. (as
designed)CAN Commander app on Flipper (Apps -> GPIO -> CAN Commander).Back. Update at
https://www.cancommander.com when convenient.Tools -> Monitor & Discovery -> Read All Frames.Use this when:
Tools -> Vehicle Diagnostics.OBD2 Live Data -> PID List for polling live vehicle data (speed,
RPM, fuel level, etc.)Fetch VIN for grabbing the vehicle VINFetch DTCs for pulling error codes (DTCs)Clear DTCs to clear codes and reset the check engine light (MIL)Use this when:
Tools -> Monitor & Discovery -> Filter & Read Frames.bus, mask, filter, ext_match, ext.Use this when:
Tools -> Control & Injection -> Write Frames.bus / id / ext / dlc / data / count / interval_ms.OK to resend the current payload
using the same count/interval configuration.Use this when:
Tools -> Control & Injection -> Smart Injection.Start to sync slots and enter live view.OK.Save Profile; restore with Load Profile or
via Profiles.Use this when:
It stores live data as it comes in for the selected IDs, tracks the data, then performs in-frame bit/data swaps keeping all unwanted signal changes untouched. This makes it safe to inject specific signals and commands without causing unwanted signals to be affected or modified.
Tools -> Control & Injection -> Replay.bus, id, and ext for the frame you want to capture, then
Start.OK to begin recording. The screen shows a live elapsed
timer and frame counter.OK again to stop recording (or wait until the buffer fills).Left / Right to set the loop count (1–99).OK to play back at original timing.Up to clear the buffer if you want to re-record.OK or Down while replaying to stop.Use this when:
The Replay tool records up to 384 frames for one CAN ID. Speed is fixed at 100% (real-time) playback.
Tools -> Monitor & Discovery -> Auto Reverse Engineer.Up / Down. Then:
Right → opens Bit Tracker with that bus/ID pre-filled (find the
specific bits responsible).Left → opens Replay with that bus/ID pre-filled (capture and
play back the exact bytes).Use this when:
Tools -> DBC & Databases -> Load DBC Profile.Use this when:
You will need to set up injection and decoding profiles for workflows 5 and 8. I made this easy with a webtool. You'll need a DBC with the signals you want to decode or inject (you can also make a DBC in app). Then create those profiles on the website and add them to your Flipper's SD card. Details in §8.
If you have a standard .dbc, you can convert it into CAN Commander profile
formats (.dbcprof and .injprof) at:
These are the arguments most users set repeatedly.
| Argument | Meaning | Typical values / notes |
|---|---|---|
bus | Which CAN interface the action targets | can0 (right port), can1 (left port), both |
id | CAN frame identifier target | Standard (ext=0): 0x000..0x7FF; Extended (ext=1): 29-bit |
ext | ID type flag | 0 = standard 11-bit, 1 = extended 29-bit |
dlc | Data length code (payload byte count) | 0..8 bytes (how many bytes are in the frame) |
data | Payload bytes in hex text | Effective byte count depends on dlc and parsed bytes |
count | Number of sends/injections in a burst | If omitted/0, app normalizes to at least one action |
interval_ms | Delay between repeated sends/injections | Used with count for burst timing |
Bus port mapping:
can0 is the right port on CAN Commander (the primary port).can1 is the left port on CAN Commander.can0 unless explicitly set otherwise.Read All Frames
Filter & Read Frames
Unique IDs
Bit Tracker
Auto Reverse Engineer
Right on a selected ID → starts Bit Tracker with that ID.Left on a selected ID → starts Replay with that ID.Value Tracker
CAN Speed Test
Write Frames
Smart Injection
.injprof filetype (or create slots in app).Replay
bus, id, and ext in the args editor before starting. count and
speed are not in the args editor - count is set on the dashboard with
Left/Right (1–99); speed is fixed at 100%.OK → start recording.OK → stop. Live elapsed-time and frame counter.OK → play back N loops at 100% speed.Up → clear recorded frames.Left / Right → adjust loop count.OK or Down → stop. Live frame/total and loop/total.Stop Active Tool
OBD2 Live Data
Fetch VIN
Fetch DTCs
Clear DTCs
DBC Decode
.dbcprof),
this is the best way to stream and decode live data. It uses a page
system where you get a custom dashboard for each signal as well as an
overview showing all signals live.Load DBC Profile
DBC Database Manager
Smart Injection Profiles
DBC Decoding Profiles
The Settings screen uses a VariableItemList. Most entries are clickable
actions. LED Brightness is a left/right slider.
Connect/Reconnect
Bus Config
Bus Filters
WiFi Settings
WIFI_GET_CFG / WIFI_SET_CFG to the firmware.LED Brightness
Left / Right in the Settings list to cycle through 1..10 (10%
steps). Each change is sent to the firmware immediately.5 (50%). Setting persists until the app exits.Stats, Ping, Get Info
unknown if
the firmware version handshake failed).Read All / Filtered
Write
OK resends the configured payload using the same count/interval.Speed Test
Value Tracker
Unique IDs
Bit Tracker
X) support.Auto Reverse Engineer
Right on a selected ID → starts Bit Tracker. Left → starts Replay.OBD
DBC Decode
Custom Inject
Replay
Press [OK] to Record.Loops: < N >, control hints
[OK] Play [UP] Clear, [L/R] Loops.** RECORDING ** with elapsed seconds and live frame
count; [OK] Stop.>> REPLAYING, Frame: x/y, Loop: x/y,
[OK] or [DOWN] to Stop.Not connected to CAN Commander
Settings -> Connect/Reconnect, verify power/wiring/module
state.Firmware out of date!
v2.2, or the board did not
respond to GET_INFO (which means firmware is older than v2.2).... transport error
TOOL_CONFIG => BAD_ARG
Inject needs live frame first...
Input overload / Rendering paused >1000
Streaming the Flipper screen via qFlipper or the mobile app increases memory pressure significantly. v2.3.x trims RAM through:
1500/1000 bytes; ~1 KB saved).Notes:
apps_data/can_commander/custom_inject.cfgapps_data/can_commander/injection_profiles/*.injprofapps_data/can_commander/dbc_profiles/*.dbcprofStartup behavior:
.injprof)Header:
Filetype: CANCommanderInjectionProfileVersion: 1Top-level keys:
nameactive_slot (0..4)Per-slot keys (N=1..5):
slotN_nameslotN_usedslotN_busslotN_idslotN_extslotN_maskslotN_valueslotN_xorslotN_muxslotN_mux_startslotN_mux_lenslotN_mux_valueslotN_sigslotN_sig_startslotN_sig_lenslotN_sig_valueslotN_countslotN_interval_ms.dbcprof)Header:
Filetype: CANCommanderDbcProfileVersion: 1Top-level keys:
namesignal_count (0..16)Per-signal keys (X=1..signal_count):
signalX_sidsignalX_namesignalX_bussignalX_idsignalX_extsignalX_startsignalX_lensignalX_ordersignalX_signsignalX_factorsignalX_offsetsignalX_minsignalX_maxsignalX_unitOptional mapping keys:
signalX_map_count (0..16)signalX_mapY_rawsignalX_mapY_labelDBC conversion note:
.dbc files can be converted into CAN Commander profile formats
(.dbcprof and .injprof) at https://cancommander.com.5 per profile (you can create many
profiles).16.16 per profile.10.384 frames per recording (recording auto-stops
when full).1..99. Speed is fixed at 100% (real-time
playback).1..10 (10% steps). Default 5.The app and the ESP32 firmware evolve together. Each release of the app declares a minimum supported firmware version.
| Component | Version |
|---|---|
| App (this build) | v2.3.1 |
| Required firmware | v2.2 or newer |
GET_INFO (0x02) Flipper command after the UART
ping at boot (and on Settings -> Connect/Reconnect).v2.2+ responds with a STATUS_EVT payload:
[0] major:u8
[1] minor:u8
[2] string_len:u8
[3..3+string_len] version string (e.g. "2.2")
>= v2.2, the app
proceeds silently.Firmware out of date!
Firmware is: v<detected> (or "unknown")
Firmware needs: v2.2+
App: v2.3.1
Update at:
www.cancommander.com
Back returns
to the main menu.v2.2.v2.2.The CAN Commander board can broadcast its own Wi-Fi access point and expose the full CLI over a raw TCP socket. Once connected, any device with a terminal becomes a remote control surface - laptop, phone, single-board computer, or any of the planned dedicated companion devices. This is the same command set as the USB CLI: read frames, set filters, start tools, run injection, manage DBC, etc.
nc / netcat, telnet, PuTTY,
Termius, JuiceSSH, iSH (iOS), screen, minicom - anything that speaks
raw TCP.Settings -> WiFi Settings.autostart=1 if you want the AP to come up automatically on every
boot. Otherwise toggle the AP on manually with ap=1.WiFi AP ready ssid=<ssid> ip=192.168.4.1 cli_port=7777
Defaults if you haven't changed them:
CANCommanderchange_me_123 (change this)7777ap=1 from the Flipper or wifi start over USB CLI)Join the board's Wi-Fi network (the SSID/password you set), then open a TCP connection to the board's IP on port 7777.
macOS / Linux / WSL - netcat:
nc 192.168.4.1 7777
Windows / cross-platform - telnet:
telnet 192.168.4.1 7777
(telnet may need to be enabled in Windows: Turn Windows features on or
off → Telnet Client).
PuTTY: set Connection Type to Raw (or Telnet), Host = board IP, Port = 7777.
Phones: any TCP/raw-mode terminal app - e.g. JuiceSSH (Android, "Local
Telnet" connection), Termius (raw-socket plugin), iSH (iOS - nc <ip> 7777).
Once connected, you have a live CLI prompt. Type help for the command
list. The same command syntax works as on the USB CLI, including
injection shortcuts (inject slot=1, inject list, inject cancel)
once custom_inject is active.
Example session:
$ nc 192.168.4.1 7777
help
status
bus show
tool start read_all bus=can0 ascii=0
...
tool stop
Because the TCP CLI uses the same text command set as USB, any device that can speak TCP can become a fully-featured CAN Commander control surface. Several dedicated companion apps are in active development:
These will be released as separate firmware images / apps for their respective hardware. Track https://www.cancommander.com for downloads.
Back in the Flipper app stops the active tool - the same
semantics as USB. If a TCP client is also connected, it sees the tool
stop event.wifi show (over USB) or check the boot log for the board's IP
address.wifi stop over USB (or ap=0 from the Flipper) to disable the
AP without changing SSID/password persistence.910 followers · starred Aug 2024
137 followers · starred Dec 2023
49 followers · starred Jun 2024
CAN Commander is a comprehensive tool designed for the reverse engineering of CAN (Controller Area Network) bus systems. This project aims to provide a robust platform for automotive enthusiasts, engineers, and security researchers to interact with and analyze CAN networks, facilitating a deeper understanding and manipulation of communication.
C
1,078
42 commits
updated Apr 25, 2026
Documentation for the Flipper-side CAN Commander app (can_commander).
This document focuses on:
.injprof, .dbcprof)Current app version in source: v2.3.1 (PROGRAM_VERSION in can_commander.h).
Minimum supported ESP32 firmware: v2.2. The app handshakes the firmware
version at boot and surfaces a warning if your CAN Commander board is running
older firmware. See §10 for details.
CAN Commander on Flipper is a UART-driven UI/controller for the CAN Commander ESP32 firmware. It is far more than a basic UI designed to speed up in-field CAN reverse engineering and injection.
Core behavior:
App startup sequence:
Ping) and runs the firmware version
check (GetInfo).v2.2, a status screen with the warning and
update URL is pushed on top of the main menu - back returns to the main
menu and the warning will not re-show during the session.Connection retries:
Important navigation behavior:
Back from an active tool stops that tool automatically. (as
designed)CAN Commander app on Flipper (Apps -> GPIO -> CAN Commander).Back. Update at
https://www.cancommander.com when convenient.Tools -> Monitor & Discovery -> Read All Frames.Use this when:
Tools -> Vehicle Diagnostics.OBD2 Live Data -> PID List for polling live vehicle data (speed,
RPM, fuel level, etc.)Fetch VIN for grabbing the vehicle VINFetch DTCs for pulling error codes (DTCs)Clear DTCs to clear codes and reset the check engine light (MIL)Use this when:
Tools -> Monitor & Discovery -> Filter & Read Frames.bus, mask, filter, ext_match, ext.Use this when:
Tools -> Control & Injection -> Write Frames.bus / id / ext / dlc / data / count / interval_ms.OK to resend the current payload
using the same count/interval configuration.Use this when:
Tools -> Control & Injection -> Smart Injection.Start to sync slots and enter live view.OK.Save Profile; restore with Load Profile or
via Profiles.Use this when:
It stores live data as it comes in for the selected IDs, tracks the data, then performs in-frame bit/data swaps keeping all unwanted signal changes untouched. This makes it safe to inject specific signals and commands without causing unwanted signals to be affected or modified.
Tools -> Control & Injection -> Replay.bus, id, and ext for the frame you want to capture, then
Start.OK to begin recording. The screen shows a live elapsed
timer and frame counter.OK again to stop recording (or wait until the buffer fills).Left / Right to set the loop count (1–99).OK to play back at original timing.Up to clear the buffer if you want to re-record.OK or Down while replaying to stop.Use this when:
The Replay tool records up to 384 frames for one CAN ID. Speed is fixed at 100% (real-time) playback.
Tools -> Monitor & Discovery -> Auto Reverse Engineer.Up / Down. Then:
Right → opens Bit Tracker with that bus/ID pre-filled (find the
specific bits responsible).Left → opens Replay with that bus/ID pre-filled (capture and
play back the exact bytes).Use this when:
Tools -> DBC & Databases -> Load DBC Profile.Use this when:
You will need to set up injection and decoding profiles for workflows 5 and 8. I made this easy with a webtool. You'll need a DBC with the signals you want to decode or inject (you can also make a DBC in app). Then create those profiles on the website and add them to your Flipper's SD card. Details in §8.
If you have a standard .dbc, you can convert it into CAN Commander profile
formats (.dbcprof and .injprof) at:
These are the arguments most users set repeatedly.
| Argument | Meaning | Typical values / notes |
|---|---|---|
bus | Which CAN interface the action targets | can0 (right port), can1 (left port), both |
id | CAN frame identifier target | Standard (ext=0): 0x000..0x7FF; Extended (ext=1): 29-bit |
ext | ID type flag | 0 = standard 11-bit, 1 = extended 29-bit |
dlc | Data length code (payload byte count) | 0..8 bytes (how many bytes are in the frame) |
data | Payload bytes in hex text | Effective byte count depends on dlc and parsed bytes |
count | Number of sends/injections in a burst | If omitted/0, app normalizes to at least one action |
interval_ms | Delay between repeated sends/injections | Used with count for burst timing |
Bus port mapping:
can0 is the right port on CAN Commander (the primary port).can1 is the left port on CAN Commander.can0 unless explicitly set otherwise.Read All Frames
Filter & Read Frames
Unique IDs
Bit Tracker
Auto Reverse Engineer
Right on a selected ID → starts Bit Tracker with that ID.Left on a selected ID → starts Replay with that ID.Value Tracker
CAN Speed Test
Write Frames
Smart Injection
.injprof filetype (or create slots in app).Replay
bus, id, and ext in the args editor before starting. count and
speed are not in the args editor - count is set on the dashboard with
Left/Right (1–99); speed is fixed at 100%.OK → start recording.OK → stop. Live elapsed-time and frame counter.OK → play back N loops at 100% speed.Up → clear recorded frames.Left / Right → adjust loop count.OK or Down → stop. Live frame/total and loop/total.Stop Active Tool
OBD2 Live Data
Fetch VIN
Fetch DTCs
Clear DTCs
DBC Decode
.dbcprof),
this is the best way to stream and decode live data. It uses a page
system where you get a custom dashboard for each signal as well as an
overview showing all signals live.Load DBC Profile
DBC Database Manager
Smart Injection Profiles
DBC Decoding Profiles
The Settings screen uses a VariableItemList. Most entries are clickable
actions. LED Brightness is a left/right slider.
Connect/Reconnect
Bus Config
Bus Filters
WiFi Settings
WIFI_GET_CFG / WIFI_SET_CFG to the firmware.LED Brightness
Left / Right in the Settings list to cycle through 1..10 (10%
steps). Each change is sent to the firmware immediately.5 (50%). Setting persists until the app exits.Stats, Ping, Get Info
unknown if
the firmware version handshake failed).Read All / Filtered
Write
OK resends the configured payload using the same count/interval.Speed Test
Value Tracker
Unique IDs
Bit Tracker
X) support.Auto Reverse Engineer
Right on a selected ID → starts Bit Tracker. Left → starts Replay.OBD
DBC Decode
Custom Inject
Replay
Press [OK] to Record.Loops: < N >, control hints
[OK] Play [UP] Clear, [L/R] Loops.** RECORDING ** with elapsed seconds and live frame
count; [OK] Stop.>> REPLAYING, Frame: x/y, Loop: x/y,
[OK] or [DOWN] to Stop.Not connected to CAN Commander
Settings -> Connect/Reconnect, verify power/wiring/module
state.Firmware out of date!
v2.2, or the board did not
respond to GET_INFO (which means firmware is older than v2.2).... transport error
TOOL_CONFIG => BAD_ARG
Inject needs live frame first...
Input overload / Rendering paused >1000
Streaming the Flipper screen via qFlipper or the mobile app increases memory pressure significantly. v2.3.x trims RAM through:
1500/1000 bytes; ~1 KB saved).Notes:
apps_data/can_commander/custom_inject.cfgapps_data/can_commander/injection_profiles/*.injprofapps_data/can_commander/dbc_profiles/*.dbcprofStartup behavior:
.injprof)Header:
Filetype: CANCommanderInjectionProfileVersion: 1Top-level keys:
nameactive_slot (0..4)Per-slot keys (N=1..5):
slotN_nameslotN_usedslotN_busslotN_idslotN_extslotN_maskslotN_valueslotN_xorslotN_muxslotN_mux_startslotN_mux_lenslotN_mux_valueslotN_sigslotN_sig_startslotN_sig_lenslotN_sig_valueslotN_countslotN_interval_ms.dbcprof)Header:
Filetype: CANCommanderDbcProfileVersion: 1Top-level keys:
namesignal_count (0..16)Per-signal keys (X=1..signal_count):
signalX_sidsignalX_namesignalX_bussignalX_idsignalX_extsignalX_startsignalX_lensignalX_ordersignalX_signsignalX_factorsignalX_offsetsignalX_minsignalX_maxsignalX_unitOptional mapping keys:
signalX_map_count (0..16)signalX_mapY_rawsignalX_mapY_labelDBC conversion note:
.dbc files can be converted into CAN Commander profile formats
(.dbcprof and .injprof) at https://cancommander.com.5 per profile (you can create many
profiles).16.16 per profile.10.384 frames per recording (recording auto-stops
when full).1..99. Speed is fixed at 100% (real-time
playback).1..10 (10% steps). Default 5.The app and the ESP32 firmware evolve together. Each release of the app declares a minimum supported firmware version.
| Component | Version |
|---|---|
| App (this build) | v2.3.1 |
| Required firmware | v2.2 or newer |
GET_INFO (0x02) Flipper command after the UART
ping at boot (and on Settings -> Connect/Reconnect).v2.2+ responds with a STATUS_EVT payload:
[0] major:u8
[1] minor:u8
[2] string_len:u8
[3..3+string_len] version string (e.g. "2.2")
>= v2.2, the app
proceeds silently.Firmware out of date!
Firmware is: v<detected> (or "unknown")
Firmware needs: v2.2+
App: v2.3.1
Update at:
www.cancommander.com
Back returns
to the main menu.v2.2.v2.2.The CAN Commander board can broadcast its own Wi-Fi access point and expose the full CLI over a raw TCP socket. Once connected, any device with a terminal becomes a remote control surface - laptop, phone, single-board computer, or any of the planned dedicated companion devices. This is the same command set as the USB CLI: read frames, set filters, start tools, run injection, manage DBC, etc.
nc / netcat, telnet, PuTTY,
Termius, JuiceSSH, iSH (iOS), screen, minicom - anything that speaks
raw TCP.Settings -> WiFi Settings.autostart=1 if you want the AP to come up automatically on every
boot. Otherwise toggle the AP on manually with ap=1.WiFi AP ready ssid=<ssid> ip=192.168.4.1 cli_port=7777
Defaults if you haven't changed them:
CANCommanderchange_me_123 (change this)7777ap=1 from the Flipper or wifi start over USB CLI)Join the board's Wi-Fi network (the SSID/password you set), then open a TCP connection to the board's IP on port 7777.
macOS / Linux / WSL - netcat:
nc 192.168.4.1 7777
Windows / cross-platform - telnet:
telnet 192.168.4.1 7777
(telnet may need to be enabled in Windows: Turn Windows features on or
off → Telnet Client).
PuTTY: set Connection Type to Raw (or Telnet), Host = board IP, Port = 7777.
Phones: any TCP/raw-mode terminal app - e.g. JuiceSSH (Android, "Local
Telnet" connection), Termius (raw-socket plugin), iSH (iOS - nc <ip> 7777).
Once connected, you have a live CLI prompt. Type help for the command
list. The same command syntax works as on the USB CLI, including
injection shortcuts (inject slot=1, inject list, inject cancel)
once custom_inject is active.
Example session:
$ nc 192.168.4.1 7777
help
status
bus show
tool start read_all bus=can0 ascii=0
...
tool stop
Because the TCP CLI uses the same text command set as USB, any device that can speak TCP can become a fully-featured CAN Commander control surface. Several dedicated companion apps are in active development:
These will be released as separate firmware images / apps for their respective hardware. Track https://www.cancommander.com for downloads.
Back in the Flipper app stops the active tool - the same
semantics as USB. If a TCP client is also connected, it sees the tool
stop event.wifi show (over USB) or check the boot log for the board's IP
address.wifi stop over USB (or ap=0 from the Flipper) to disable the
AP without changing SSID/password persistence.910 followers · starred Aug 2024
137 followers · starred Dec 2023
49 followers · starred Jun 2024