Ирония судьбы, хорошо? … Это ирония

Так что, если вы читаете это, возможно, когда-то у вас была идея создать приложение, использующее API Android с низким энергопотреблением Bluetooth. Мои соболезнования, я чувствую тебя (бро).

Ну, вроде как… иногда, в основном, когда вы им не пользуетесь…

Полезные советы и хитрости

— или то, что вы получите после парсинга интернета

  • Маленькие флажки имеют большое значение

Если вы когда-нибудь пробовали использовать BLE-устройство с Android, первое, что вы заметили, это то, что в методе подключения есть флаг, который позволяет вам указать ОС обрабатывать повторные подключения вместо вас каждый раз, когда ваше устройство доступно.

connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)

Сладкий, вы думаете, позвольте мне установить, что это правда. Нет, это не так просто, если вы установите значение true при первом подключении к устройству, есть большая вероятность, что вы вообще не подключитесь. И если вы всегда устанавливаете его в false, устройство никогда не будет повторно подключаться автоматически.

  • Упомянутое выше автоматическое подключение — ну, если вы хотите, чтобы оно работало — сделайте это сами

Во многих случаях ОС не будет повторно подключать ваше устройство, даже если оно доступно. Если вам нужно стабильное соединение, вам лучше не использовать предоставленный механизм. Вместо этого просто создайте свой собственный сканер и найдите сопряженное устройство (и всегда подключайтесь с флагом автоматического подключения, установленным на false).

  • Но не переусердствуйте, сканеры не должны работать постоянно

Если вы слишком много сканируете, Android заметит, что вы пытаетесь заставить что-то работать, и выведет вас из строя. Сканируйте некоторое время, скажем, 20–30 секунд, останавливайте сканер на 2–3 секунды и снова запускайте.

  • Отправка большого количества данных — не будьте назойливыми, дайте им немного отдохнуть перед каждым пакетом

Что вы делаете — отправляете пакет за пакетом, ожидая, что все они прибудут… нет, подумайте еще раз. В какой-то момент после отправки большого количества пакетов Android начнет глючить, и вы ничего не сможете с этим поделать.

Дайте ему перерыв. Пусть немного отдохнет.

Это не относится к более новым устройствам, но если вы попробуете это на более старых, вам лучше дать ему 50 мс или больше после каждого пакета, я знаю, что это безумие, если у вас есть, но у вас нет выбора.

  • Отправка данных приводит к отсутствию или беспорядку пакетов

Ну, после всего этого вы все еще ожидаете, что это сработает, как всегда? Давай, собери свой $#i7 и реализуй механизм повторных попыток.

  • Вы пытались выключить и снова включить его?

Что ж, если вы разработчик, вы должны инструктировать своих пользователей делать это время от времени. И если вы являетесь пользователем BLE на Android, вы должны сделать это привычкой.

Вот краткое руководство:

Справочник пользователя Android BLE

1. Попробуйте выключить и снова включить модуль Bluetooth.
2. Не помогло? Попробуйте перезагрузить телефон.
3. Хорошо, если он по-прежнему не работает, выключите и снова включите телефон.
4. Вы пробовали извлечь аккумулятор?
5. Хорошо, просто … прекратите его использовать. Вам действительно не нужно это приложение… верно?

  • Не выполняйте несколько операций одновременно

Воу, воу, воу… притормози понты. То, что в школе программирования вас учат, что многопоточность — это хорошо, не означает, что это так. По крайней мере, не здесь. Не делай этого, даже не думай об этом.

ГАТТ 133

- это когда ты убегаешь

Это страшнее монстров из сказок у костра.

В документации по этой ошибке говорится:

(Да, пусто)

Вы будете видеть это все время. Вы будете ненавидеть это. Презирайте это. Но со временем вы научитесь с этим жить. Обожаю это (шучу, F#@% это $#i7).

Единственное решение — реализовать описанные выше приемы (особенно первые два).

Android хорош тем, что позволяет каждому производителю создавать собственную версию

— и хуже всего то, что они действительно

  • Нексус

Вы ожидаете, что это сработает хорошо. Работает на ванильном Android, багов быть не должно. Ну вы в чем-то правы — это чисто… $#i7. Я не буду тратить здесь ваше время, просто погуглите «нексусные проблемы».

  • Самсунг

Крупнейший производитель Android-устройств. Тоже самое худшее?!

После запуска приложения BLE в течение нескольких дней оно вмещает какой-то кеш Bluetooth или что-то в этом роде, и вы больше не можете подключиться. Чтобы исправить это, вам необходимо перезагрузить модуль Bluetooth. Но эй, вот лучшая часть. Если вы отключите его в настройках, это не отключит модуль — вы не сможете его использовать. Для того, чтобы действительно перезапустить его, вам нужно выключить и снова включить ваше устройство (помните, руководство сверху… ага).

  • Хуавэй

Нет, только не делай этого с собой. Если у вас есть Huawei, просто притворитесь, что у вас нет Bluetooth. Возьми пиво и посмотри фильм, пожалуйста.

  • Ежевика

Эти ребята еще существуют?

  • Другое

Ну и другие устройства работают (часто). У вас могут быть проблемы с некоторыми китайскими брендами, но в основном все будет в порядке.

Так что BLE может не работать на Android. Да, я знаю, что мои советы и уловки не такие изящные. Я знаю, что это выглядит некрасиво, но, по крайней мере, это работает (не всегда, урод). Если вы хотите, чтобы ваши пользователи были счастливы, почему бы вам не реализовать это для iOS или Windows? S#i7, я имел в виду только iOS, ладно, не Windows... даже не заводите меня на BLE для Windows (у этих ребят даже нет метода отключения).

Не обвиняйте меня в ненависти к Android. Это как твой тупой кузен Бен — ты терпеть не можешь, но в конце концов все равно любишь.