[PYTHON] Hallo Welt! Mit virtueller CAN-Kommunikation

Überblick

Simulieren wir die CAN-Kommunikation, die für im Fahrzeug eingebettete Anwendungen in einem PC verwendet wird. Weitere Informationen zu CAN finden Sie im folgenden Artikel. https://qiita.com/fattolys/items/e8f8081d3cb42d7da0f6

Das Folgende ist die Netzwerkkonfiguration des diesmal erstellten Systems. Wirf ein CAN-Paket von Nord2 nach Nord1. vcan.jpg

Umgebung

Erstellen Sie eine virtuelle Schnittstelle

Erstellen Sie eine virtuelle CAN-Schnittstelle mit dem folgenden Befehl.

 $ modprobe vcan
 $ sudo ip link add dev vcan0 type vcan
 $ sudo ip link set up vcan0

Wenn Sie auf ifconfig klicken, sehen Sie, dass vcan0 wie unten gezeigt hinzugefügt wird.

$ ifconfig
vcan0: flags=193<UP,RUNNING,NOARP>  mtu 72
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Nord 1 Codeerstellung

Mit Nord 1 zeigt vcan 0 die eingehenden Pakete nacheinander an.

vcan_nord_1.py


# ref: https://elinux.org/Python_Can
import socket
import struct

# CAN frame packing/unpacking (see `struct can_frame` in <linux/can.h>)
can_frame_fmt = "=IB3x8s"

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])

# create a raw socket and bind it to the given CAN interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(("vcan0",))

while True:
    cf, addr = s.recvfrom(16)
    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

Nord 2 Codeerstellung

Nord2 wirft ein "hellowld" -Paket an vcan0.

vcan_nord_2.py


# ref: https://elinux.org/Python_Can
import socket
import struct

# CAN frame packing/unpacking (see `struct can_frame` in <linux/can.h>)
can_frame_fmt = "=IB3x8s"

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

# create a raw socket and bind it to the given CAN interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(("vcan0",))

try:
    s.send(build_can_frame(0x01, b'hellowld'))
except socket.error:
    print('Error sending CAN frame')

Funktionsprüfung

Starten Sie vcan_nord_1.py im Terminal und führen Sie vcan_nord_2.py in einem anderen Terminal aus. Wie unten gezeigt, zeigt das Terminal auf der Seite vcan_nord_1.py an, dass das Paket angekommen ist. Peek 2020-02-16 16-35.gif

von jetzt an

Es könnte interessant sein, ein Auto, das auf einer 3DCG-Plattform wie Unity läuft, mithilfe der vcan-Kommunikation herzustellen.

Referenzseite

https://elinux.org/Bringing_CAN_interface_up https://elinux.org/Python_Can

Recommended Posts

Hallo Welt! Mit virtueller CAN-Kommunikation
Hallo Welt mit ctypes
Hallo, Welt mit Docker
Hallo Welt auf Flasche
Zeichne Hallo Welt mit mod_wsgi
Hallo Welt mit Flask + Hamlish
Bis hallo Welt mit Zappa
Python beginnend mit Hallo Welt!
[Hinweis] Hallo Weltausgabe mit Python
Hallo Welt
Hallo Welt! Von QPython mit Braincrash
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Hallo Welt! Von QPython mit Brainfu * k
Pymacs helloworld
Cython Helloworld
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Hallo Welt mit gRPC / go in Docker-Umgebung
Begrüßen Sie die Welt mit Python mit IntelliJ
Hallo Welt mit Nginx + Uwsgi + Python auf EC2
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erste Python ① Umgebungskonstruktion mit Pythonbrew & Hello World !!
Erstellen Sie in Tornado einen HTTP-Server (Hello World)
Serielle Kommunikation mit Python
Socket-Kommunikation mit Python
web2py Hinweis: Hallo Welt
Serielle Kommunikation mit Python
RabbitMQ Tutorial 1 ("Hallo Welt!")
HTTP-Kommunikation mit Python
Hallo Welt mit Django
Djangos erste Hallo Welt
Virtuelle Umgebung mit Python 3.6
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic, durch logistische Regression vorhersagen.
Hallo Welt mit Google App Engine (Java 8) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 8) + Servlet API 3.1 + Gradle
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic durch logistische Regression vorhersagen - Vorhersage / Bewertung
Hallo Welt mit Google App Engine (Java 11) + Spring Boot + Gradle
Bis Hello World mit Flask + uWSGI + Nginx @ Sakuras VPS (CentOS 6.6)
Hallo Welt in GO-Sprache
Hallo Welt (Anfänger) mit Django
Wechseln Sie die virtuelle Umgebung mit Jupiter
Erste Schritte mit Heroku-Viewing Hello World in Python Django mit Raspberry PI 3
Beginnen Sie mit Windows, nicht so beängstigend Nim ① Es ist wie Hallo Welt.