Я говорю по-английски немного извините.Мне нужна ваша помощь, потому что я потратил много часов и не могу закончить последнюю деталь: _ (
Мне нужно подключить мобильный телефон с Bluetooth LE к реле, чтобы открыть или закрыть дверь. Предоставьтес родным Bluetooth и с сокетами, но не было никакого способа сделать что-то, что работало. После долгих исследований я нашел библиотеку RxAndroidBle и получил первые результаты.
Проблема в том, что я не привык кпрограммирование с реактивной парадигмой, и я действительно не знаю, что я делаю. Я передаю код и следующие шаги, чтобы увидеть, ускользает ли что-то от меня.
Шаги:
- Подключение напрямую по известному MAC-адресу к устройству
- Отправка шестнадцатеричной команды открытия
- В успешном случае выполнить команду закрытия с DELAY
private void SendCommandRele(String enable, String disable, int time) {
bleDevice = rxBleClient.getBleDevice("BB:A0:56:06:0A:0A");
byte[] data = hexStringToByteArray (enable);
UUID uuid = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
connectionDisposable = bleDevice.establishConnection(false)
.observeOn(AndroidSchedulers.mainThread())
.flatMapSingle(rxBleConnection -> rxBleConnection.writeCharacteristic(uuid, data))
.doOnError(error -> errorConnection())
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
CloseDevice(disable);
}
})
//.repeat(3)
.retryWhen(io.reactivex.Observable::cache)
.doAfterNext(next -> CloseDevice(disable))
//.take(1)
.subscribe(
well -> {
Handler handler = new Handler();
handler.postDelayed(
new Runnable() {
@Override
public void run() {
CloseDevice(disable);
}
},
time
);
},
failed -> Log.e("E","Error: ")
);
progressDialog.dismiss();
//connectionDisposable.dispose();
}
--
private void CloseDevice(String disable) {
bleDevice = rxBleClient.getBleDevice("BB:A0:56:06:0A:0A");
byte[] data = hexStringToByteArray (disable);
connectionDisposable = bleDevice.establishConnection(false)
.observeOn(AndroidSchedulers.mainThread())
.flatMapSingle(rxBleConnection ->
rxBleConnection.writeCharacteristic(UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"), data)
)
.doOnError(error -> {errorConnection();})
//.repeat(3)
//.retry(3)
.take(1)
.subscribe(
);
progressDialog.dismiss();
}
Фактические результаты:
В целом, результаты, которые у меня есть, довольно положительные, так как иногда это работает, но иногда это не так. Рат, работает 10 раз подряд, а другой не работает на все.Конечно, мне нужно стабильное соединение.
Ожидаемые результаты:
правильная работа