Android蓝牙LE:连接后未发现服务

Posted

技术标签:

【中文标题】Android蓝牙LE:连接后未发现服务【英文标题】:Android Bluetooth LE: Not discovering services after connection 【发布时间】:2014-06-03 21:46:34 【问题描述】:

我正在尝试使用 android 的低功耗蓝牙与 BLE 设备进行通信。第一次连接时,一切正常(连接到 GATT 服务器正常,发现所有服务和特性等)但是,如果我断开连接并尝试重新连接,它将连接到 GATT 服务器,但不会能够发现服务。我必须杀死应用程序并重新启动它,有时即使这样也不起作用。

这是我用来断开设备连接的代码:

public void close(View view) 
    if (mBluetoothGatt == null) 
        return;
    
    mBluetoothGatt.close();
    mBluetoothGatt = null;

断开连接时我还需要做什么吗?似乎有一些资源仍处于连接状态,当我尝试重新连接时会阻止发现服务。

【问题讨论】:

【参考方案1】:

我似乎找到了解决方案:您需要同时调用 BluetoothGatt.disconnect()BluetoothGatt.close()

【讨论】:

从技术上讲,您需要调用 BluetoothGatt.disconnect() 然后 [因为不能保证调用 onConnectionStateChange] 启动一个计时器,然后等待 onConnectionStateChange state=STATE_DISCONNECTED 或超时,然后调用 BluetoothGatt.close() @swooby 是否有您可以提供的消息来源提到需要在调用 close 之前等待 STATE_DISCONNECTED?谢谢! 有趣的是,即使我在关闭前调用了断开连接,我也没有在日志中观察到该跟踪。再说一次,我现在正在看牛轧糖。感谢您的链接! 断线后绝对可以直接调用close。唯一可能发生的坏事是在日志中打印警告。您应该避免的唯一事情是在 connectGatt 之后立即调用 disconnect 或 close,因为这些调用可能会由于内部竞争条件而被忽略。

以上是关于Android蓝牙LE:连接后未发现服务的主要内容,如果未能解决你的问题,请参考以下文章

Android 蓝牙 LE 外设 IP 是静态的吗?

蓝牙低能耗清单

Android 蓝牙 le gatt 特征通知问题

如何将数据传输到连接的蓝牙LE设备

Android 蓝牙 LE 通知的问题

获取已连接的蓝牙 LE 设备列表