Android外设BluetoothGattServerCallback onServiceAdded()没有被调用

Posted

技术标签:

【中文标题】Android外设BluetoothGattServerCallback onServiceAdded()没有被调用【英文标题】:Android Peripheral BluetoothGattServerCallback onServiceAdded() not getting called 【发布时间】:2018-04-19 20:48:35 【问题描述】:

所以我有一个简单的外围应用程序,我正在我的三星 S8 手机上运行的 android Studio 中编写它。我可以很好地设置我所有的 BLE 广告和特征,但是当我添加我的服务时。从另一台 Central 设备(即另一部具有发现蓝牙广告的应用程序的手机)连接时,我没有看到预期的结果。

Android Studio 的 LogCat 输出:

根据日志,我只能看到 2 个默认服务,即通用属性 (1800) 和通用访问 (1801),它们是任何 Gatt 服务器的默认服务。我觉得我错过了应该告诉服务是否确实被添加和发现的“onServiceAdded()”回调。

我的代码没有错误,并且 addService() 调用成功。我的问题是为什么我无法从 onServiceAdded() 得到回复?虽然其他覆盖函数(如 onConnectionStateChange() 似乎工作正常。这似乎是非常基本的,我查看了大量示例,但似乎无法让最后一点起作用。任何有解决方案或一些好的参考资料可供参考的人将不胜感激。

【问题讨论】:

我在大多数手机上都有同样的问题。它适用于三星 Galaxy S7,但没有其他手机可供我测试。 【参考方案1】:

我遇到了同样的问题(诺基亚 6.1),onServiceAdded 只被调用了一次,虽然我添加了 2 个服务并且我是随机的

onCharacteristicReadRequest() no char for handle nnn

尝试从其他设备连接时。

我在文档https://developer.android.com/reference/android/bluetooth/BluetoothGattServer.html#addService(android.bluetooth.BluetoothGattService)中找到了相关点

BluetoothGattServerCallback.onServiceAdded(int, BluetoothGattService) 回调将指示该服务是否有 已成功添加。在此之前不要添加其他服务 回调。

我找到的可靠解决方案是添加一个服务,等待 onServiceAdded 被调用,然后添加第二个服务,再次等待 onServiceAdded 然后我调用 startAdvertising。

【讨论】:

这完成了工作,谢谢。供参考this 是一个例子。随着每个服务完成添加,下面的onServiceAdded() 会继续进行下一个服务。【参考方案2】:

我遇到了同样的问题,似乎在 GATT 服务器重新启动时之前连接了客户端(中心)时没有调用回调。

如果您断开所有客户端并从干净状态重新启动服务器(外围设备),您将看到回调正常工作(在我的情况下,即使添加了 2 个服务)。

我的服务器也是三星 Galaxy S7(Android 8.0)。客户端是 Android 7 设备。

(除了这个回调问题:) 发生了一些缓存或奇怪的事情,如果您以前有连接,则它不适用于多种服务(一个预定义的和一个自定义的)。就我而言,当客户端已经连接并且我在启动时向服务器添加了多个服务时,gattServer.getService(uuid) 将返回 null。添加一项服务没问题。

【讨论】:

以上是关于Android外设BluetoothGattServerCallback onServiceAdded()没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE GATT 外设模式通知

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

android BLE Peripheral 做外设模拟设备,供iosandroid 连接通讯。

Android 新增外设Service添加供app使用

Android Things:外设I/O接口-I2C

不用外设就让手机秒变蓝牙键鼠?Android P 或许能帮你实现