ESP32:BLE传输速度很慢

问题描述 投票:0回答:2

我正在尝试构建一个使用 BLE 与 ESP32 交互的 Android 应用程序。我在 Android 端使用 Vincent Masselis 的 RxBluetoothKotlin 库。对于 ESP32 端,我使用 Arduino IDE 中包含的默认 Kolban 库。我的手机是 OnePlus 5T,我的 ESP32 是 MH ET Live ESP32DevKIT。我的 Android 应用程序可以在这里找到,我的 ESP32 程序可以在这里找到。

就纯功能而言,整个系统对我来说非常完美。也就是说,每个按钮都执行其应该执行的操作,并且我得到了我期望得到的确切行为。然而,通信本身非常慢。大约 200 字节/秒。我的 Android 应用程序中的测试按钮从 ESP32 请求一堆文本数据,并将其显示在对话框中。它还列出了一个数字,表示请求和接收之间的时间(以毫秒为单位)。使用它,我可以在大约 2 秒内获取 440 字节的数据。当我发送较少的数据时,时间随着数据大小近似线性减少。 40 字节的数据大约需要 200 毫秒,20 字节或以下的数据通常需要不到 100 毫秒。

这对我来说似乎相当慢。据我了解,我应该至少能够每秒获得几千字节。我尝试使用 nRF Connect 检查速度,但数据传输的时间跨度相同为 2 秒。这表明问题不在我的应用程序中,因为我在一个完全不同的应用程序中也遇到了这个问题。我还将代码放在回调内部的主循环中(我可能应该首先完成),但这根本没有改变任何事情。我尝试将微控制器和手机带到几个不同的位置,希望消除干扰。我试图搞乱 BLEDevice::setPower 和 BLEDevice::setMTU,以及在 Android 端设置 RxBluetoothGatt.requestMtu(500) 。到目前为止,一切似乎都没有什么效果。唯一起作用的是添加行“pServer->updatePeerMTU(0,500);”在连接阶段我的循环中。这导致每当我按下应用程序中的测试按钮时都会重复前 23 个字节的数据,并使数据传输需要大约 3 秒。如果幸运的话,440 字节的时间可能会略低于 1.8 秒,但当我期望有一个数量级的差异时,这是一个非常小的变化,甚至可能纯粹是偶然,而不是我的任何原因。做到了。

有人知道如何提高我的传输速度吗?

bluetooth bluetooth-lowenergy esp32 arduino-ide arduino-esp32
2个回答
1
投票

数据传输速度主要受蓝牙 LE 连接间隔(7.5 毫秒至 4 秒之间)的影响,并由主设备(中央单元)和外围设备之间协商确定。主设备与参数集建立连接,并且外设可以建议更改该参数集。然而,最终,中央单元决定使用哪个参数集。

但是蓝牙连接间隔不能由 Android 应用程序直接更改,Android 应用程序通常充当核心角色。相反,它可以请求连接优先级,已知这会对连接间隔产生影响。


0
投票

我遇到了和你一样的问题,很高兴找到你的评论:

我在 IDE 中搞乱了分区方案,将代码上传到我的 ESP32,然后用更大的 MTU 和更高的优先级搞乱了更多,现在看来我得到了大约 10kByte/s。

因此,在搞乱所有这些设置后,我找到了适合我的工作解决方案(16 kB/s)。

这是我的总结,按优先级排序:

  1. 请务必从客户端请求 MTU(即 Android 应用程序:在发现服务后放置
    gatt.requestMtu()
    ),而不是从服务器端请求 MTU(ESP:BLEDevice::setMTU();
    向Android端请求高连接优先级:
  2. gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH)
  3. 调整有效负载大小。正如
  4. 此图
  5. 所示,即使在有效负载中添加一个字节也可能会显着降低速度(图取自本文)。如下表所示,在我的情况下,速度降低了 3 倍(最后一个表)。 从您的特性中删除不必要的标志,以便增加有效负载。只要
  6. BLECharacteristic::PROPERTY_READ
  7. 对我来说就足够了。
    通过
  8. esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT,ESP_PWR_LVL_P9);
  9. 设置不同的功率对我来说没有效果
    
    
结果 - 更改优先级:

| Speed [B/s] | Priority | MTU | Payload | |-------------|------------|-----|---------| | 190 | DCK | 500 | 495 | | 1035 | LOW_POWER | 500 | 495 | | 5522 | BALANCED | 500 | 495 | | 16566 | HIGH | 500 | 495 |

结果 - 更改 MTU:

| Speed [B/s] | Priority | MTU | Payload | |-------------|------------|-----|---------| | 571 | HIGH | 23 | 495 | | 1183 | HIGH | 46 | 495 | | 4141 | HIGH | 230 | 495 | | 5522 | HIGH | 460 | 495 | | 16566 | HIGH | 500 | 495 |

结果 - 更改有效负载大小:

| Speed [B/s] | Priority | MTU | Payload | |-------------|------------|-----|---------| | 100 | HIGH | 500 | 1 | | 400 | HIGH | 500 | 10 | | 3400 | HIGH | 500 | 100 | | 16566 | HIGH | 500 | 495 | | 5533 | HIGH | 500 | 496 | (!)

当我拥有所有标志时
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE

我能够以 15233 B/s 的速度“仅”发送 455 字节。

我知道这个回复有点晚了,但有人可能仍然觉得它有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.