You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 $USER
    
    执行后重新登录生效,或者直接用sudo运行脚本。

内容的提问来源于stack exchange,提问作者S3gfault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:30:11