蓝牙低功耗(ESP32和Android智能手机之间):数据传输相当慢



这是我在这个黑板上问的第一个问题

项目说明短:

5个传感器,连接esp32板传输1000个采样/秒,每个采样16位。这些值应该通过BLE传输(使用BLE Arduino库和ESP32)。连接的设备(智能手机)应该读取这些值并对它们进行处理(也通过BLE,使用以下库:https://github.com/RobotPajamas/Blueteeth)。ESP32是服务器!Java在Android Studio中使用!

问题:

在测试BLE连接时输入一个简单的"hello world"作为特征值传输。每次我收到"你好世界"在android设备端,变量是递增的:问题是,变量在一秒钟内只递增了4次。这意味着(假设字符串中的1个字符等于1字节)正在传输11byte*4(1/s)=44byte/s。→这显然是不够的(不应该BLE传输~2MBit/s(减去协议数据))

代码片段

ESP32: BLE-Server发送值

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string value = pCharacteristic->getValue();
if (value.length() > 0) {
Serial.println("*********");
Serial.print("New value: ");
for (int i = 0; i < value.length(); i++)
Serial.print(value[i]);
Serial.println();
Serial.println("*********");
}
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("MyESP32");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
pCharacteristic->setCallbacks(new MyCallbacks());
pCharacteristic->setValue("Hello World");
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
// put your main code here, to run repeatedly:
delay(2000);
}

Android Studio代码(接收源代码片段):

try
{
while(sampleBluetoothData)
{
this.selectedDevice.readCharacteristic(MainActivity.characteristicUUID, MainActivity.serviceUUID, (response, data) ->
{
if (response != BlueteethResponse.NO_ERROR) {
return;
}
Log.d("AUSGANG", new String(data) + "times: "+ i);
i++;
});
}
}
catch (Exception e)
{
e.printStackTrace();
}

ESP32端的写入是Arduino IDE的空白示例代码,android端的读取是由BLE-Library发布者完成的。是的,日志。D会影响性能,但不会使性能下降太多。

变量"data"Android代码的一部分是接收到的字符数组。蓝牙读取在后台线程上运行。

我现在问自己的问题:

  • 是Android-Studio库问题还是Arduino库问题
  • 这是一个正常的行为吗?如果一个特性的值没有改变,它的传输速度非常慢吗?
  • 你能多快地更新一个特征值

提前感谢!

BLE绝对可以传输超过每秒11字节的4个部分。

阅读方式:

  1. 一般来说,一直持续读取不是预期的BLE方式-最好订阅数据更改,因此ESP32将仅在需要时通知(例如,执行selectedDevice.subscribeToCharacteristic一次,而不是在循环中读取,但随后ESP32代码应相应地更改)
  2. 我猜selectedDevice.readCharacteristic请求异步BLE读取,当你在while(sampleBluetoothData)中调用它时,你的蓝牙库正在添加越来越多的读取请求。也许在之前的读取完成后请求新的读取是明智的-在读取回调中添加if(sampleBluetoothData) { this.readAgain(); }

考虑从这个kickstart例子制作一个测试原型:BLEProof on github -Android &ESP32,读,写,通知(但它只使用系统API而不使用蓝牙库,你的方法更好,使用库更容易,更安全)。

还需要检查什么:

  1. Android端:你确定你的代码没有进入if (response != BlueteethResponse.NO_ERROR)吗?
  2. Android端:为了确保蓝牙库不会因为读取请求而过载,尝试在读取循环中添加50毫秒的延迟(只是为了检查,这不是一个解决方案)
  3. Android端:当你读取这些数据时,你确定你没有其他BLE读写吗?
  4. ESP32端:使用更短的BLE连接间隔(BLE吞吐量文章)-在pAdvertising->start();之前添加pAdvertising->setMinPreferred(0x06);pAdvertising->setMaxPreferred(0x20);(但只设置"preferred")

使用读请求时,您主要受到传输速度的连接间隔的限制-即请求+响应的2个间隔。

例如,如果您的客户端连接间隔为50ms,您应该期望每秒读取10次最多20字节的特征。

如果另一个客户端的连接间隔为30ms,则该速率将提高到每秒16.6个读。

最快的可协商连接间隔为7.5ms,最大66.6个每秒读取(10.7kbps, 20字节读取)。

我正在阅读BLE维基百科页面,最小数据速率是125Kbit/s,所以我认为在你的情况下是可行的,因为你只会传输16Kbit/s。看一看BLE维基百科

相关内容

  • 没有找到相关文章

最新更新