Android BLE BluetoothGatt.writeDescriptor() 有时返回 false

2023-12-23

我正在尝试编写 BLE Android 应用程序。我发现有时当我打电话时BluetoothGatt.writeDescriptor() https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#writeDescriptor(android.bluetooth.BluetoothGattDescriptor)它返回 false。

我在文档中没有发现任何对此功能的限制说明。但是堆栈溢出上的 ppl 说我需要等待BluetoothGattCallback.onDescriptorWrite() https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html#onDescriptorWrite(android.bluetooth.BluetoothGatt,%20android.bluetooth.BluetoothGattDescriptor,%20int)在我尝试编写另一个描述符之前。

这是一篇回复说BLE 正忙 https://stackoverflow.com/a/36169096/1093607与 writeDescriptor() 一起使用,不能进行其他写入。

Here is 另一个线程 https://stackoverflow.com/a/24178815/1093607也就是说你不能调用两次 writeCharacteristic()。

我的问题是

  • 这是真的吗?
  • 是否真的缺少一些用于序列化 BLE 请求的内部 Android API 缓冲区,并且每个开发人员都必须自己完成?
  • 对于不同的功能也是如此吗?例如当我打电话时writeDescriptor()我明白我不能再打电话writeDescriptor()在我收到之前onDescriptorWrite()。但我必须等待onDescriptorWrite()当我想打电话时writeCharacteristic()?
  • 另外,如果存在函数间依赖性,那么还有什么函数有此限制(即:readCharacteristic(), readDescriptor(), requestMtu()...)?
  • 此外,BluetoothGattServer 和BluetoothGatt 之间还存在相互依赖性。例如当我打电话时BluetoothGattServer.notifyCharacteristicChanged()我应该等待吗BluetoothGattServerCallback.onNotificationSent https://developer.android.com/reference/android/bluetooth/BluetoothGattServerCallback.html#onNotificationSent(android.bluetooth.BluetoothDevice,%20int)在我打电话之前BluetoothGatt.writeDescriptor() or BluetoothGatt.writeCharacteristic()? (顺便说一句,对谷歌文档的赞扬onNotificationSent()幸运的是,它被正确记录。医生说:

当要发送多个通知时,应用程序必须等待 在发送附加信息之前收到此回调 通知。

  • 最后有所有这些问题 - 我觉得 Android BLE API 的记录不足。或者我错了,在某处记录了允许调用序列的方法是什么?如果是的话,您能给我指出这样的文档吗?如果没有,是否有一些渠道我们可以向谷歌提出问题并要求他们在文档中添加一些内容?我的意思是它可能没有太多文字 - 有些功能如onNotificationSent()已经正确记录。他们只需要将这句话复制到其他函数中即可。

该文档缺乏信息。不过,您可以阅读源代码来找出规则,(目前)如下:

对于每个BluetoothGatt对象,一次只能有一个未完成的请求,包括requestMtu, readCharacteristic, writeCharacteristic, readDescriptor, writeDescriptor and executeReliableWrite。因此,如果您发出读取请求,则需要等待读取响应,然后才能发出写入请求。虽然他们实现了如果有正在进行的操作则返回 false 的代码蓝牙Gatt.java https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothGatt.java,他们忘记这样做了requestMtu,所以如果您同时有多个请求requestMtu是其中之一,您迟早会遇到随机错误(在本文发布时的最新版本中)。

