Android:捕获 BLE 连接失败/断开连接?

标签 android bluetooth

因此,在正常情况下,我能够很好地连接到 BLE 设备。我想做的是处理异常情况,比如当与设备的连接失败或已建立的连接丢失时(可能它被扔下悬崖或被公共(public)汽车撞了)

我正在使用 CyPress BLE 模块对此进行测试,我正在进行的其中一项测试是断开模块的电源。但是,onConnectionStateChange 永远不会被调用!我所看到的所有响应都是成功的连接。它会花费数小时尝试连接并且从不明显放弃。我会延迟取消连接尝试,但无法取消蓝牙设备(据我所知)的连接尝试!据我所知,它会一直尝试直到电池电量耗尽。

这是我的 onConnectionStateChange 现在在 Gatt 回调中的样子。请注意,我正在 try catch 并记录涉及任何类型的连接状态更改的任何类型的回调......除非连接成功,否则永远不会被调用。请注意,这是代码不在 Activity 本身上。它在一个由单例持有的对象中。 (我想保持跨多个 Activity 的连接)

        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            mGatt = gatt;
            Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "Status: "+status+ " Newstate: "+newState);
            switch(status)
            {
                case BluetoothGatt.GATT_SUCCESS:
                    mReconnectAttempts = MAX_ATTEMPTS;

                    if(newState == BluetoothGatt.STATE_CONNECTED)
                    {
                        DispatchEvent(Event.Type.BT_ON_CONNECT);
                        bIsConnected = true;
                        gatt.discoverServices();
                    } else if (newState == BluetoothGatt.STATE_DISCONNECTED)
                    {
                        DispatchEvent(Event.Type.BT_ON_DISCONNECT);
                        bIsConnected = false;
                    }
                    break;
                default:
                    if(newState == BluetoothGatt.STATE_DISCONNECTED)
                    {
                        bIsConnected = false;
                        if(mReconnectAttempts > 0)
                        { // if we have attempts left, auto attempt to reconnect
                            DispatchEvent(Event.Type.BT_RECONNECTING);
                            mReconnectAttempts--;
                            gatt.connect();
                            bIsConnected = false;
                        }
                        else
                        {
                            mReconnectAttempts = MAX_ATTEMPTS;
                            DispatchEvent(Event.Type.BT_ON_CONNECT_FAIL);
                            bIsConnected = false;
                        }
                    } else {
                        Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "onConnectionStateChange: Failed?");
                    }
            }

            super.onConnectionStateChange(gatt, status, newState);
        }

无法检测断开连接是我代码中其他地方的一个问题,例如我在其中显示一个进度对话框,指示应用程序正在连接到 BLE 设备。好吧,该对话框永远不会消失,因为永远不会抛出“On Connect Fail”事件。

最佳答案

我想你要找的是Bluetooth Supervision timeout这是根据 Bluetooth LE specifications :

a parameter that defines the maximum time between two received Data Packet PDUs before the connection is considered lost

默认 Supervision timeoout在 Android 上设置为 20 秒(取决于 Android 版本和设备)。例如,hereSupervision Timeout 的值在 Android 5.1 上。

没有用于设置此参数的 API,因此您必须等待 20 秒(取决于您的 Android 版本和设备)才能获取 onConnectionStateChange回调状态 BluetoothGatt.STATE_DISCONNECTED关闭 BLE 模块后

关于Android:捕获 BLE 连接失败/断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38666462/

相关文章:

android - requestActivityTransitionUpdates 从不调用已注册的 BroadcastReceiver

Android 蓝牙应用程序在通话期间无响应

android - 如何设置蓝牙打印的字体大小?

android - 如何选择正确的android CTS版本

android自定义 View 在虚拟机中有错误

android - 蓝牙绑定(bind)仅在 LG G5 上失败

蓝牙协议(protocol)(RFCOMM、L2CAP 和 ACL)

java - Android 蓝牙开发 - 连接到未配对的设备

android - Android 支持的蓝牙配置文件有哪些?

如果单击上一项,Android PagerAdapter 不会报告正确的位置