[PYTHON] Bonjour tout le monde! Avec la communication CAN virtuelle

Aperçu

Simulons la communication CAN utilisée pour les applications embarquées embarquées dans un PC. Vous pouvez en savoir plus sur CAN dans l'article ci-dessous. https://qiita.com/fattolys/items/e8f8081d3cb42d7da0f6

Voici la configuration réseau du système créé cette fois. Lancez un paquet CAN de Nord2 vers Nord1. vcan.jpg

environnement

Créer une interface virtuelle

Créez une interface CAN virtuelle avec la commande suivante.

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

Si vous appuyez sur ifconfig, vous pouvez voir que vcan0 est ajouté comme indiqué ci-dessous.

$ 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

Création de code Nord 1

Nord 1 fait que vcan 0 affiche les paquets entrants de manière séquentielle.

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))

Création de code Nord 2

Nord2 lance un paquet "hellowld" à 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')

Contrôle de fonctionnement

Démarrez vcan_nord_1.py dans le terminal et exécutez vcan_nord_2.py dans un autre terminal. Comme indiqué ci-dessous, le terminal du côté vcan_nord_1.py indiquera que le paquet est arrivé. Peek 2020-02-16 16-35.gif

à partir de maintenant

Il peut être intéressant de créer une voiture fonctionnant sur une plate-forme 3DCG telle que Unity en utilisant la communication vcan.

Site de référence

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

Recommended Posts

Bonjour tout le monde! Avec la communication CAN virtuelle
bonjour le monde avec ctypes
Bonjour le monde avec Docker
Bonjour le monde sur flacon
Dessinez bonjour le monde avec mod_wsgi
Bonjour le monde avec Flask + Hamlish
Jusqu'à bonjour le monde avec zappa
Python commençant par Hello world!
[Note] Sortie Hello world avec python
Bonjour le monde
Hello World! Par QPython avec Braincrash
Hello World et détection de visage avec opencv-python 4.2
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Hello World! Par QPython avec Brainfu * k
Pymacs helloworld
cython helloworld
Hello World et détection de visage avec OpenCV 4.3 + Python
Hello World avec gRPC / go dans l'environnement Docker
Dites bonjour au monde avec Python avec IntelliJ
Hello World avec nginx + uwsgi + python sur EC2
Créez une application Hello World avec un seul fichier avec django
Premier python ① Construction de l'environnement avec pythonbrew & Hello World !!
Créer un serveur "Hello World" (HTTP) dans Tornado
Communication série avec Python
Communication de socket avec Python
web2py Remarque: Bonjour le monde
Communication série avec python
Tutoriel RabbitMQ 1 ("Hello World!")
Communication HTTP avec Python
Hello World avec Django
Le premier Hello World de Django
Environnement virtuel avec Python 3.6
Prédisons les survivants du Hello World de Kaggle, Titanic par régression logistique-Modélisation-
Hello World avec Google App Engine (Java 8) + Spring Boot + Gradle
Hello World avec Google App Engine (Java 8) + API Servlet 3.1 + Gradle
Prédisons les survivants de Hello World, Titanic de Kaggle par régression logistique-Prédiction / Évaluation-
Hello World avec Google App Engine (Java 11) + Spring Boot + Gradle
Jusqu'à Hello World avec Flask + uWSGI + Nginx @ Sakura's VPS (CentOS 6.6)
Afficher la communication Python avec Fiddler
Hello World en langue GO
Hello World (débutant) avec Django
Changer d'environnement virtuel avec jupyter
Premiers pas avec Heroku-Viewing Hello World en Python Django avec Raspberry PI 3
Commencez avec Windows, pas si effrayant Nim ① C'est comme bonjour le monde.