Android Bluetooth Low Energy (BLE) API не готов к прайм-тайму

Я работаю над фитнес-приложением, которое поддерживает два датчика BLE (частота сердечных сокращений, шаг). В итоге я получил две ограниченные службы (по одной для каждого датчика), вызванные и ограниченные моей основной деятельностью. Это работает на Nexus 7 II с KitKat. Я потратил дни, пытаясь перевести приложение в стабильное состояние. Соединения Gatt и уведомления работают отлично сразу после чистой перезагрузки. Проблема, с которой я сталкиваюсь, заключается в том, чтобы вернуть все в рабочее состояние после того, как одно или оба устройства были отключены и должны быть повторно подключены. Поскольку другие сообщали о подобных проблемах, я разработал и протестировал различные сценарии, которые включали сохранение службы и соединений при перезапуске активности, закрытие соединений и сервера, а затем запуск заново, только закрытие, а не отключение, ожидание до переподключение и т. д. В настоящее время с одним датчиком я могу заставить приложение переподключаться большую часть времени. С двумя датчиками соединения в большинстве случаев не восстанавливаются. Очень жаль, что Android BLE API настолько хрупок, учитывая, что каждую неделю появляется много новых устройств BLE. Мне интересно, повезло ли кому-нибудь еще с несколькими датчиками BLE и поделятся ли они своим подходом к тому, чтобы заставить его работать.


person Jason Porter    schedule 21.01.2014    source источник
comment
К сожалению, из моего (относительно небольшого) опыта работы с BLE я могу только повторить ваше разочарование. Вся структура кажется невероятно нестабильной.   -  person Kevin Coppock    schedule 22.01.2014
comment
Я бы предложил переписать это, чтобы не акцентировать внимание на разглагольствованиях (заголовок, предпоследнее предложение) и больше сосредоточиться на коде, который не работает (источник, релевантные записи LogCat и т. д.).   -  person CommonsWare    schedule 22.01.2014
comment
Я в такой же ситуации и с августа пробую разные вещи. Очень легко привести систему в состояние, когда вам нужно перезагрузить компьютер. Иногда включение и выключение Bluetooth помогает, но не всегда. Я могу привести его в состояние, когда выключение не удается, и оно возвращается через 10 секунд ... Я бы посоветовал проверить различные соответствующие отчеты об ошибках Android.   -  person Ifor    schedule 22.01.2014
comment
Забыл сказать, что иногда работает идеально, особенно после перезагрузки. Я использую ЧСС, скорость велосипеда и частоту вращения педалей, но пользователи также используют мощность велосипеда. Не уверен, что у кого-то было сразу 3 устройства, но два будут работать, просто не запустятся надежно из случайного состояния. например фреймворк имеет серьезные ошибки.   -  person Ifor    schedule 22.01.2014
comment
Это ИМЕННО мое наблюдение. Я могу заставить все работать после перезагрузки, но как только устройство отключается или пытается повторно подключиться, система становится нестабильной. Я никогда не думал, что потрачу так много на эту часть приложения. Другая раздражающая вещь заключается в том, что сообщения logcat из API не имеют смысла, и иногда onConnectionStateChanged я получаю значение, которое не задокументировано (0x85). Я планирую изучить предложение Ло-Тана в этом сообщении link. Сообщу, если найду что-нибудь полезное.   -  person Jason Porter    schedule 23.01.2014
comment
Интересный материал от Ло-Тан. Все мои личные тесты были с Nexus4, и у меня достаточно проблем с этим. У пользователей сложилось впечатление, что на устройствах S4 и S3 дела обстоят лучше (но не идеально).   -  person Ifor    schedule 23.01.2014


Ответы (1)


Это не очень вопросительный вопрос, но ваш комментарий указывает на то, что знание того, что означает 0x85, поможет. Android BLE API был взят из второго BLE API от Samsung, но не все константы, определенные Samsung, были перенесены.

0x85 = 133 (что вы также видите в логах) — это GATT_ERROR. По сути, это означает, что что-то пошло не так, возможно, периферийное устройство вышло за пределы диапазона устройства или просто сломался чип Bluetooth. Я обнаружил, что вызов connect() в BluetoothGatt в onConnectionStateChange является достойным решением, так как он будет ждать, пока все уладится, и подключится, когда это возможно.

0x8D = 141 GATT_ALREADY_OPEN Это довольно очевидно.

Еще одна вещь, на которую следует обратить внимание, — это убедиться, что все, что происходит с Bluetooth, происходит последовательно. Множественные потоки, отправляющие команды в BluetoothGatt до того, как произойдет результат предыдущего действия, как правило, не являются хорошей идеей.

person Douglas Jones    schedule 14.05.2014