使用PyBluez连接蓝牙客户端与服务器时触发‘Operation now in progress’异常
解决PyBluez RFCOMM连接报错及服务发现问题
核心问题拆解
- 本地蓝牙服务发现失败:不指定
localhost找不到服务,说明蓝牙适配器的本地服务广播未正常工作 - 连接报错:
Errno 115是连接超时/未完成,Errno 16是资源被占用,多因前一次连接未正常释放
分步解决方案
1. 修复本地服务发现问题
- 先确保蓝牙适配器启用:
sudo systemctl start bluetooth bluetoothctl power on - 设置适配器为可发现状态,否则本地服务无法被扫描到:
bluetoothctl discoverable on - 修改服务器脚本的绑定逻辑,不要绑定到
localhost,改为绑定到蓝牙适配器MAC地址或通配地址:# 替换原bind行,二选一即可 server_sock.bind(("", PORT_ANY)) # 通配地址,适配所有本地蓝牙适配器 # 或者指定你的蓝牙MAC,比如("AA:BB:CC:DD:EE:FF", PORT_ANY)
2. 解决连接报错问题
- 清理占用资源:出现
Errno 16时,先杀掉相关Python进程,再释放RFCOMM端口:sudo killall python3 sudo rfcomm release all - 完善服务器异常处理:原示例未处理连接异常后的资源释放,在服务器的
accept循环中添加捕获逻辑,避免资源泄漏:try: client_sock, client_info = server_sock.accept() print(f"Accepted connection from {client_info}") # 保留原有通信代码... except Exception as e: print(f"Connection error: {e}") if 'client_sock' in locals(): client_sock.close() continue finally: server_sock.close() - 客户端改用蓝牙MAC连接:不要用
localhost,直接指定适配器MAC地址:target_address = "你的蓝牙适配器MAC地址" # 执行bluetoothctl show可查看 sock.connect((target_address, port))
3. 额外排查项
- 升级PyBluez到最新兼容版:
pip install --upgrade pybluez - 查看已占用的RFCOMM端口,确认没有冲突:
rfcomm list - 赋予用户蓝牙操作权限,避免权限问题:
执行后重新登录生效,或者直接用sudo usermod -aG bluetooth $USERsudo运行脚本。
内容的提问来源于stack exchange,提问作者S3gfault
相关产品推荐
相关产品推荐

