Android蓝牙。是否可以使用正则表达式作为过滤器来扫描 Mac 地址?
Android BLE. Is it possible to use a regex as a filter to scan for Mac Address?
我必须构建一个扫描 BLE 设备的应用程序,return 它是数据。
设备不会在扫描时显示,除非我使用过滤器。
UUID 不是一个选项,设备不会广播它的名称(使用 nrfConnect
.
扫描时显示 N/A
我正在尝试通过 MAC 地址扫描它。但是,我不知道 MAC 地址,因为它可以是任何类型的设备,所以应用程序之前不会知道设备的 MAC 地址。
我已经知道该设备的地址前缀是 F8:36:9B
。问题是后缀。我如何(如果可能的话)制作一个正则表达式作为参数传递以查找设备 MAC 地址的所有可能匹配项?
正则表达式本身,我有,([A-Fa-f0-9]{2}:){2}[A-Fa-f0-9]{2}
,我从 .
得到的
我只是不知道如何在 scanFilter 上实现它。
ScanFilter filterMac = new ScanFilter.Builder().setDeviceAddress(/**THE_SUFIX_AND_REGEX*/).build();
可能吗?如果是,那又如何?
我尝试了所有方法,但出现此错误:
Error: invalid device address
我尝试使用 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 地址)。因此,如果有人对此有解决方案,请随时回答。
谢谢!
无法使用过滤器。你必须过滤自己......就像你已经做的那样
我必须构建一个扫描 BLE 设备的应用程序,return 它是数据。 设备不会在扫描时显示,除非我使用过滤器。
UUID 不是一个选项,设备不会广播它的名称(使用 nrfConnect
.
我正在尝试通过 MAC 地址扫描它。但是,我不知道 MAC 地址,因为它可以是任何类型的设备,所以应用程序之前不会知道设备的 MAC 地址。
我已经知道该设备的地址前缀是 F8:36:9B
。问题是后缀。我如何(如果可能的话)制作一个正则表达式作为参数传递以查找设备 MAC 地址的所有可能匹配项?
正则表达式本身,我有,([A-Fa-f0-9]{2}:){2}[A-Fa-f0-9]{2}
,我从
我只是不知道如何在 scanFilter 上实现它。
ScanFilter filterMac = new ScanFilter.Builder().setDeviceAddress(/**THE_SUFIX_AND_REGEX*/).build();
可能吗?如果是,那又如何?
我尝试了所有方法,但出现此错误:
Error: invalid device address
我尝试使用 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 地址)。因此,如果有人对此有解决方案,请随时回答。
谢谢!
无法使用过滤器。你必须过滤自己......就像你已经做的那样