所以是的,每个开发人员都必须手动序列化请求。请注意,蓝牙堆栈实际上有一个请求队列,但每个客户端仅限一个请求(即BluetoothGatt 对象)。因此,如果同一部手机上的两个应用程序同时与同一设备通信,您将永远不会收到“忙”错误。唯一的例外是,如果您使用 Write Without Response,则当前数据流实现存在很大的错误(请参阅https://issuetracker.google.com/issues/37121017 https://issuetracker.google.com/issues/37121017谷歌似乎忽略了这一点)。

您可以在编写特征的同时发送通知,因为服务器和客户端角色是分开的。

关于更新文档,您可以随时尝试在以下地址提交问题:https://issuetracker.google.com https://issuetracker.google.com(但我感觉没有人读到),或者,由于 Android 是开源的,请将拉取请求发送到https://android-review.googlesource.com/ https://android-review.googlesource.com/它更新生成文档的 Javadoc。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android BLE BluetoothGatt.writeDescriptor() 有时返回 false 的相关文章

随机推荐

  • 从表格上清除物体,何时何地?

    我有一个简单的 Windows 窗体应用程序 在表单上 我有一个自定义类 它有自己的 Dispose 方法 所以问题是我什么时候应该调用这个 FormClosed 事件 即 Form1 FormClosed 是否是执行此操作的正确位置 或者
  • .NET 的 StringBuilder 是线程安全的吗

    MSDN 文档的常规 线程安全 部分StringBuilder指出 不保证任何实例成员都是线程安全的 但这个语句感觉就像是为框架中的几乎每个类复制并粘贴了 http msdn microsoft com en us library syst
  • CombinedDomainXYPlot 不重新缩放域轴

    当我从使用 CombinedDomainXYPlot 的图表中隐藏系列数时 所有范围轴都会很好地自动重新缩放 但是 域轴不会重新缩放 有没有办法手动刷新缩放 或者我可能缺少一个设置来启用此设置中域轴的自动缩放 CombinedDomainX
  • JAX-RS和自定义授权

    我正在尝试保护 JAX RS 端点 目前正在尝试弄清楚身份验证和授权是如何工作的 大多数示例都非常简单 因为它们仅通过 web xml 搭载 Java EE 应用服务器角色 我想知道如何使用 Java EE AS 角色之外的其他角色 例如
  • Couchbase Lite 2 + JsonConvert

    以下代码示例将一个简单的对象写入 couchbase lite 版本 2 数据库 然后读取所有对象 这个你可以在官方文档中找到here https developer couchbase com documentation mobile 2
  • 在 Chrome 扩展中运行喊播广播

    我想为我的网络shoutcast网络广播电台创建一个chrome扩展 我设法使这一切正常工作 除了每当我点击弹出窗口时 它就会关闭 并且流也会随之停止 读了一点之后 我发现我需要创建一个后台页面 这将使播放器在后台运行 这就是我迷失和困惑的
  • 如何强制浏览器不存储 HTML 表单字段数据?

    在 HTML 表单中输入内容时 Firefox 或 Internet Explorer 等浏览器会存储这些值 有时会悄悄存储 因此 当输入另一个网络表单时 浏览器会智能地建议相同的信息 显示下拉列表的另一种方法是双击空文本框 在电子商务网站
  • Python读取设备管理器信息

    我只需要使用 python 2 7 脚本读取设备管理器中列出的所有信息 特别是 IDE ATA ATAPI 控制器 子类别下的信息 需要检测 SATA 驱动器是否处于 AHCI 或 IDE 模式 一种简单的方法 在 Windows 上 是使
  • multer、multiparty 和 connect-multiparty + Nodejs 之间的区别

    我是 Node 世界的新手 用例 有一个在 Angular 前端上传 XLS 文件的简单场景 在 Node 上处理它们 进行一些操作 然后将 JSON 保存到 蒙戈数据库 从 Angular 收到文件后 我正在搜索在 Node 上解析 处理
  • ARKit Stereo – 是否可以同时运行两个 ARSCNView?

    我正在考虑对现有的 AR 应用程序进行一些修改 我想拆分视图并添加内部 2ARSCNView这样用户就可以使用VR卡盒并获得不同的体验 但Xcode总是返回给我 Session 0x102617d10 did fail with error
  • 如何在 UITextView 中显示可点击的链接

    我正在尝试在 UITextview 中显示带有可单击链接的属性字符串 我创建了一个简单的测试项目来看看哪里出了问题 但仍然无法弄清楚 我尝试启用用户交互并设置 shouldInteractWithURLs 委托方法 但它仍然不起作用 这是我
  • 为什么 CoreNLP ner tagger 和 ner tagger 将分开的数字连接在一起?

    这是代码片段 In 390 t Out 390 my phone number is 1111 1111 1111 In 391 ner tagger tag t Out 391 my O phone O number O is O 111
  • 反转数组顺序

    我正在尝试反转 java 中数组的顺序 在 O n 内使用最少的内存来完成此操作的最有效方法是什么 不需要用代码回答 伪代码就可以了 这是我的思考过程 create a new temp array I think this is a wa
  • jquery 与更新面板

    我在使用 jquery 上下文菜单和更新面板时遇到问题 我正在使用 htmlTextWriter 在 Customtextbox 控件的 RenderBeginTag 中编写上下文菜单的 javascript 一切正常 我可以右键单击每个文
  • 在 TRichEdit 中加载包含表格但没有表格边框的 RTF 文件

    我有一个 RTF 文件 正在将其加载到 TRichEdit 控件中 我面临的唯一问题是 RTF 文件中有表格 加载相同的文件会显示表格边框 但是当我在 MS Word 中加载相同的 RTF 时 它不显示任何边框 客户端想要相同的行为 有没有
  • raster可以创建不同模式的多层对象吗?

    Can a raster对象 R 中 具有不同模式 数据类型 的层 从表面上看 我们似乎总是被迫选择一种类型 library raster create a SpatialPixelsDataFrame with trivially two
  • 如何在Matlab中删除wav文件的标题

    我需要删除波形文件的前 1024 个字节 我尝试这样做 但我得到了损坏 扭曲的 wavfile wavFile fopen fullFileName r Open file for reading fseek wavFile 1024 1
  • Python 创建带有反馈的迭代器/生成器

    是否可以创建一个迭代器 生成器 它将根据某些值决定下一个值result在上一次迭代中 i e y None for x in some iterator ll y y some calculation on x 我想要选择下一个的逻辑x依赖
  • C# 构造函数线程安全吗?

    假设我有多个线程 每个线程都试图创建同一类的对象 不同线程同时创建同类型的对象会不会互相干扰 我需要在构造函数中使用 锁 吗 这在很大程度上取决于构造函数的实现 如果构造函数仅访问该类的成员 而不访问任何外部静态类或方法 那么是的 它是线程
  • Android BLE BluetoothGatt.writeDescriptor() 有时返回 false

    我正在尝试编写 BLE Android 应用程序 我发现有时当我打电话时BluetoothGatt writeDescriptor https developer android com reference android bluetoot