java - 中继的蓝牙连接问题 - RxAndroidBle

标签 java android bluetooth-lowenergy rx-java2 rxandroidble

我说英语有点抱歉。我需要你的帮助,因为我投入了很多时间,但我无法完成最后一个细节:_(

我必须将带有蓝牙 LE 的手机连接到继电器,才能打开或关闭门。提供原生蓝牙和 socket ,但没有办法做任何有效的事情。经过大量研究后,我找到了 RxAndroidBle 库并得到了第一个结果。

问题是我不习惯使用响应式(Reactive)编程,而且我真的不知道我在做什么。我传递了代码和接下来的步骤,看看是否有什么东西逃过了我的眼睛。

步骤:

  1. 通过已知 MAC 地址直接连接到设备
  2. 发送打开十六进制命令
  3. 成功的话,执行带有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/

相关文章:

java - 如何在 Java 而不是 android 中读取蓝牙低功耗 RSSI

java - 如何配置 WildFly 来打印运行时异常?

java - 如何从另一个类调用 ArrayList 方法?

android - 我可以找到我的对话的任何实例是否正在运行吗?

ios - Bluetooth LE CBCentralManager 缓存外围设备 UUID

ios - 从蓝牙事件中唤醒 iOS 应用程序

java - Android 使用 SOAP 时无法序列化 : org. ksoap2.serialization.SoapSerializationEnvelope

java - 蓝牙/WiFi 直接套接字的高级协议(protocol)?

Android 设备管理 : notification on disable request?

android - 如何运行 Android 测试