我必须构建一个扫描BLE设备的应用程序,并返回它的数据。 除非我使用过滤器,否则设备不会在扫描时显示。
UUID 不是一个选项,并且设备不会广播其名称(使用nrfConnect
扫描时显示 N/A。
我正在尝试通过MAC地址扫描它。但是,我不知道MAC地址,因为它可以是任何类型的设备,因此应用程序以前不会知道设备的MAC地址。
我已经知道该设备的地址上有一个前缀,即F8:36:9B
。问题是后缀。我如何(如果可能(制作一个正则表达式作为参数传递以查找设备 MAC 地址的所有可能匹配项?
正则表达式本身,我有,([A-Fa-f0-9]{2}:){2}[A-Fa-f0-9]{2}
,我从Android蓝牙扫描过滤器部分字符串匹配中获得。
我只是不知道如何在扫描过滤器上实现它。
ScanFilter filterMac = new ScanFilter.Builder().setDeviceAddress(/**THE_SUFIX_AND_REGEX*/).build();
可能吗?如果是,那又如何?
我尝试过的所有方法,都出现此错误:
错误:设备地址无效
我尝试使用for
循环生成所有可能的匹配并将其保存到ArrayList
,然后将其添加到过滤器列表中,但我得到了一个OutOfMemoryException
,因为结果是超过 1600 万种可能性。
使用过滤器是不可能的。你必须过滤自己...就像你已经做过的那样
经过一番挣扎,我找到了解决问题的方法。 它本身并没有回答这个问题,即是否可以使用正则表达式作为过滤器来扫描 MAC 地址。 但是,我设法正确扫描了我需要的设备。 这是我所做的:
首先,我按名称制作了一个过滤器。是的,名称,设备没有名称。所以我不得不考虑...如果我按名称过滤以扫描其name == null
的设备怎么办?
private List<ScanFilter> scanFilters() {
List<ScanFilter> list = new ArrayList<ScanFilter>();
ScanFilter scanFilterName = new ScanFilter.Builder().setDeviceName(null).build();
list.add(scanFilterName);
return list;
}
嗯,它奏效了!但是,它不仅让我获得了我需要的设备,还返回了大量其他设备以及它们。我的扫描一团糟,那么如何改进过滤器以只给我我需要的那些? 第二个过滤器(不在上面的scanFilters()
方法上,而是在scanResult
上(,是按MAC地址前缀(对于我的设备来说是一样的(。
private Set<String> btDevice = new LinkedHashSet<String>();
private ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
BluetoothDevice device = result.getDevice();
ScanRecord record = result.getScanRecord();
byte[] dataByteArray = record.getBytes();
if (device.getAddress().startsWith("F8:36:9B")) {
btDevice.add(device.getAddress());
}
}
};
瞧,我只用我需要的设备进行了扫描。 我仍然想知道主要问题是否可行,即我们是否可以在scanFilter()
上使用正则表达式,以过滤一系列内容(在本例中为 MAC 地址(。因此,如果有人对此有解决方案,请随时回答。 谢谢!