我正在开发一个简单的应用程序来扫描BLE设备,并过滤扫描结果以仅查找我的ESP32。我希望通过过滤服务UUID来查找我的ESP32。我已确认广告数据中存在我的自定义服务(通过nRF Connect在“128位服务UUID的完整列表”中列出服务)然而,当我在扫描之前将服务UUID过滤器添加为ScanFilter
时,我的ScanCallback
从来没有被调用过。但是我可以删除扫描过滤器,并手动检查服务是否存在于ScanCallback
中。请参见下面的代码示例。
第一个示例使用手动过滤,效果很好。
private ParcelUuid mServiceUuidFilter = ParcelUuid.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
private final ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
boolean matched = (mServiceUuidFilter == null);
if (mServiceUuidFilter != null && result.getScanRecord().getServiceUuids() != null) {
for (ParcelUuid uuid : result.getScanRecord().getServiceUuids()) {
if (uuid.equals(mServiceUuidFilter)) {
matched = true;
break;
}
}
}
if (matched) {
// do something
}
}
};
private void scan() {
List<ScanFilter> scanFilters = new ArrayList<>();
// works
ScanFilter filter = new ScanFilter.Builder().build();
scanFilters.add(filter);
ScanSettings scanSettings = new ScanSettings.Builder().build();
// skipping mScanner initialization
mScanner.startScan(scanFilters, scanSettings, mScanCallback);
}
第二个示例使用ScanFilter
进行筛选,但不起作用。mScanCallback
从未被调用。
private ParcelUuid mServiceUuidFilter = ParcelUuid.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
private final ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
// do something
}
};
private void scan() {
List<ScanFilter> scanFilters = new ArrayList<>();
// does not work
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(mServiceUuidFilter).build();
scanFilters.add(filter);
ScanSettings scanSettings = new ScanSettings.Builder().build();
// skipping mScanner initialization
mScanner.startScan(scanFilters, scanSettings, mScanCallback);
}
我是不是漏掉了什么?
2条答案
按热度按时间py49o6xq1#
嗯,我不太清楚我做了什么改变,但是在将我的最低API级别设置为21时,这就开始工作了。
eivgtgni2#
ScanFilter依赖于BLE服务器通告的服务UUID。ESP32 BLE库不会自动通告服务,您必须按照类似的方式进行(通常您可能只调用
bleServer->startAdvertising()
):这需要在
bleServer->createService(UUID_SERVICE)
之外完成,我以前没有意识到这一点。