如何刷新蓝牙设备名称【Scan Cache】?

How to refresh Bluetooth device name [Scan Cache]?

我正在开发一个连接 BLE device 并发送 commands 的应用程序。 其中一个命令我们有 a command for changing the Bluetooth device name.

通信正常,但问题是当我们发送更改名称的命令时,BLE 确认输入并将输出发送给我们,但是当我们断开连接并 运行 LE 扫描它时显示与 previous 相同的名称,它应该显示 new name of the device.

如果我想获取设备的最新名称,我需要在设备中手动打开蓝牙页面并扫描那里,在扫描结果中它显示的是最新名称,当我再次打开应用程序时,这是在后台和 LE scan 功能下扫描 10-sec 延迟,它在列表中显示新名称。

如何让蓝牙管理器或系统refresh the cache or refresh data for that Bluetooth device

我不知道创建工单是否正确,但我已经在 google 问题跟踪器中创建了工单:https://issuetracker.google.com/issues/233924346

谢谢。

如您在移动设备的蓝牙设置中看到的最新名称,相信系统的蓝牙管理器没有问题。问题将出在代码的扫描功能中,因为它实际上并未刷新扫描列表,并且它可能将最后一个已知的 BLE 列表保存在缓存中的某处。如果您使用的是 third-party 库,您可能需要查看它们的文档或代码,了解扫描功能的实际工作原理。库中可能有 force-refresh 选项或其他内容。据我所知,为了节省设备的电池,实际刷新扫描列表会有延迟。

我遇到了同样的问题,通过从原始扫描数据中读取新名称解决了这个问题。通过这种方式,您永远不必使用 device.getName() which returns 来自缓存的旧名称。这是扫描回调函数的 Android Java 代码。

  private ScanCallback newscancallback()
    {
    ScanCallback scb;
  
    // Device scan callback.
    scb = new ScanCallback()
      {
      @Override
      public void onScanResult(int callbackType, ScanResult result)
        {
        super.onScanResult(callbackType, result);
        int n,k,len,getout;
        BluetoothDevice dev;
        byte[] rec;
        StringBuilder nameb;
        String name;
        
        
        dev = result.getDevice();
               
        // do not use dev.getName() which returns cached name
        // read current name from raw scan record instead 

        name = null;
        rec = result.getScanRecord().getBytes();
        len = rec.length;
        nameb = new StringBuilder();
        n = 0;
        getout = 0;
        // search scan record for name
        while(n < len-2 && rec[n] != 0 && getout == 0)
          {
          // rec[n] is length of next item
          // rec[n+1] is item type - look for 8 or 9=name
          // rec[n+2].. is the name, length rec[n]-1
          if(rec[n] > 1 && (rec[n+1] == 8 || rec[n+1] == 9)
            {  // found name
            for(k = 0 ; k < rec[n]-1 ; ++k)
              nameb.append((char)rec[n+2+k]);
            name = nameb.toString();
            getout = 1;
            }
          else  // go to next item
            n += rec[n] + 1;
          }
               
        // name is now null or the new name from the scan record

        }
    
      @Override
      public void onScanFailed(int errcode)
        {
        }
    
      @Override
      public void onBatchScanResults(List<ScanResult> result)
        {
        }
      };
    return (scb);
    }