pvvx
Активный участник сообщества
Вообще работает ли BT/BLE в ESP32? (Или вообще что-нибудь?)
Надо соединиться к серверу по BLE. Для связи с большинством устройств BT 4.2 требуется изменить MTU c 23 до N (до 517 по стандарту BT4.2).
Но что-то не так у ESP32:
В void setup() ставлю:
Далее, при соединении, на этапе создания клиента, опрашиваю:
Получаю в логе:
- Created client
- Client MTU: 23
Тут понятно, что при инициализации MTU равен минимуму (=23 байта).
Далее на ESP32 событие 'onConnect' и Сервер передает сообщение об установке MTU на 241.
На сервере включил чтобы он это принудительно делал! И то у многих клиентов по умолчанию MTU полный и такое действо не обязательно - проверено.
Кроме того передаю с ESP32 команду серверу, чтобы он передал ESP32 установить Connection Time в минималку (7.5 ms). Вроде устанавливает, согласовывает...
Через пол секунды, когда о параметрах клиент-сервер должны уже договориться, опрашиваю ESP32:
Получаю:
BLEDevice MTU = 241
- Client MTU: 241
Вроде всё в норме...
Теперь пробуем передавать с ESP32 блоки, каждый раз увеличивая размеры, начиная с 200 байт. Сервер при этом просто пересылает блок обратно и по этому событию ESP32 пересылает следующий блок с длиной + 1.
Всё идет хорошо до 228 байт. ESP32 отсылает, сервер принимает и передает обратно...
....
Send block length = 224
rx[224] TimeStamp: 6319
Send block length = 225
rx[225] TimeStamp: 6372
Send block length = 226 // 2 байта там заголовок и 226 - это общая длина посылки 228 байт.
и тут всё (!) - на сервере ничего нет и ему нечего отослать обратно... В debug логе ESP32 - всё хорошо тоже.
Сервер ожидает таймаут в 20 сек и вырубает соединение... (так ему задал для теста)
Любое другое устройство запросто работает с сервером до полного MTU (-7 байт как и положено для пользовательских данных).
Что не так с ESP32? Куда копать и кого ругать?
Надо соединиться к серверу по BLE. Для связи с большинством устройств BT 4.2 требуется изменить MTU c 23 до N (до 517 по стандарту BT4.2).
Но что-то не так у ESP32:
В void setup() ставлю:
C++:
BLEDevice::init("");
BLEDevice::setMTU(241);
C++:
pClient = BLEDevice::createClient();
Serial.print(" - Client MTU: ");
Serial.println((int)pClient->getMTU());
- Created client
- Client MTU: 23
Тут понятно, что при инициализации MTU равен минимуму (=23 байта).
Далее на ESP32 событие 'onConnect' и Сервер передает сообщение об установке MTU на 241.
На сервере включил чтобы он это принудительно делал! И то у многих клиентов по умолчанию MTU полный и такое действо не обязательно - проверено.
Кроме того передаю с ESP32 команду серверу, чтобы он передал ESP32 установить Connection Time в минималку (7.5 ms). Вроде устанавливает, согласовывает...
Через пол секунды, когда о параметрах клиент-сервер должны уже договориться, опрашиваю ESP32:
C++:
Serial.print("BLEDevice MTU = ");
Serial.println(BLEDevice::getMTU());
Serial.print(" - Client MTU: ");
Serial.println((int)pClient->getMTU());
BLEDevice MTU = 241
- Client MTU: 241
Вроде всё в норме...
Теперь пробуем передавать с ESP32 блоки, каждый раз увеличивая размеры, начиная с 200 байт. Сервер при этом просто пересылает блок обратно и по этому событию ESP32 пересылает следующий блок с длиной + 1.
Всё идет хорошо до 228 байт. ESP32 отсылает, сервер принимает и передает обратно...
....
Send block length = 224
rx[224] TimeStamp: 6319
Send block length = 225
rx[225] TimeStamp: 6372
Send block length = 226 // 2 байта там заголовок и 226 - это общая длина посылки 228 байт.
и тут всё (!) - на сервере ничего нет и ему нечего отослать обратно... В debug логе ESP32 - всё хорошо тоже.
Сервер ожидает таймаут в 20 сек и вырубает соединение... (так ему задал для теста)
Любое другое устройство запросто работает с сервером до полного MTU (-7 байт как и положено для пользовательских данных).
Что не так с ESP32? Куда копать и кого ругать?