安卓 BLE.是否可以使用正则表达式作为过滤器来扫描 Mac 地址?



我必须构建一个扫描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 地址(。因此,如果有人对此有解决方案,请随时回答。 谢谢!

相关内容

最新更新