在嵌入式linux上使用python可以套接字,绑定行为不端

Posted

技术标签:

【中文标题】在嵌入式linux上使用python可以套接字,绑定行为不端【英文标题】:Using python can sockets on embedded linux, bind misbehaves 【发布时间】:2016-03-17 17:12:13 【问题描述】:

我正在尝试使用在嵌入式 linux 上运行的 python 3.4 连接到 CAN 驱动程序。 从理论上讲,python 3.3 中有一个不错的 socketcan 库 但导入会失败。

root@unit-901-100-sn003:~/francis# python3 Python 3.4.3(默认,2015 年 10 月 14 日,21:23:51) 进口可以 ImportError: 没有名为“can”的模块

回到基础。实际上,在有人指出之前我正在研究这个 #!/usr/bin/env python3

import socket;

can_device = "can0";

sock_instance = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW);
can_index = socket.if_nametoindex(can_device);
addr = (socket.AF_CAN, can_index); 
sock_instance.bind(addr);

root@unit-901-100-sn003:~/francis# ./sockio.py 回溯(最近一次通话最后): 文件“./sockio.py”,第 10 行,在 sock_instance.bind((can_device, can_index)); TypeError:函数只需要 1 个参数(给定 2 个)

该程序如上所示失败。 我显然是在传递一个参数元组,还是我疯了?

如果我只是创建了一个简单的套接字

si = socket.socket();
si.bind(('0.0.0.0', 8000));

它的执行使 bind 可以识别一个元组。

【问题讨论】:

回溯似乎与您向我们展示的代码不匹配... 为了能够import can,您可能需要pip install pycan 或类似的东西...... 抱歉,我删掉了文件,删除了调试打印等,并且没有检查与源匹配的跟踪。我知道粗鲁和粗心!我已经取得了更多的成功,似乎 bind 期望一个逻辑名称作为一个字符串并执行它自己的 if_nametoindex() #!/usr/bin/env python3 import socket; can_device = "can0"; sock_instance = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW); addr = (can_device,); sock_instance.bind(addr);这不会引发异常,所以我会继续看看它是否变得更有用。 @FrancisCagney 你已经尝试过python-can 项目了吗?它同时支持 Python 2 和 3 以及 Windows。 我实际上在 can4python 库方面取得了相当大的成功。我现在可以发送,但我收到的是乱码。实际上我正在使用 canframe.CanFrame() 创建我发送的内容,它发送的内容似乎是乱码,但可以正确接收到 can 监视器。只需要弄清楚如何使用 CanFrame 来处理收到的内容。 【参考方案1】:

python-can 库实际上有一个调用 socketcan 的ctypes 和native python 实现。

绑定是这样的:

channel = "can0"
sock = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
sock.bind((channel,))

【讨论】:

以上是关于在嵌入式linux上使用python可以套接字,绑定行为不端的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 程序中嵌入 Python

C ++套接字不接收传入数据包,在Python中工作

net.tcp 绑定上的线程不足 - TCP 错误代码 10061

可以在Unix域套接字上使用SO_REUSEPORT吗?

我如何在 lighttpd 服务器上启用套接字

python2.7_2.2_在套接字服务器上使用ForkingMixIn