如何刷新蓝牙设备名称【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);
}
我正在开发一个连接 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);
}