rxbluetoothble scan подключиться наблюдать состояние и изменить значок - PullRequest
0 голосов
/ 25 сентября 2018

Я начинающий с Bluetooth и Android.Мне нужно создать приложение для Android, которое будет подключаться к устройству (у меня есть MAC-адрес и имя) и в зависимости от расстояния будет блокировать / разблокировать устройство.Итак, у меня есть 4 состояния: отключено, далеко, заблокировано и разблокировано.Приложение должно работать без каких-либо кнопок.Сразу после начала сканирования и подключения и изменения значков на телефоне.

Я написал код.Этот метод сканирует устройство с фильтром.

    public void ScanDevice() {

    if (isScanning()) {
        scanDisposable.dispose();
    } else {
        scanDisposable = rxBleClient.scanBleDevices(
                new ScanSettings.Builder()
                        .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                        .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
                        .build(),
                new ScanFilter.Builder()
                        .setDeviceName("device_name")
                        .build()
        )
                .take(1)
                .observeOn(AndroidSchedulers.mainThread())
                .doFinally(this::dispose)
                .subscribe(resultsAdapter::addScanResult, this::onScanFailure);
    }
}

, а затем следующим методом является подключение к этому устройству и наблюдение за его состоянием.

public void connectToDevice() {


    ImageView imageView= (ImageView) findViewById(R.id.imageView6);

    if (isConnected()) {
        triggerDisconnect();
    } else {
        connectionDisposable = device.establishConnection(true)
                .flatMapSingle(rxBleConnection -> rxBleConnection.readCharacteristic(CHARACTERISTIC))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        characteristicValue -> device.observeConnectionStateChanges()
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(
                                        connectionState -> {

                                            System.out.println("Connected");

                                            if (connectionState.equals(RxBleConnection.RxBleConnectionState.CONNECTED)) {
                                                Log.d(getClass().getSimpleName(), "Actual state " + connectionState.toString());
                                                imageView.setImageResource(R.drawable.status_locked);


                                            } else if (connectionState.equals(RxBleConnection.RxBleConnectionState.DISCONNECTED)) {
                                                Log.d(getClass().getSimpleName(), "Actual state " + connectionState.toString());
                                                imageView.setImageResource(R.drawable.status_disconnected);
                                            }
                                        },
                                        throwable -> {

                                            System.out.println("Disconnected");
                                            // Handle an error here.
                                        }
                                ),
                        throwable -> {
                            // Handle an error here.
                        }
                );
    }
}

Проблема в том, что я не знаюкогда устройство меняет состояние и как изменить значок.

У меня есть код в swift, который делает это, я устал переписывать его в java, но безуспешно.

    func enableBluetooth() {
    connectedObservable = manager.observeState()
        .startWith(manager.state)
        .filter{ $0 == .poweredOn }
        .timeout(3.0, scheduler: MainScheduler.instance)
        .take(1)
        .flatMap{ _ in self.manager.scanForPeripherals(withServices: nil) }
        .filter{ $0.peripheral.name == DeviceService.proximityDeviceName.rawValue }
        .take(1)
        .flatMap{ return $0.peripheral.establishConnection() }
        .do(onNext: { [unowned self] peripheral in
            self.connectedDevice.value = peripheral
        })
        .flatMap{
            return $0.discoverServices([DeviceService.proximityDevice.uuid])
        }.asObservable()
        .flatMap{ Observable.from($0) }
        .flatMap{ $0.discoverCharacteristics([DeviceCharacteristic.proximityCharacteristic.uuid]) }.asObservable()
        .flatMap{ Observable.from($0) }
        .flatMap{ $0.observeValueUpdateAndSetNotification() }
        .subscribe(onNext: { [unowned self] in
            self.reading.value = ProximityDataModel(from: $0.value ?? Data())
        })

}

Я прошел все уроки по rxandroidble, но все еще не могу справиться с этим.Я не могу двигаться дальше.Буду очень признателен за вашу помощь!Заранее спасибо.

...