树莓派4向手机发送音频文件时出现BluetoothError[Errno104]问题排查
错误原因与修复方案
错误原因
- 协议不匹配:你用RFCOMM套接字直接发送裸二进制数据,但代码中指定的端口3对应OBEX对象推送协议(OPP)。OPP要求数据必须遵循OBEX协议规范(包含握手、文件元数据等结构),手机端收到不符合协议的裸字节流后会主动断开连接,触发
[Errno 104] Connection reset by peer错误。 - 缺少协议交互:即使连接成功,没有OBEX协议的文件信息(文件名、大小)交互,手机无法识别接收内容,直接重置连接。
修复方案
1. 使用OBEX协议实现文件传输
Python原生bluetooth库不支持OBEX,需用专门的OBEX工具或库:
方式一:用pyobex库实现(推荐)
先安装依赖:
pip install pyobex
替换后的代码:
from bluetooth import BluetoothSocket, RFCOMM from pyobex import Client, OBEXError server_mac = '34:29:12:5E:09:10' port = 3 # OPP协议端口 # 建立RFCOMM连接 sock = BluetoothSocket(RFCOMM) try: sock.connect((server_mac, port)) print("已连接到目标设备") except Exception as e: print("连接失败:", e) sock.close() exit(1) # 初始化OBEX客户端并发送文件 client = Client(sock) file_path = 'hallo_welt_mp3.wav' try: client.send_file(file_path) print("文件发送成功") except OBEXError as e: print("发送错误:", e) finally: client.close() sock.close()
方式二:用系统命令行工具发送
树莓派默认自带bluez工具集,直接用obexftp命令发送:
obexftp -b 34:29:12:5E:09:10 -p hallo_welt_mp3.wav
2. 必要的前置检查
- 确保手机与树莓派已完成蓝牙配对(配对时需确认PIN码匹配)
- 手机端开启蓝牙并允许接收文件(部分机型需手动开启“可被发现”或确认接收请求)
- 检查树莓派蓝牙服务状态:
sudo systemctl status bluetooth,确保服务正常运行 - 验证目标设备的OPP端口:执行
sdptool browse 34:29:12:5E:09:10,确认端口3对应OBEX Object Push服务
内容的提问来源于stack exchange,提问作者Lars Kager
相关产品推荐
相关产品推荐

