android 服务UUID上的BluetoothLeScanner扫描过滤器不工作

g6ll5ycj  于 2023-01-15  发布在  Android
关注(0)|答案(2)|浏览(323)

我正在开发一个简单的应用程序来扫描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);
}

我是不是漏掉了什么?

py49o6xq

py49o6xq1#

嗯,我不太清楚我做了什么改变,但是在将我的最低API级别设置为21时,这就开始工作了。

eivgtgni

eivgtgni2#

ScanFilter依赖于BLE服务器通告的服务UUID。ESP32 BLE库不会自动通告服务,您必须按照类似的方式进行(通常您可能只调用bleServer->startAdvertising()):

BLEAdvertising *ad = bleServer->getAdvertising();
ad->addServiceUUID(UUID_SERVICE);
bleServer->startAdvertising();

这需要在bleServer->createService(UUID_SERVICE)之外完成,我以前没有意识到这一点。

相关问题