【问题标题】:Samsung Android 10 BLE MTU>23 issue三星 Android 10 BLE MTU>23 问题
【发布时间】:2020-07-20 17:59:37
【问题描述】:

问题: 在运行 Android 10 的三星设备 (S10e) 上设置 MTU>23 并将数据写入特性后,连接超时并关闭。

根本原因: 超时的原因是手机硬件实际上没有发送任何东西......所以终端设备没有响应(ack)。

我怎么知道这不是终端设备问题: 其他设备(像素)不会出现此问题,如果 S10 运行 Android 9,也不会出现此问题。

详情: 我们在BluetoothGatt中使用requestMtu将MTU改为185,然后onMtuChanged返回mtu值为185,status为GATT_SUCCESS。 当我们发送较长的大约 40 字节的消息时,BluetoothGatt 的 writeCharacteristic 的返回值为 true,但是 onCharacteristicWrite 回调会给我们一个 133 状态码,这不是 GATT_SUCCESS。然后设备将断开连接。

为什么需要更大的 MTU: 我们期望能够使用更大的 MTU,以便我们可以将数据发送到终端设备以提供 Wi-Fi 凭据。终端设备被构建为一次只接受所有凭据(假设 MTU>23 不会成为问题。所以我们有客户无法使用的现场设备。

问题: 有什么想法或解决方法可以尝试吗?

电话信息: 三星s10e 操作系统:安卓 10 Android 安全补丁:2020 年 3 月 1 日

终端设备信息: ESP32

【问题讨论】:

  • 您是否尝试过使用例如 nRF Connect 应用程序来查看那里的行为是否相同?您是否检查过 Android HCI 日志或使用 BLE 嗅探器查看真正发送和接收的消息?
  • 是的,到 nRF Connect 应用程序。我现在正沿着原木和嗅探路线走下去,但我担心最坏的情况。
  • 今天的新学习:任何介于 24 和 512 之间的 MTU 设置都会导致仅允许 20 个字符的有效负载。您可以将 MTU 设置为 24 并全天发送 20 个字符。您可以将 MTU 设置为 512 并整天发送 20 个字符……但是如果您在任一示例中尝试 21 个字符,手机将“不”发送有效负载,但它认为它确实发送了它……然后超时发生并且连接关闭.
  • 这在某处似乎非常错误或错误。你能检查数据包日志吗?
  • @Emil 这周晚些时候我会拿到日志。我以前从未检查过“btsnoop 日志”,但我的直觉是它只会说......(发送数据包......没有响应......超时)。 “btsnoop 日志”真的比这更深吗?您推荐哪些工具来捕获数据包日志?

标签: android kotlin bluetooth bluetooth-lowenergy samsung-mobile


【解决方案1】:

我没有使用三星设备,但我在使用 Sunmi 设备时遇到了同样的问题,显然问题是尝试发送完整的 MTU 或任何接近该值的值。如果我协商 512 并尝试发送 512,我会得到一个 133 状态,然后是断开连接,但是如果我协商 512 并发送 500 个字节,则整个事情运行良好。现在我正在使用这个公式,但我只测试了它的 MTU 协商值 512:

private int getMtu() {
    return Math.max(GattClient.DEFAULT_MTU, (int)(this.mtu * .99));
}

这个想法是您将始终发送至少 20 个字节,因为即使未协商 MTU 也可以正常工作。除此之外,我只发送 99% 的 MTU。我不再获得 133 状态了。

【讨论】:

    【解决方案2】:

    这不是您的代码的问题,而是三星的 BLE 堆栈的问题。本质上,三星在调用 setMTU 方法时什么都不做。让写入正常工作的方法是等待 133 状态码,等待一段时间让设备断开连接,然后调用 BLE 连接方法并再次尝试写入。调用其他 BLE 方法可能会再次导致失败。逻辑应该如下所示:

    写入特征。 如果 onCharacteristicWrite 中的 status 为 133,则等待设备断开连接。调用连接方法。连接后,重试写入(可能对进程进行一些指数退避)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多