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

Linux下无法获取RSSI及设备频繁断开连接问题求助

Linux下Web Bluetooth BLE问题排查与解决

一、系统层面基础排查

  • 确认蓝牙服务状态
    执行命令检查蓝牙服务是否正常运行:

    sudo systemctl status bluetooth
    

    未启动则启动服务并设置开机自启:

    sudo systemctl start bluetooth
    sudo systemctl enable bluetooth
    
  • 调整蓝牙栈配置
    编辑/etc/bluetooth/main.conf,确保以下配置项正确:

    ControllerMode = dual
    AutoEnable = true
    

    修改后重启蓝牙服务:

    sudo systemctl restart bluetooth
    
  • 授予浏览器蓝牙权限
    将当前用户加入bluetooth组,避免权限不足:

    sudo usermod -aG bluetooth $USER
    

    部分浏览器(如Chrome)需添加启动参数启用BLE特性:

    google-chrome --enable-experimental-web-platform-features --use-bluez
    

二、代码适配与问题修复

1. 设备频繁断开连接

  • 连接时启用keepAlive选项维持连接:
    device.gatt.connect({ keepAlive: true });
    
  • 优化重连逻辑,避免频繁重试:
    device.addEventListener('gattserverdisconnected', (event) => {
      setTimeout(() => {
        event.target.gatt.connect().catch(err => console.error('重连失败:', err));
      }, 1000);
    });
    

2. 无法获取RSSI(广播监听失效)

  • 先校验设备是否支持广播监听:
    if (!device.watchAdvertisements) {
      console.error('当前设备不支持广播监听');
      return;
    }
    
  • 调整监听时机,确保未连接时监听广播:
    async function getRssiBeforeConnect() {
      return new Promise((resolve, reject) => {
        const abortController = new AbortController();
        let timeoutId;
    
        const handleAdv = (event) => {
          abortController.abort();
          clearTimeout(timeoutId);
          device.removeEventListener('advertisementreceived', handleAdv);
          resolve(event.rssi + " (before connection)");
        };
    
        device.addEventListener('advertisementreceived', handleAdv);
        device.watchAdvertisements({ signal: abortController.signal });
    
        timeoutId = setTimeout(() => {
          abortController.abort();
          device.removeEventListener('advertisementreceived', handleAdv);
          reject(new Error('Failed to get RSSI'));
        }, 3000);
      });
    }
    
    // 使用示例
    getRssiBeforeConnect()
      .then(rssi => {
        console.log('RSSI:', rssi);
        return device.gatt.connect();
      })
      .catch(err => console.error(err));
    

3. 重连期间无法扫描设备

  • 避免同时执行连接与扫描操作,重连前终止当前扫描任务:
    let scanAbortController;
    
    function startScan() {
      if (scanAbortController) scanAbortController.abort();
      scanAbortController = new AbortController();
      
      navigator.bluetooth.requestDevice({
        filters: [{ services: ['你的服务UUID'] }],
        signal: scanAbortController.signal
      })
      .then(device => { /* 处理设备逻辑 */ })
      .catch(err => console.error('扫描失败:', err));
    }
    
    function reconnectDevice(device) {
      if (scanAbortController) scanAbortController.abort();
      device.gatt.connect().catch(err => {
        console.error('重连失败,启动重新扫描');
        startScan();
      });
    }
    
  • 清除设备缓存,解决扫描不显示问题:
    device.forget().then(() => {
      console.log('设备缓存已清除,重新扫描');
      startScan();
    });
    

三、额外排查点

  • 检查蓝牙硬件兼容性:执行hciconfig hci0查看适配器状态,若硬件支持不佳可更换蓝牙适配器测试。
  • 更新系统与浏览器:确保Chrome/Firefox为最新版本,Linux内核及蓝牙驱动更新至稳定版。

内容的提问来源于stack exchange,提问作者Ved Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:23:27