[英]Sending a CAN J1939 message
我想獲得一個代碼示例,以使用 Python 使用 J1939 堆棧發送簡單的 CAN 消息。
以下 web 站點有一個接收 J1939 消息的簡單示例: https://justkding.me/thoughts/python-sae-j1939-socket-support
此頁面上的代碼非常適合接收:
import socket
def main():
with socket.socket(
family=socket.PF_CAN, type=socket.SOCK_DGRAM, proto=socket.CAN_J1939
) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
addr = "vcan0", socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
s.bind(addr)
while True:
data, addr = s.recvfrom(128)
print("{:02x} {:05x}:".format(addr[3], addr[2]), end="")
for j in range(len(data)):
if j % 8 == 0 and j != 0:
print("\n{:05x} ".format(j), end="")
print(" {:02x}".format(data[j]), end="")
print("\n", end="")
if __name__ == "__main__":
main()
我一直在閱讀文檔,但似乎找不到在 Python 中發送 J1939 消息的簡單方法。
Here's the reference to the kernel documentation: https://www.kernel.org/doc/html/latest/networking/j1939.html
這是一個可能有用的 testj1939 的 C 實用程序代碼: https://github.com/linux-can/can-utils/blob/master/testj1939.Z4A8A08F046D37B73795
有人可以發布一個簡單的代碼來使用 Python 中的 J1939 協議發送消息嗎? 任何顯示如何正確執行此操作的文檔將不勝感激。
謝謝你。
解決方案是使用 sendto() 而不是 send()。 在 J1939 中,作為參數提供給 send() 的字節只是有效負載。 因此,需要 sendto() 來指定目的地址。
import socket
def main():
s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
addr_source = "vcan0", socket.J1939_NO_NAME, socket.J1939_NO_PGN, 0x20
addr_destination = "vcan0", socket.J1939_NO_NAME, 0x12300, 0x30
s.bind(addr_source)
data = b'\x01\x02\x03\x04\x05\x06\x07\x08'
s.sendto(data, addr_destination)
if __name__ == "__main__":
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.