我说英语有点抱歉。我需要你的帮助,因为我投入了很多时间,但我无法完成最后一个细节:_(
我必须将带有蓝牙 LE 的手机连接到继电器,才能打开或关闭门。提供原生蓝牙和 socket ,但没有办法做任何有效的事情。经过大量研究后,我找到了 RxAndroidBle 库并得到了第一个结果。
问题是我不习惯使用响应式(Reactive)编程,而且我真的不知道我在做什么。我传递了代码和接下来的步骤,看看是否有什么东西逃过了我的眼睛。
步骤:
- 通过已知 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次,另一个根本不起作用。当然我需要稳定的连接。
预期结果:
正确的工作
最佳答案
我发现这个错误: - 任务 COMMON_BROADCAST_MESSAGE_RECIVED 失败或超时。客户端断开连接。 - bta_gattc_mark_bg_conn 无法找到 bg 连接掩码:XX:XX:XX:XX:XX
关于java - 中继的蓝牙连接问题 - RxAndroidBle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240668/