SocketCAN Tutorial 1 - Virtuelle Busse

In einem älteren Post hatte ich ja schon eine kurze Einführung in SocketCAN gegeben. Da ich mich in der nächsten Zeit wohl etwas genauer damit beschäftigen werde hier ein kleines Tutorial. Ich fand die ersten Schritte doch etwas holprig und daher hier der Reihe nach:

Das Ganze sollte mit einem aktuellen Linux funktionieren (Ubuntu 10.10 ist perfekt). Zunächst mal müssen wir die Kernel Module laden:

<code>dschanoeh@Krikkit1:~$ modprobe can
dschanoeh@Krikkit1:~$ modprobe can_raw
dschanoeh@Krikkit1:~$ modprobe can_bcm
dschanoeh@Krikkit1:~$ modprobe vcan</code>

Anschließend kann ein neues virtuelles CAN-Device über

<code>dschanoeh@Krikkit1:~$ sudo ip link add dev vcan0 type vcan
dschanoeh@Krikkit1:-$ sudo ip link set up vcan0</code>

erstellt werden.  Der folgende Befehl sollte eine ähnliche Ausgabe liefern:

<code>dschanoeh@Krikkit1:~$ ip link show
7: vcan0: <NOARP,UP,LOWER_UP> mtu 16 qdisc noqueue state UNKNOWN     link/can</code>

Um jetzt auf dem Device ein Bisschen Traffic zu generieren benötigen wir zwei Tools aus dem SocketCAN-Repository. Dafür muss dieses ausgecheckt und die can-utils kompiliert werden (die Pakete build-essential und subversion werden benötigt):

<code>dschanoeh@Krikkit1:~$ svn checkout svn://svn.berlios.de/socketcan/trunk
dschanoeh@Krikkit1:~$ cd trunk/can-utils
dschanoeh@Krikkit1:~$ make</code>

Nun brauchen wir nur noch eine Logdatei. Dafür das Folgende als ‘test.log’ abspeichern:

<code>
(0.1) vcan0 5D1#0000
(0.2) vcan0 271#0100
(0.3) vcan0 289#72027000
(0.4) vcan0 401#081100000000
</code>

Das Logfile kann jetzt über

<code>dschanoeh@Krikkit1:~/trunk/can-utils$ ./canplayer -l i -I test.log</code>

unendlich oft wiederholt abgespielt werden.

Da SocketCAN unter /proc/ Statusinformationen anbietet, kann man sich (in einem anderen Terminal) schnell einen Überblick über den aktuellen Buszustand verschaffen:

<code>dschanoeh@Krikkit1:~$ cat /proc/net/can/stats
452715 transmitted frames (TXF)
452715 received frames (RXF)
1627 matched frames (RXMF)

0 % total match ratio (RXMR)
0 frames/s total tx rate (TXR)
0 frames/s total rx rate (RXR)

0 % current match ratio (CRXMR)
1860 frames/s current tx rate (CTXR)
1860 frames/s current rx rate (CRXR)

100 % max match ratio (MRXMR)
1880 frames/s max tx rate (MTXR)
1880 frames/s max rx rate (MRXR)

0 current receive list entries (CRCV)
1 maximum receive list entries (MRCV)
</code>

Die can-utils enthalten ebenfalls ein Tool, mit dem die aktuellen Frames auf einem Bus ausgegeben werden können. Damit kann man live dem Traffic zuschauen, oder auch Logfiles erstellen:

<code>dschanoeh@Krikkit1:~/trunk/can-utils$ ./candump vcan0
</code>

Das soll’s erstmal gewesen sein. Vielleicht kann ich demnächst nochmal von meiner aktuellen Arbeit mit SocketCAN berichten. Für ein Bisschen rumspielen sollte das hier ja schon reichen und wer sich für mehr interessiert, der findet hier noch weiterführende Dokumentation.

Update: Es gibt nun eine Fortsetzung des Tutorials.

Comments