首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送CAN J1939消息

发送CAN J1939消息
EN

Stack Overflow用户
提问于 2021-01-15 06:01:05
回答 1查看 483关注 0票数 1

我想得到一个代码示例发送一个简单的CAN消息与J1939堆栈使用Python.

下面的网站有一个接收J1939消息的简单示例:https://justkding.me/thoughts/python-sae-j1939-socket-support

这个页面上的代码非常适合接收:

代码语言:javascript
复制
    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消息的简单方法。

下面是对内核文档的引用:https://www.kernel.org/doc/html/latest/networking/j1939.html

下面是一个可能有用的testj1939的C实用程序代码:https://github.com/linux-can/can-utils/blob/master/testj1939.c

有人能在Python语言中发布一段简单的代码来使用J1939协议发送消息吗?任何说明如何正确做到这一点的文档都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-01-15 07:21:19

解决方案是使用sendto()而不是send()。在J1939中,作为参数提供给send()的字节只是有效负载。因此,需要使用sendto()来指定目的地址。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65727510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档