Отправка кадра CAN через UDP в Python - PullRequest
0 голосов
/ 05 августа 2020

Я установил соединение сокета UDP между двумя машинами Linux и могу легко отправить, например, b"Hello, World!". Но теперь мне нужно отправить приведенный ниже CAN-кадр

from can import Message
send_msg = Message(data=[1, 2, 3, 4, 5])

Итак, если я напечатаю send_msg, он покажет:

Timestamp:        0.000000    ID: 00000000    X                DLC:  5    01 02 03 04 05

Я хочу, чтобы это было напечатано на принимающей стороне. Коды отправки и получения, которые я использую, приведены ниже:

Отправка:

import socket

UDP_IP = "10.140.189.249"
UDP_PORT = 5005
from can import Message
send_msg = Message(data=[1, 2, 3, 4, 5])

print(send_msg)
MESSAGE = send_msg

print("UDP target IP: %s" % UDP_IP)
print("UDP target port: %s" % UDP_PORT)
print("message: %s" % MESSAGE)

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

Здесь я знаю, что MESSAGE = send_msg неверно.

Прием

import socket

UDP_IP = "0.0.0.0"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
    rec_msg, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
    print("received message: %s" % rec_msg)

Пожалуйста, сообщите

1 Ответ

1 голос
/ 05 августа 2020

Поскольку физический уровень соединения UDP и соединения CAN существенно различаются, вы не можете отправлять кадры CAN через UDP. Что, конечно, возможно, так это отправить полезную нагрузку кадра CAN и собрать сообщение CAN на принимающей стороне: т.е. на отправляющей стороне:

sock.sendto(b“12345“, (UDP_IP, UDP_PORT))

И на принимающей стороне:

msg = Message(data=bytearray(recv_msg))

Скорее всего, вы хотите передать не только данные кадра CAN, но также идентификаторы и другие поля.

Другой возможностью было бы выделить объект сообщения на отправляющей стороне и разобрать его на принимающей стороне, используя pickle.dumps и pickle.loads

Все функции CAN-шины, такие как арбитраж, кадры ошибок и т. д. c. невозможно имитировать при UDP-соединении.

...