Я начинающий с 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, но все еще не могу справиться с этим.Я не могу двигаться дальше.Буду очень признателен за вашу помощь!Заранее спасибо.