Android 4.3 LE蓝牙客户端服务器冲突

Posted

技术标签:

【中文标题】Android 4.3 LE蓝牙客户端服务器冲突【英文标题】:Android 4.3 LE Bluetooth client server conflict 【发布时间】:2014-01-20 23:28:14 【问题描述】:

我使用的是运行 android 4.3 的三星 Galaxy S4 我正在尝试使用 Android 4.2.2 转换在三星的 LEB API 上运行的应用程序。 我可以发现并连接 (connectGatt) 到外围设备并成功运行所有“客户端”代码,前提是我不尝试作为服务器连接。

每当我连接时

mBluetoothGattServer = mBluetoothManager.openGattServer(this, mGattServerCallbacks);

LogCat 指示与 BluetoothGatt 的通信停止。

在发现所有 Gatt 服务后,我尝试openGattServer。我尝试在GattServerCallbackonConnectionStateChange 中使用addServices。代码运行但我没有得到 onServiceAdded 回调

我的应用程序中的“gatt 客户端”和“gatt 服务器”代码都无法运行。

我确实收到了onConnectionStateChange 的回调。

如何、何时、何地(MainActivityBLEService)实例化mBluetoothGattServer

这是否记录在某处?有一些示例代码吗?

我的问题的第一部分暂时解决了。我启动了一个新线程,添加了一秒延迟,然后调用 openGattServer。我的“客户”代码现在可以正常工作了。 (我对此不满意 - 这是出于挫败感而产生的尝试 - 如果我能让服务器代码工作,我可能会尝试使用队列)。

我确实得到了GattServerCallbackonConnectionStateChange

但是,我似乎还没有运行任何“服务器”代码。

【问题讨论】:

【参考方案1】:

我找到了一个临时解决方案。 当我实例化 mBluetoothGattServer 对象时,回调“onConnectionStateChange”被调用,而 mBluetoothGattServer = null(仍然)。这是一个惊喜,因为实例化对象导致回调被注册。我延迟了 onConnectionStateChange 的代码,直到 mBluetoothGattServer != null (对尝试次数有适当的限制)并且能够成功添加服务。在撰写本文时,我似乎必须一次添加一个服务,并在添加每个服务之前等待 onServiceAdded 回调(尚未测试)

我必须说三星 BLE SDK 更易于理解和管理。

【讨论】:

有什么更新吗?我在使用 Nexus 9 开发时遇到了同样的问题,已经一年多了【参考方案2】:

您应该在对任何BluetoothDevice 调用connectGatt 之前初始化BluetoothGattServer

mBluetoothGattServer = mBluetoothManager.openGattServer(self, mGattServerCallbacks);
mBluetoothGatt = device.connectGatt(this, false, mGattCallbacks);

事实上你只需要一个BluetoothGattServer 实例,mGattServerCallbacks 中的回调将与mGattCallbacks 中的回调同时被调用。

当您连接设备时,调用 onConnectionStateChange 的方法将在两个回调包装器中调用。

【讨论】:

以上是关于Android 4.3 LE蓝牙客户端服务器冲突的主要内容,如果未能解决你的问题,请参考以下文章

Android 蓝牙 LE 通知的问题

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

Android-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)

如何在 Android 4.3 中更改蓝牙低功耗设备的名称?

Android 蓝牙 le gatt 特征通知问题

Android 4.4.3 是不是允许 Android 手机成为 iBeacon?