- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试编写 BLE Android 应用程序。我发现有时当我打电话 BluetoothGatt.writeDescriptor()它返回 false。
我没有在文档中找到任何对此功能的限制说明。但是堆栈溢出的人说我需要等待 BluetoothGattCallback.onDescriptorWrite()在我尝试编写另一个描述符之前。
这是一个回复说 BLE is busy使用 writeDescriptor() 并且不能进行其他写入。
这里是 another thread说你不能调用两次 writeCharacteristic()。
我的问题是
writeDescriptor()
时,我知道在收到 onDescriptorWrite()
之前我不能调用第二次 writeDescriptor()
。但是,当我想调用 writeCharacteristic()
时,是否必须等待 onDescriptorWrite()
? readCharacteristic()
、readDescriptor()
、requestMtu()
...)? BluetoothGattServer.notifyCharacteristicChanged()
时,我是否应该等待 BluetoothGattServerCallback.onNotificationSent
在调用 BluetoothGatt.writeDescriptor()
或 BluetoothGatt.writeCharacteristic()
之前? (顺便说一句,对 google 文档 onNotificationSent()
的赞美是幸运的,它被正确地记录下来了。Doc 说:When multiple notifications are to be sent, an application must wait for this callback to be received before sending additional notifications.
onNotificationSent()
这样的函数已经被正确记录了。他们只需要将这句话复制到其他功能。 最佳答案
文档缺少信息。但是,您可以阅读源代码以找出规则,这些规则(当前)如下:
对于每个BluetoothGatt
对象,一次只能有一个未完成的请求,包括requestMtu
、readCharacteristic
、writeCharacteristic
、readDescriptor
、writeDescriptor
和 executeReliableWrite
。因此,如果您发出读取请求,您需要在发出写入请求之前等待读取响应。如果在 BluetoothGatt.java 中有正在进行的操作,他们实现了返回 false 的代码。 ,他们忘记为 requestMtu
执行此操作,因此如果您一次有多个请求,其中 requestMtu
是其中之一,您迟早会遇到随机错误(在发布本文时的最新版本)。
所以是的,每个开发人员都必须手动序列化请求。请注意,蓝牙堆栈实际上有一个请求队列,但每个客户端(即 BluetoothGatt 对象)仅限于一个请求。因此,如果同一部手机上的两个应用程序同时与同一台设备通话,您将永远不会收到“忙”错误。唯一的异常(exception)是如果您使用 Write Without Response,当前的数据流实现有很多错误(请参阅 Google 似乎忽略的 https://issuetracker.google.com/issues/37121017)。
您可以在编写特征的同时发送通知,因为服务器和客户端角色是分开的。
关于更新文档,您可以随时尝试在 https://issuetracker.google.com 提交问题(但我觉得没有人读过),或者,由于 Android 是开源的,请向 https://android-review.googlesource.com/ 发送拉取请求它更新生成文档的 Javadoc。
关于Android BLE BluetoothGatt.writeDescriptor() 有时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47097298/
我正在开发一个需要与蓝牙 LE 设备通信的应用程序。 这是我用来设置 CharacteristicNotification 的代码 public boolean setCharacteristicNo
我正在构建一个应用程序来从蓝牙设备读取数据。连接到设备后,我调用 mBluetoothGatt.discoverServices()在onServicesDiscovered(..)我正在通过调用 g
我正在尝试连接到外围设备。当我在 Scancallback 中找到所需的设备时,我会向我的处理程序发送一条包含该设备的消息。 11-16 10:31:12.471 25907-25907/I/BleM
从文档中我看到如何在没有响应的情况下这样写: BluetoothGattCharacteristic characteristic = ... characteristic.setValue(byte
我一直无法通过同一个蓝牙 LE 设备同时使用两个不同的特性。它只记录第一个特征而不记录第二个特征。如果我调换它们,它仍然会记录第一个,但不会记录第二个。第一和第二特征都需要注册和接收。如果有帮助,我正
当扩展 BluetoothGattCallback 时,实现者应该调用 super 方法吗? 例子: public void onCharacteristicWrite(BluetoothGatt g
实际上我是通过蓝牙进行更新的。第一次我删除存储体,然后在上面写入一个十六进制文件。 但是有一半的时间更新无法正常工作,对于我传输的每个数据,第一个 writeCharacteristic 将返回 fa
我创建了一个具有 WRITE_TYPE_NO_RESPONSE 特性的外设。对于另一个应用程序,我写了特性,但我偶尔会遇到带有 lollipop 5.1.1 的 samsung galaxy nexu
我的应用程序与 BLE 外围设备通信。有时,应用程序会在已连接外围设备的情况下启动。我可以通过调用以下方式取回设备: BluetoothManager manager = (BluetoothMana
我正在编写一个 Android 应用程序以使用 BLE 与 Arduino 对话。我已经能够扫描设备,连接到目标,发现服务,获取特征,并读取那些可读的。但是,当我尝试编写可写特性时,该方法总是返回 f
首先我阅读了SOLVED: GATT callback fails to register并采取了该帖子中建议的步骤来解决此问题,但没有成功。如果您还没有阅读,建议的修复方法是直接从主线程或使用处理程
我遇到了一个让我完全困惑的问题,主要是因为它的顽固性。 我正在编写一个小型 Android 应用程序来与我的 Bluegiga BLE113 进行通信。我以前连接过这个设备,但我最近做了一个 GATT
我正在连接到蓝牙 LE 外围设备作为中心。我正在将数据写入特征,并通过通知以 20 字节为单位接收数据。 通知订阅: private void setCharacteristicNotificatio
我正在尝试编写 BLE Android 应用程序。我发现有时当我打电话 BluetoothGatt.writeDescriptor()它返回 false。 我没有在文档中找到任何对此功能的限制说明。但
Android BluetoothGatt.class 有 mClientIf 私有(private)字段。大多数与 BLE 事件相关的日志消息都包含此值。例如: onClientRegistered
我正在尝试写入 BLE 设备的特性。根据文档,这个特性是可以读和写的,有不同的用法。我已经成功地读取了它,但是我在写入时遇到了一些问题。每次我尝试写入它时,onWriteCharacterstic 函
我有一个从 IntentService 调用的 BluetoothLeService。 BLEService 在连接之前工作正常。与 iBeacon 建立连接后,调用 ; public void on
我们正在编写一个 ble 应用程序,它希望与我们要连接的外围设备建立持久连接。出于同样的目的,我们希望在失去现有连接时重新连接外围设备。因此,作为中心的 android 应用程序只是尝试使用 blue
我正在编写一个 Android 应用程序来与 BLE 仪表通信。我已经能够扫描设备、连接到目标、发现服务、获取特征。然而,当我尝试编写 write_no_reponse 特性时,该方法总是返回 fal
我正试图在退出我的应用程序时断开特征通知。以下是我在 exitCleanup() 函数中的做法: if (btGatt != null && mWriteChar != null) { bool
我是一名优秀的程序员,十分优秀!