使用socket库开发J1939读取器时出现CAN_J1939属性缺失错误求助
Python Socket J1939读取器报错排查:AttributeError: 'socket' has no attribute 'CAN_J1939'
问题描述
用户尝试开发简易J1939读取器,代码如下:
import socket with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) addr = "can3", socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR s.bind(addr) while True: data, addr = s.recvfrom(128) print(f'{addr[3]:02x} {addr[2]:05x}') for j in range(len(data)): if j % 8 == 0 and j != 0: print(f'\n{j:05x} ') print(f'{j:02x}') print('\n')
运行后触发错误:AttributeError: module 'socket' has no attribute 'CAN_J1939'
环境信息:
- Buildroot系统,已安装
can-utils及J1939相关库 - SoC运行Linux内核v3.10(CAN_J1939自v3.5起内核支持)
排查步骤
验证Python Socket模块的J1939支持
Python原生socket模块对CAN_J1939的封装并非所有版本默认包含。在目标系统的Python交互环境中执行以下命令,检查是否存在相关常量:import socket print(dir(socket))若输出中无
CAN_J1939、J1939_NO_NAME等项,说明当前Python版本未编译J1939支持,需重新编译Python并开启对应选项。检查Buildroot配置
- 进入Buildroot配置界面(
make menuconfig),确认Target packages -> Interpreter languages and scripting -> Python下是否开启了CAN/J1939相关编译选项,或是否安装了python-can第三方库。 - 验证内核J1939配置:在目标系统执行
zcat /proc/config.gz | grep CAN_J1939,确保CONFIG_CAN_J1939=y、CONFIG_CAN_J1939_DSRC=y等选项已启用(即使内核版本支持,Buildroot编译时可能未开启)。
- 进入Buildroot配置界面(
测试系统级J1939功能
使用can-utils工具验证底层功能是否正常,执行:j1939listen can3若该命令能正常接收数据,说明内核和硬件层J1939功能正常,问题出在Python Socket封装;若命令报错,需先排查内核驱动或硬件连接。
改用第三方Python库
若原生Socket模块无法支持,可使用python-can库实现功能。在Buildroot中安装该库后,示例代码如下:from can.interfaces.j1939 import J1939Bus bus = J1939Bus(interface='socketcan', channel='can3') while True: message = bus.recv() print(f"Source Address: {message.source_address:02x}, PGN: {message.pgn:05x}") print(f"Data: {message.data.hex()}")
内容的提问来源于stack exchange,提问作者WhiteRau
相关产品推荐
相关产品推荐

