Как мне установить Bluetooth-сканер, который получает рекламные данные с моих Ibeacon? - PullRequest
0 голосов
/ 19 июня 2020

Сейчас я использую это репозиторий, который использует эту библиотеку для сканирования Bluetooth на Android. Вот метод сканирования здесь. В настоящее время он не собирает мои IBeacons, и в репозитории объясняется, почему это так, однако я не уверен, где отсюда, в этом методе, найти go и как заставить его сканировать мои маяки.

public static void startScanning() {
    if (isScanning()) {
        return;
    }

    final BluetoothClient instance = getInstance();
    Log.d(TAG, "Starting to scan for beacons");

    ScanSettings scanSettings = new ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .build();

    instance.scanningSubscription = instance.rxBleClient.scanBleDevices(scanSettings)
            .subscribe(new Observer<ScanResult>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "Bluetooth scanning error", e);
                }

                @Override
                public void onNext(ScanResult scanResult) {
                    instance.processScanResult(scanResult);
                }
            });
}

Это модификации, которые я сделал в этом методе.

ScanSettings scanSettings = new ScanSettings.Builder()
                .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                .build();
        ScanFilter scanFilter = new ScanFilter.Builder()
                .setServiceUuid(UUID).build();

        instance.scanningSubscription = instance.rxBleClient.scanBleDevices(scanSettings, scanFilter)
                .subscribe(new Observer<ScanResult>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "Bluetooth scanning error", e);
                    }

                    @Override
                    public void onNext(ScanResult scanResult) {
                        instance.processScanResult(scanResult);
                    }
                });

Как видите, я добавил ScanFilter, чтобы он мог найти UUID для моих IBeacons и получить от них рекламные данные (которые я затем отправляю методу результатов сканирования процесса). Но эта реализация не работает, так как не позволяет мне напрямую фильтровать UUID.

Я не уверен, что то, что я здесь делаю, правильно. Я прочитал файл readme для репозитория библиотеки RxAndroidBle, но go на нем не так много, и я не могу получить приложение для поиска моих спецификаций c Beacons. У меня есть 4 IBeacon, которые установлены вокруг моего дома, каждый Ibeacon, который у меня есть, имеет UUID «EBEFD083-70A2-47C8-9837-E7B5634DF524».

Как я могу заставить этот метод правильно сканировать этот конкретный c UUID или просто обернуть API IBeacon, чтобы я мог получить необходимые рекламные данные в соответствии с намерениями репо? Я не на 100% уверен, что делаю это правильно, но думаю, что у меня есть правильная идея, любая помощь будет оценена, спасибо :)

1 Ответ

1 голос
/ 19 июня 2020

При использовании ScanFilter на Android предоставленный UUID представляет собой UUID службы GATT, который совсем не то же самое, что и UUID iBeacon, несмотря на то, что все 128-битные UUID выглядят внешне похожими, когда выражаются как String .

Короткий ответ: прекратите использовать этот UUID в вашем фильтре сканирования. Если по какой-то причине вам необходимо использовать фильтр сканирования, используйте пустой, например (ScanFilter scanFilter = new ScanFilter.Builder().build();).

Одно предостережение: пустые фильтры сканирования не позволят сканировать с выключенным экраном на устройствах Samsung. Единственная альтернатива - создать более сложный фильтр сканирования c, специфичный для iBeacon. Прежде чем вы потрудитесь это сделать, убедитесь, что вам это вообще нужно.

...