Framework to work with J1939 protocol.
J1939 protocol is a standard used in different systems compliant with CAN 2.0B specification.
The framework has been developed in C++ in a Linux distribution and compiled using the GNU toolchain. No dependencies are required for the compilation of any of the projects except from SocketCan compiled in the Linux Kernel.
- Sniff frames from the Can Bus compliant with J1939 protocol with BinUtils/j1939Sniffer.
- Decode raw J1939 data to human readable data with BinUtils/j1939Decoder.
- Craft your own J1939 frames and send them to the Can Bus with BinUtils/j1939Sender. The functionality can be extended with the help of bash scripts located in Scripts (some examples are listed).
- Visualize what is going on in the Can Bus with GUI_WEB. You will be able to craft, send and visualize the frames that are flowing in the Bus as well as visualizing graphics of their content (SPNs).
- Discover J1939 devices with BinUtils/j1939AddressMapper.
- Simulation of the Address Claim Process with BinUtils/j1939AddrClaim.
- PeakCan Support
- Save Can frames from the Can Bus into recordings in TRC format with BinUtils/TRCDumper.
- Play Can frames from recordings in TRC format into the Can Bus with BinUtils/TRCPlayer.
- Convert TRC files into pcap files readable by wireshark with BinUtils/TRCToCap.
- Wireshark Support
- Dissect pcap files with wireshark and the J1939 plugin dissector (wireshark/dissector).
- In CAN/ folder, a library in C++ (
libCAN.so
) with methods to generate and sniff can frames with support forPeakCan
andSocketCan
. - In J1939/ folder, a library in C++ (
libJ1939.so
) is to easily manipulate J1939 frames and work with the J1939 protocol. Some features are:- Support of BAM protocol.
- A factory class in charge of generating the J1939 frames.
- A database loaded by the factory located in Database/frames.json with a list of the most used Application Layer frames (including the FMS protocol).
- Coding/Decoding DM1 (Diagnosis), FMS1 (TTS), Request and Address Claim frames.
- Coding/Decoding of SPNs (String, status and numeric).
Ubuntu 18.10 or higher
sudo apt-get install libgtest-dev protobuf-compiler libprotobuf-dev libncurses-dev libwebsockets-dev cmake
cd /usr/src/gtest
sudo env "PATH=$PATH" cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib
cd ~/work/
git clone https://github.com/open-source-parsers/jsoncpp.git
cd jsoncpp
git checkout 863aa36165acfdbaf22447f4934f5adc327692a0
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON
sudo make install
cd -
$ git clone https://github.com/ardenjay/J1939-Framework.git
$ cd J1939-Framework
$ cmake .
$ cmake --build .
$ sudo make install
$ git clone https://github.com/ardenjay/J1939-Framework.git
$ cd J1939-Framework
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .. # or just type make
$ sudo make install
To make SocketCan available in your system, you should execute the following commands:
sudo apt-get install can-utils
To enable the drivers if they not enabled by default:
sudo modprobe can
sudo modprobe vcan
To generate a virtual interface for test purposes.
sudo ip link add name vcan0 type vcan
To test over vcan0.
./Scripts/gear_level.sh vcan0 | j1939Sender --silent --file Scripts/define_frames.j1939
candump vcan0