7 RAW-Sockets erlauben, Nachrichten direkt auf einem CAN-Bus zu
8 senden und alle Nachrichten, die auf einem CAN-Bus übertragen
9 werden, zu lesen. Geöffnet wird ein RAW-Socket durch
12 s = socket(PF_CAN, SOCK_RAW, 0);
15 Der geöffnete Socket muss zunächst mittels \man{bind}{2} an einen CAN-Bus
16 gebunden werden. Dabei spielen die für Transportprotokolle benötigten
17 Adress-Elemente \verb|tx_id| und \verb|rx_id| in der Struktur
18 \verb|struct sockaddr_can| keine Rolle. Der
19 folgende Code bindet den geöffneten Socket s an das CAN-Interface
23 struct sockaddr_can addr;
26 addr.can_family = AF_CAN;
27 strcpy(ifr.ifr_name, "can1");
28 ioctl(s, SIOCGIFINDEX, &ifr);
29 addr.can_ifindex = ifr.ifr_ifindex;
30 bind(s, (struct sockaddr *)&addr, sizeof(addr));
33 Es können nun mit \man{read}{2} alle auf dem Bus empfangenen CAN-Frames
34 gelesen und mit \man{write}{2} beliebige CAN-Frames gesendet werden.\\
36 Die mit \man{read}{2} und \man{write}{2} übertragenen Daten haben die
37 Struktur \verb|struct can_frame|. Jeder zu sendende CAN-Frame muss
38 mit \emph{einem} Aufruf von \man{write}{2} übergeben werden und
39 empfangene CAN-Frame müssen mit \emph{einem} Aufruf von \man{read}{2}
42 Zum gleichzeitigen Empfang von Nachrichten \emph{aller}
43 CAN-Netzwerk-Interfaces (z.B. mit
44 \man{recvfrom}{2}) ist als Interface-Index Null (im Beispiel:
45 \verb+addr.can_ifindex = 0;+) einzutragen. Das Senden von CAN-Frames
46 über einen solchen RAW-Socket muss dann über \man{sendmsg}{2} erfolgen.\\
48 Der RAW-Socket bietet eine einfache Filterfunktion mit der Bereiche
49 von CAN-IDs aus dem Datenstrom ausgefiltert werden können. Dazu kann
50 noch vor dem Aufruf von \man{bind}{2} mit dem Systemaufruf
51 \man{setsockopt}{2} ein Array einfacher Filter gesetzt werden. In diesem
52 Beispiel sollen alle CAN-IDs von 0x200 - 0x2FF durchgelassen werden:
55 struct can_filter rfilter;
57 rfilter.can_id = 0x200; /* SFF frame */
58 rfilter.can_mask = 0xF00;
60 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
63 Der Filter läßt sich mit \verb+rfilter.can_id |= CAN_INV_FILTER;+ auch
64 invertieren, wodurch in diesem Fall die CAN-IDs von 0x200 - 0x2FF
65 nicht durchgelassen werden würden.\\
68 struct can_filter rfilter[4];
70 rfilter[0].can_id = 0x80001234; /* Exactly this EFF frame */
71 rfilter[0].can_mask = CAN_EFF_MASK; /* 0x1FFFFFFFU all bits valid */
72 rfilter[1].can_id = 0x123; /* Exactly this SFF frame */
73 rfilter[1].can_mask = CAN_SFF_MASK; /* 0x7FFU all bits valid */
74 rfilter[2].can_id = 0x200 | CAN_INV_FILTER; /* all, but 0x200-0x2FF */
75 rfilter[2].can_mask = 0xF00; /* (CAN_INV_FILTER set in can_id) */
76 rfilter[3].can_id = 0; /* don't care */
77 rfilter[3].can_mask = 0; /* ALL frames will pass this filter */
79 setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
82 Für die Anwendung der Filterfunktion muss die Include-Datei \verb+raw.h+
83 eingebunden werden. Eine Veränderung des Filters zur Laufzeit ist über
84 weitere Aufrufe von \man{setsockopt}{2} möglich.
87 \subsection{Testprogramme}
89 \item[candump] ist ein Programm, das über den RAW-Socket CAN-Frames
90 von einem oder mehreren CAN-Device(s) einliest und in lesbarer Form -
91 auf Wunsch mit Zeitstempeln - ausgibt. Die beschriebene
92 Filterfunktion der RAW-Sockets (s.o.) ist über Komandozeilenparameter
93 einstellbar. Ebenso wie eine Ausgabe im bekannten ASC-Format.
95 Wird \verb+candump+ ohne Parameter aufgerufen, erscheint ein Hilfetext.
98 hartko@pplinux1:~/llcf/src/test > ./candump
99 Usage: candump [can-interfaces]
100 Options: -m <mask> (default 0x00000000)
101 -v <value> (default 0x00000000)
102 -i <0|1> (inv_filter)
103 -t <type> (timestamp: Absolute/Delta/Zero)
105 -s <level> (silent mode - 1: animation 2: nothing)
106 -b <can> (bridge mode - send received frames to <can>)
107 -a (create ASC compatible output)
108 -1 (increment interface numbering in ASC mode)
109 -A (enable ASCII output)
111 When using more than one CAN interface the options
112 m/v/i have comma seperated values e.g. '-m 0,7FF,0'
115 {\large Beispiele für die Benutzung von {\tt candump}:}\\
117 Einfaches Anzeigen von zwei CAN-Bussen. Timestamps beginnen bei Null.
120 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -t z
121 (0.000000) can0 3FC [1] 05
122 (0.001185) can0 64 [8] 20 14 3F 16 B8 0B 98 3A
123 (0.002396) can0 66 [8] 39 00 A1 45 00 00 00 00
124 (0.015395) can0 C9 [6] 13 01 00 00 10 27
125 (0.028665) can1 110 [3] 87 00 00
126 (0.049990) can0 3FC [1] 05
127 (0.051176) can0 64 [8] 20 14 3F 16 B8 0B 98 3A
128 (0.052386) can0 66 [8] 39 00 A1 45 00 00 00 00
129 (0.065397) can0 C9 [6] 13 01 00 00 10 27
130 (0.099974) can0 3FC [1] 05
131 (0.101159) can0 64 [8] 20 14 3F 16 B8 0B 98 3A
134 Einfaches Anzeigen von zwei CAN-Bussen. Timestamps beginnen bei
135 Null. Ausgabe im ASC-Format. Die Kanalnummern werden um 1 erhöht
136 (\verb+can0+ $\Rightarrow$ 1, \verb+can1+ $\Rightarrow$ 2).
139 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -t z -a -1
140 date Tue Oct 18 09:39:57 2005
141 base hex timestamps absolute
142 no internal events logged
143 0.0000 1 3FC Rx d 1 05
144 0.0011 1 64 Rx d 8 20 14 3F 14 B8 0B 98 3A
145 0.0023 1 66 Rx d 8 49 00 A1 45 00 00 00 00
146 0.0154 1 C9 Rx d 6 13 01 00 00 10 27
147 0.0286 2 110 Rx d 3 87 00 00
148 0.0500 1 3FC Rx d 1 05
149 0.0512 1 64 Rx d 8 20 14 3F 14 B8 0B 98 3A
150 0.0524 1 66 Rx d 8 49 00 A1 45 00 00 00 00
151 0.0654 1 C9 Rx d 6 13 01 00 00 10 27
152 0.0999 1 3FC Rx d 1 05
153 0.1011 1 64 Rx d 8 20 14 3F 14 B8 0B 98 3A
156 Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
157 Vergleichswert 0x66. Zeitstempel mit Differenzzeit.
160 hartko@pplinux1:~/llcf/src/test > candump can0 -m 0x7FC -v 0x66 -t d
161 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066
162 (0.000000) can0 64 [8] 1B 14 3F 21 B8 0B 98 3A
163 (0.001202) can0 66 [8] B9 DA A0 45 00 00 00 00
164 (0.048833) can0 64 [8] 1B 14 3F 21 B8 0B 98 3A
165 (0.001192) can0 66 [8] EB DA A0 45 00 00 00 00
166 (0.048790) can0 64 [8] 1B 14 3F 21 B8 0B 98 3A
169 Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
170 Vergleichswert 0x66. Der CAN-Bus \verb+can1+ wird ohne Filterung angegeigt.
173 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -m 0x7FC,0 -v 0x66,0 -t d
174 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066
175 (0.000000) can0 64 [8] 20 14 3F 14 B8 0B 98 3A
176 (0.001202) can0 66 [8] 48 00 A1 45 00 00 00 00
177 (0.048794) can0 64 [8] 20 14 3F 14 B8 0B 98 3A
178 (0.001201) can0 66 [8] 48 00 A1 45 00 00 00 00
179 (0.026214) can1 110 [3] 87 00 00
180 (0.003006) can1 41B [4] 1C 12 02 FF
181 (0.019612) can0 64 [8] 20 14 3F 14 B8 0B 98 3A
182 (0.001201) can0 66 [8] 48 00 A1 45 00 00 00 00
183 (0.048770) can0 64 [8] 20 14 3F 14 B8 0B 98 3A
186 Invertiertes Filtern von Nachrichten auf \verb+can0+ mit Bit-Maske 0x7FC und
187 Vergleichswert 0x66. Der CAN-Bus \verb+can1+ wird ohne Filterung
188 angegeigt. Der Timestamp wird absolut ausgegeben, d.h. in Sekunden
189 seit 01.01.1970. Analog \verb-'date +%s'- - siehe \man{date}{1}.
192 hartko@pplinux1:~/llcf/src/test > candump can0 can1 -m 0x7FC,0 -v 0x66,0 -i 1,0 -t a
193 CAN ID filter[0] for can0 set to mask = 000007FC, value = 00000066 (inv_filter)
194 (1129625880.726372) can0 C9 [6] 13 01 00 00 10 27
195 (1129625880.739543) can1 110 [3] 87 00 00
196 (1129625880.760949) can0 3FC [1] 05
197 (1129625880.776377) can0 C9 [6] 13 01 00 00 10 27
198 (1129625880.810983) can0 3FC [1] 05
199 (1129625880.811580) can1 41C [4] 1D 12 02 FF
200 (1129625880.826379) can0 C9 [6] 13 01 00 00 10 27
201 (1129625880.839544) can1 110 [3] 87 00 00
202 (1129625880.860955) can0 3FC [1] 05
203 (1129625880.876380) can0 C9 [6] 13 01 00 00 10 27
204 (1129625880.910986) can0 3FC [1] 05
207 \item[tst-raw] ist ein Programm zum Testen des RAW-Sockets. Es nutzt
208 den \man{read}{2} Systemcall.
209 \item[tst-raw-filter] ist ein Programm zum Testen der Filterfunktion
210 des RAW-Sockets. Es nutzt den \man{recvfrom}{2} Systemcall.
211 \item[tst-raw-sendto] ist ein Programm zum Senden eines CAN-Frame auf
212 einem nicht an ein besonders Interface gebundenen RAW-Socket mit
213 dem \man{sendto}{2} Systemcall.
214 \item[canecho] ist ein Programm, dass nach dem Empfang eines
215 CAN-Frames dieses mit einer um 1 erhöhten CAN-ID wieder aussendet. Es
216 war für die ersten Versuche mit einem realen CAN-Bus implementiert
217 worden. Seit dem \LL\ V0.6 ist jedoch die lokale Echofunktionalität
218 realisiert, so dass \verb+canecho+ nur noch dazu geeignet ist, einen
219 Volllast-Test auszuführen ...