【问题标题】:Android 4.4 BLE indication data more than 20 byteAndroid 4.4 BLE指示数据超过20字节
【发布时间】:2014-05-28 02:07:17
【问题描述】:

我有一个关于 android 4.4 蓝牙低功耗的问题。

我有一个带 UART Rx 引脚的 BLE 加密狗。我可以将字节数据从 Rx-pin 发送到 BLE dongle,BLE dongle 会通过指示将数据发送到蓝牙主机设备。

所以我有一个 Rx 特征值,它的属性是指示。 我向 Rx 特征发送了大约 80 字节的数据,但是我通过一次回调函数 onCharacteristicChanged 只获得了 20 字节。

但是我用 iPad mini 来表示这个特征值,它接收 4 个 20 字节数据之一的数据包,看起来是对的。

如何在Android回调函数中像iOS一样接收80字节数据?

【问题讨论】:

    标签: android bluetooth-lowenergy


    【解决方案1】:

    我遇到了完全相同的问题 - 20 字节是适用于指示和通知的限制。它在规范中定义,但是我还没有找到它。

    如果您的特征不使用指示或通知,则此约束不适用,您的所有数据都将以 MTU-5 块发送,请参阅 BT4.0 规范的第 3.4.6.1 节。

    【讨论】:

    • -1 的给予者能否说明这个答案的不正确之处。
    【解决方案2】:

    数据以每个 20 字节的块的形式发送。因此,如果您想接收所有 80 个字节,则将数据分成 20 个字节的块并循环发送。详情请参阅Android: Sending data >20 bytes by BLE

    记得在循环中添加Thread.sleep(200),这样特性就不会被覆盖。

    【讨论】:

    • 写特征或回调方法之前?
    • 总废话:200ms 是一个随机值,取决于硬件。我的确实需要超过 350 毫秒。所以建立一个栈writeCharacteristic,等到writeCharacteristicWrite,轮询栈并发送下一个值
    • 另外还有一个 onCharateristicWrite() 事件可以用来触发下一次发送,对吧?
    • 至少,我是这样体验的。在发送数据之后设置事件。
    【解决方案3】:

    尝试协商更大的 GATT MTU。默认值为 23 个字节。 (G)ATT 协议在每个通知/指示的报头中占用 3 个字节。 所以默认剩下 20 - 3 = 20 个字节。

    在 iOS 8 上,iOS 允许的最大 MTU 为 158 字节。 我不确定 Android 允许什么。

    【讨论】:

    • 我认为您建议使用this API。请注意,它来自 API 级别 21。
    • 我已经能够使用 iOS 设备请求 512 的值。
    • 似乎即使协商了 512 个字节,我也只收到了 155 个字节。
    • 是的,你确实会使用它。
    • 我怀疑是否协商了 512 字节 MTU。可能发生的情况是,iOS 正在使用 Read/Write Long 操作将有效负载分块在单独的消息中(每个消息包含最多 155 字节的有效负载数据),这将在后台透明地发生。对于 Notifications 和 Write w/o Response,不存在这样的分块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多