【问题标题】:How to return BLE peripheral's connection status如何返回 BLE 外设的连接状态
【发布时间】:2017-06-23 22:17:10
【问题描述】:

我注意到方法onConnectionStateChange() 并非总是在外围设备被非手动断开时(例如外围设备关闭时)被调用(或只是没有按时调用)。有没有办法手动获取连接的 BLE 外围设备的连接状态,而不是等待onConnectionStateChange() 触发?我尝试使用BluetoothManager#getConnectionState,但此方法似乎正在访问由调用onConnectionStateChange() 的任何线程更新的连接状态,并且实际上并没有询问设备是否已连接。换句话说,如果onConnectionStateChange() 还没有被调用,BluetoothManager#getConnectionState 只会返回 false。

这是我的isConnected 方法

public boolean isConnected(){

    // If the device has never connected, it's gatt service is null.
    if(mGatt != null){

        BluetoothManager btm =
                (BluetoothManager)
                        MainActivity.mMainActivity.getSystemService(Context.BLUETOOTH_SERVICE);

        int state = btm.getConnectionState(mGatt.getDevice(), BluetoothProfile.GATT);

        return state == 2;
    }

    // The gat service is null, the device is not connected, return false.
    return false;
}

【问题讨论】:

    标签: bluetooth bluetooth-lowenergy nrf51


    【解决方案1】:

    一旦蓝牙控制器向主机蓝牙堆栈报告链接已终止,就会调用 onConnectionStateChange。如果您在没有正常断开连接的情况下突然关闭外围设备,则连接将一直保持,直到触发监督超时。在最新的 Android 版本中,默认值刚刚从 20 秒更改为 5 秒,因为人们抱怨它太长了。 iOS 上的默认值为 0.72 秒。在 Android 上,您可以通过从外围设备发出连接参数更新请求来手动降低它。

    【讨论】:

    • 谢谢,你能提供一个连接参数更新的例子吗?不知道你的意思。
    • 这必须从外围设备端完成,因为不幸的是 Android 不提供这样的 api。见google.se/search?q=connection+parameter+update+request
    • 如果外设关闭,为什么外设设置的连接监督超时参数?主设备不应该负责询问外围设备是否断开连接吗?还是外设把参数发给主控?
    • 你必须在外围设备断开连接之前发送请求。之后,应用新参数。
    • 对不起,我想我误解了你。主设备连接到外设。例如,外围设备可以是信标,而主设备可以是运行主机 Android 应用程序的电话。监督超时参数是否已编程到信标或手机中?
    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 2022-01-20
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多