Прерывистые проблемы пропускной способности BLE между Android и NRF52832
Я ищу помощь в определении причины неустойчивой проблемы с пропускной способностью BLE.
Настройка:
У меня есть мобильный телефон (Nexus 5x) под управлением Android 7.1.1 с пользовательским приложением, которое подключается к 3 датчикам через BLE. Датчики основаны на Nordic NRF52832 и работают под заказ. Прошивка Nordic я не писал, но мне сказали, что она использует устройство nrf5_SDK_v12.2 S132 sdk / soft. Nordic передает данные датчиков через Nordic UART Service (NUS) на телефон.
Эта проблема:
Обычно я запускаю свое приложение, подключаюсь к датчикам, а затем передаю данные с датчиков на телефон. Когда все работает как положено, я вижу среднюю пропускную способность данных ~ 2250 бит / с для каждого датчика (измеряется на телефоне). Но иногда я получаю 1 или 2 датчика (всегда может быть 2, если честно не помню), где пропускная способность существенно снижается. Когда пропускная способность снижается, я обычно вижу 750Bps - 1500Bps от датчиков с уменьшенной пропускной способностью, но пропускная способность от незатронутого датчика остается неизменной. Я никогда не наблюдал, чтобы система работала с полной полосой пропускания для всех трех датчиков, а затем внезапно снизила пропускную способность двух датчиков или наоборот. Кажется, что как только соединение установлено, это либо соединение с полной или пониженной скоростью. Это снижение пропускной способности приводит к потере данных, что мешает моему приложению работать правильно.
Вещи, которые я попробовал / исключил:
- Сначала я подумал, что это проблема с радиочастотами, поэтому я начал регистрировать RSSI для каждого из датчиков на стороне телефона. После просмотра логов это, кажется, не проблема RF. Я наблюдал полную пропускную способность системы с RSSI до -90 дБ и сниженную пропускную способность с RSSI до -40 дБ.
- Во-вторых, возможно, у датчиков была какая-то проблема, которая заставляла их производить данные с пониженной скоростью. Чтобы проверить это, я сначала зарегистрировал все количество байтов, полученных из уведомлений о характеристиках данных NUS (по телефону). Когда полоса пропускания датчиков уменьшается, я вижу, что изменение характеристики всегда приводит к получению 20 байтов телефоном (MTU -3). Это привело меня к мысли, что подсистема BLE на датчике не поспевает за данными, полученными с датчиков. Далее я подтвердил этот вывод, подключив отладчик к микросхеме Nordic и просмотрев буфер, используемый для буферизации измерений перед их отправкой через обычный NUS, и заметил, что выборки отбрасывались, потому что буфер был заполнен.
- Кроме того, я не думаю, что это мое приложение вызывает замедление. Я сделал это, я не задерживаюсь в обратном вызове onCharacteristicChanged(). Мое приложение просто помещает новые байты в очередь для обработки другим потоком.
- Я запросил высокоприоритетное соединение для каждого датчика через вызов gatt.RequestConnectionPriority(GattConnectionPriority.High) на телефоне после того, как соединение gatt было установлено в OnConnectionStateChanged().
- Я установил минимальный / максимальный интервал подключения на скандинавском 12,5 мс
Мой вывод / вопросы
Исходя из моих наблюдений, кажется, что при установлении соединения происходит что-то, из-за чего телефон или датчик уменьшают пропускную способность соединения. За пределами MTU / интервала соединения (CI) я не уверен, какие параметры могут вызывать такое снижение пропускной способности соединений.
- Любые идеи о том, почему у меня периодически возникают проблемы с пропускной способностью?
- У меня есть ощущение, что стек Android BLE делает что-то, чего я не хочу, но это своего рода черный ящик с точки зрения свойств соединения, любая мысль о... что это может измениться? Как я могу обнаружить это намеренно замедляя соединение?
Полный отказ от ответственности, мое приложение для телефона написано на C# для Xamarin, но я не думаю, что это должно иметь значение.
Спасибо!