【问题标题】:Android BLE Gatt Characteristic WRITE_TYPE_NO_RESPONSE not workingAndroid BLE Gatt 特性 WRITE_TYPE_NO_RESPONSE 不起作用
【发布时间】:2014-02-16 02:15:07
【问题描述】:

我开发了一个连接到 CC2540 BLE 外围设备的 Android 应用。

当我执行无响应类型的特征写入 (WRITE_TYPE_NO_RESPONSE) 时,我仍然会在应用级别收到回调 onCharacteristicWrite。这种行为正确吗?

我知道在 Android 设备和外围设备之间可能发生了低级别的确认。

但我问的原因是因为这导致了一个问题,即我只能在收到此回调后发送写入,这会减慢应用程序的速度。

任何关于此行为的说明将不胜感激。

谢谢,

【问题讨论】:

  • 是的,这听起来不对...有一个写入命令没有响应(在任何级别上),这意味着您不必等待响应。不过,我对 Android BLE API 一无所知,希望对您有所帮助。

标签: android bluetooth-lowenergy


【解决方案1】:

我在尝试进行一些性能测试时确实遇到了同样的问题,发现当我专门使用 WRITE_TYPE_DEFAULT 时,我停止了响应。 android 常量可能存在导致反向行为的错误,但我不太确定。

【讨论】:

  • 真的吗?听起来不错。 Android 团队似乎犯了一个愚蠢的错误。这是什么安卓版本?
  • 这是在 4.4 或 4.4.2 中。我已经有一段时间没有尝试过了,但我想它可能还在发生。
【解决方案2】:

您一次只能在低级别进行 1 次传输,因此您需要一个回调来告知堆栈何时准备好发送另一个命令。 如果您尝试一个接一个地发送多个而不等待空中接口准备好,您可能会严重崩溃 BLE 堆栈!这在早期的 iO​​S CoreBluetooth 上经常发生。 如果一个应用程序使 BLE 堆栈崩溃,则手机需要重置,或者必须关闭并再次打开蓝牙才能重置堆栈。 回调只是告诉您堆栈已通过空中接口发送了一个请求,而不是它已被接收者确认。为此,您将使用其他 api,这将使 BLE 堆栈重新传输多次(取决于如何协商连接参数)。

BLE 规范中明确规定一次只能进行 1 次传输。

如果你只是用 write requ 敲击 API

【讨论】:

  • 这不是真的。在 BLE 核心规范中,您有写入请求和写入命令。写请求会给你一个回复,告诉你写成功。写入命令没有响应,您可以发送任意数量的命令。接收 GATT 服务器不保证写入(它不可靠),但不会崩溃,链接应该很好。如果 iOS 堆栈曾经崩溃,我想现在已经修复了。那一定是一个错误,并不能反映你应该做什么和不应该做什么。
  • @VegarWesterlund 我在多次读取时看到了这种行为。我必须强制我的读取是同步的 - 在发出另一个“读取”之前等待“读取”回调。你说这是假的吗?我在交互的阅读方面没有看到命令与请求。
  • @Splash:我不知道您使用的是 Android、iOS 还是其他堆栈,但它应该是这样工作的。在最低(est)级别有一个 HCI 接口。它有许多数据缓冲区(比如六个)。然后,您最多可以排队六个传出数据包(例如读取请求)。较高级别应跟踪可用缓冲区或处理数据缓冲区溢出事件。无论哪种方式,您有权访问的 API 都应该为您处理此问题,并阻止读取请求或给出错误消息。锤击 API 不应使其崩溃甚至行为不端。
  • @VegarWesterlund 是的,人们会期望一个设计合理的 API 来为您处理这类事情。然而,Android 的蓝牙 API 没有,我正在使用 API 级别 26。我看到的行为正是 henrik 所描述的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2015-01-20
相关资源
最近更新 更多