在嵌入式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可以套接字,绑定行为不端的主要内容,如果未能解决你的问题,请参考以下文章