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
。我尝试在GattServerCallback
onConnectionStateChange
中使用addServices
。代码运行但我没有得到 onServiceAdded 回调
我的应用程序中的“gatt 客户端”和“gatt 服务器”代码都无法运行。
我确实收到了onConnectionStateChange
的回调。
如何、何时、何地(MainActivity
或BLEService
)实例化mBluetoothGattServer
?
这是否记录在某处?有一些示例代码吗?
我的问题的第一部分暂时解决了。我启动了一个新线程,添加了一秒延迟,然后调用 openGattServer。我的“客户”代码现在可以正常工作了。 (我对此不满意 - 这是出于挫败感而产生的尝试 - 如果我能让服务器代码工作,我可能会尝试使用队列)。
我确实得到了GattServerCallback
的onConnectionStateChange
。
但是,我似乎还没有运行任何“服务器”代码。
【问题讨论】:
【参考方案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-低功耗蓝牙(BLE)-客户端(主机/中心设备)和服务端(从机/外围设备)