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

我必须将带有蓝牙LE的手机连接到继电器,才能打开或关闭门。提供本机蓝牙和插座,但无法进行任何有效的操作。经过大量研究,我找到了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次,而另一只根本不起作用。当然,我需要一个稳定的连接。

预期成绩:

正确的工作

最佳答案

我发现此错误:
-任务COMMON_BROADCAST_MESSAGE_RECIVED失败或超时。客户端断开连接。
-bta_gattc_mark_bg_conn无法找到以下对象的bg连接掩码:XX:XX:XX:XX:XX

10-07 19:30
查看更多