SocketCAN - SocketCAN
SocketCAN je sada otevřený zdroj UMĚT ovladače a síťový zásobník přispěl Výzkum společnosti Volkswagen do Linuxové jádro. Dříve známý jako Nízkoúrovňový rámec CAN (LLCF).
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Socketcan.png/300px-Socketcan.png)
Tradiční ovladače CAN pro Linux jsou založeny na modelu znakových zařízení. Obvykle umožňují pouze odesílání a příjem z řadiče CAN. Konvenční implementace této třídy ovladače zařízení umožňují přístup k zařízení pouze jedinému procesu, což znamená, že všechny ostatní procesy jsou mezitím blokovány. Kromě toho se tyto ovladače obvykle mírně liší v rozhraní prezentovaném aplikaci, což potlačuje přenositelnost. Koncept SocketCAN na druhé straně využívá model síťových zařízení, který umožňuje více aplikacím přístup k jednomu zařízení CAN současně. Jedna aplikace také může přistupovat k více sítím CAN paralelně.
Koncept SocketCAN rozšiřuje Berkeley zásuvky API v Linuxu zavedením nové rodiny protokolů PF_CAN, která koexistuje s dalšími rodinami protokolů, jako je PF_INET, internetový protokol. Komunikace se sběrnicí CAN se proto provádí analogicky jako použití internetového protokolu přes zásuvky. Základní součásti SocketCAN jsou ovladače síťových zařízení pro různé řadiče CAN a implementace rodiny protokolů CAN. Rodina protokolů, PF_CAN, poskytuje struktury umožňující různé protokoly na sběrnici: Nezpracované zásuvky pro přímou komunikaci CAN a transportní protokoly pro připojení point-to-point. Správce vysílání, který je součástí rodiny protokolů CAN, poskytuje funkce např. pro pravidelné zasílání zpráv CAN nebo realizaci komplexních filtrů zpráv.
V 2.6.25 byly přidány opravy pro CAN Linuxové jádro. Mezitím byly přidány některé ovladače řadičů a pokračují práce na přidávání ovladačů pro různé řadiče.
Používání
Aplikace nejprve nastaví svůj přístup k rozhraní CAN inicializací soketu (podobně jako v komunikaci TCP / IP), poté svázáním soketu s rozhraním (nebo všemi rozhraními, pokud si to aplikace přeje). Po navázání lze zásuvku použít jako a UDP zásuvka přes číst
, psát si
, atd...
Krajta přidána podpora pro SocketCAN ve verzi 3.3.[1] Knihovna open source python-can poskytuje podporu SocketCAN pro Python 2 a Python 3[2][kruhový odkaz ].
Instalace zařízení CAN vyžaduje načtení modulu can_dev a konfiguraci IP spojení, aby bylo možné určit bitovou rychlost sběrnice CAN, například:
$ modprobe can_dev$ modprobe může$ modprobe can_raw$ sudo ip odkaz soubor can0 typ může bitrate 500000$ sudo ip odkaz soubor nahoru can0
K dispozici je také virtuální ovladač CAN pro účely testování, který lze načíst a vytvořit v systému Linux pomocí níže uvedených příkazů.
$ modprobe může$ modprobe can_raw$ modprobe vcan$ sudo ip link přidat dev vcan0 typ vcan$ sudo ip odkaz soubor nahoru vcan0$ ip link zobrazit vcan03: vcan0: mtu 16 qdisc stav fronty NEZNÁMÝ odkaz / plechovka
Následující fragment kódu je fungujícím příkladem SocketCAN API, který odesílá paket pomocí surového rozhraní. Vychází z poznámek uvedených v dokumentu Linuxové jádro.[3]
#zahrnout <stdio.h>#zahrnout <stdlib.h>#zahrnout <unistd.h>#zahrnout <string.h>#zahrnout <net/if.h>#zahrnout <sys/types.h>#zahrnout <sys/socket.h>#zahrnout <sys/ioctl.h>#zahrnout <linux/can.h>#zahrnout <linux/can/raw.h>inthlavní(prázdnota){ int s; int nbytů; struktur sockaddr_can adresa; struktur can_frame rám; struktur ifreq ifr; konst char *ifname = "vcan0"; -li((s = zásuvka(PF_CAN, SOCK_RAW, CAN_RAW)) == -1) { hrůza("Chyba při otevírání zásuvky"); vrátit se -1; } strcpy(ifr.ifr_name, ifname); ioctl(s, SIOCGIFINDEX, &ifr); adresa.can_family = AF_CAN; adresa.can_ifindex = ifr.ifr_ifindex; printf("% s při indexu% d n", ifname, ifr.ifr_ifindex); -li(svázat(s, (struktur sockaddr *)&adresa, velikost(adresa)) == -1) { hrůza("Chyba v propojení soketu"); vrátit se -2; } rám.can_id = 0x123; rám.can_dlc = 2; rám.data[0] = 0x11; rám.data[1] = 0x22; nbytů = psát si(s, &rám, velikost(struktur can_frame)); printf("Napsal% d bajtů n", nbytů); vrátit se 0;}
Paket lze analyzovat na rozhraní vcan0 pomocí nástroje candump, který je součástí nástrojů SocketCAN can-utils[4] balík.
uživatel @ server: ~ / can-utils $ ./candump vcan0 vcan0 123 [2] 11 22
Reference
- ^ http://bugs.python.org/issue10141
- ^ SocketCAN
- ^ Viditelné online z Dokumentace k jádru Linuxu nebo v
linux / Dokumentace / networking / can.txt
v posledních zdrojových stromech - ^ plechovky https://github.com/linux-can/can-utils/