После нескольких дней исследований, проб и ошибок мои коллеги и я должны надеяться, что у сообщества StackOverflow есть работающее решение.
Мы получили Android Smartwatch. Мы разработали приложение, которое действует как центральный BLE. Приложение показывает QR-код, кодирующий UUID, который уникален для каждого SmartWatch. Показывая этот QR-код, он активно сканирует устройство, рекламирующее услугу с этим UUID.
Мы также разработали приложение iOS, которое может сканировать этот QR-код и запускать рекламу с полученным UUID службы. SmartWatch Android затем очень быстро подключается к устройству iOS.
Одной из целей Smartwatch является отображение уведомлений pu sh с устройства iOS. Поэтому, когда соединение успешно установлено, SmartWatch-App подписывается на характеристики источника данных ANCS и источника уведомления. Это инициирует соединение «Just Works», поэтому вам просто нужно нажать «Pair» на устройстве iOS. После этого вы должны разрешить, чтобы уведомления iOS передавались SmartWatch, а затем SmartWatch успешно получал уведомления. ANCS также является причиной, по которой устройство iOS ДОЛЖНО БЫТЬ в роли периферийного устройства.
Пока все не работает нормально.
Когда пользователь покидает диапазон Bluetooth или отключает его и включает Bluetooth устройство iOS, автоматическое переподключение c должно быть запущено. Он подключается, когда приложение iOS находится на переднем плане. К сожалению, он не работает, когда iOS -App в фоновом режиме. Вероятно, это связано с тем фактом, что устройство iOS не сообщает с требуемым UUID, когда приложение находится в фоновом режиме, как описано в документации CoreBluetooth:
All service UUIDs contained in the value of the CBAdvertisementDataServiceUUIDsKey advertisement key are placed in a special “overflow” area; they can be discovered only by an iOS device that is explicitly scanning for them.
Мы перепробовали много разных способов переподключения от Android SmartWatch до iOS. Насколько я понимаю, он должен работать при создании первого connectGatt с autoConnect = false и при потере соединения вызывать connectGatt на потерянном устройстве с autoConnect = true, но он никогда не переподключается. По крайней мере, в течение 15 минут. Повторное сканирование также не будет работать, поскольку UUID больше не объявляется в фоновом режиме.
Мы также попытались дополнительно разрешить устройству Android работать в качестве периферийного устройства, чтобы iOS мог подключиться к нему. После подключения мы записали данные в INITIATE_ANCS -characteristi c и позволили устройству Android вызвать connectGatt на устройстве, которое было передано onCharacteristicWrite. Это привело к интересному поведению:
- соединение работало, мы могли прочитать Smartwatch-Characteristi c из iOS.
- при подписке на характеристики ANCS он инициировал спаривание. Но вместо спаривания «Just Works» на устройстве iOS был показан код 6-ди git, который мы должны были набрать на Smartwatch.
- Спаривание инициировалось при каждом новом соединении и всегда создавало новое устройство в системных диспетчерах устройств на Android и iOS.
- сопряжение НЕ БЫЛО инициировано, когда приложение iOS находилось в фоновом режиме.
Мы действительно провели тщательное исследование и не могли не могу найти решение. Поняли ли мы что-то неправильно о том, как работает BLE для iOS и Android? Мы действительно надеемся найти здесь эксперта, который знает, что нужно сделать, чтобы восстановить соединение.
Редактировать: Android устройство работает на Android 5.1.1, и в настоящее время это не вариант обновлять. Тестовое устройство iOS работает iOS 13.3 и должно быть совместимо с iOS 13 +