Почему иногда мне нужно перезапустить iOS Bluetooth (используя системную кнопку), чтобы мой центральный менеджер мог успешно подключиться?

Я разрабатываю приложение для iOS и OS X Yosemite, которое использует CoreBluetooth для iOS и IOBluetooth для Mac. Приложение для iOS играет «центральную» роль, а приложение для Mac — «периферийную».

По сути, приложение iOS (центральное) начинает сканирование, чтобы найти периферийные устройства, и когда оно находит данные Mac, рекламирующие периферийные устройства, центральное подключается к нему и может обнаружить его услуги и характеристики.

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

Чтобы снова успешно подключиться к периферийному устройству, мне нужно выключить, а затем включить Bluetooth с помощью кнопки iOS.

Еще одна странная вещь: представьте, что центральный находится в той же ситуации (безуспешно пытается подключиться). В OS X, если я щелкну значок «Сеть» (с символом Wi-Fi) в строке состояния системы, он отобразит список всех доступных сетей Wi-Fi, и когда он добавит в список мой iPhone как «Личная точка доступа», в это время центральный (который находится на iPhone) удается подключиться к периферийному устройству (Mac).

Меню Wi-Fi с доступной точкой доступа iPhone

Из-за этой проблемы использование приложения сильно скомпрометировано, потому что случайно iPhone не сможет подключиться к Mac.

Я провел много дней в Интернете (Google, Stackoverflow, ...), чтобы найти похожие случаи. Я прочитал много статей и пробовал много вещей, таких как остановка сканирования и запуск его снова, если соединение не удалось, например, через 10 секунд.

Не стесняйтесь сказать мне, если мой вопрос не ясен. Я буду обновлять его, если это необходимо.

Заранее большое спасибо за вашу помощь. Мне действительно нужно найти способ исправить это.


person ndominati2    schedule 17.03.2015    source источник


Ответы (1)


У меня нет ответа (и недостаточно представителей, чтобы прокомментировать), но я уже несколько месяцев сталкиваюсь с очень похожей проблемой. Мое приложение для iOS, которое играет центральную роль, иногда не может обнаружить службы на периферийном устройстве (linux), что можно исправить только путем включения и выключения питания Bluetooth-радио на моем устройстве iOS через настройки/Bluetooth. После переключения Bluetooth-радио обнаружение периферийных устройств работает отлично.

Я обнаружил два воспроизводимых случая: (1) Если на моем периферийном устройстве я полностью заменю рекламируемую службу (т. е. изменю UUID службы и все характеристики), то периферийное устройство iOS обнаружит периферийное устройство с этой новой службой во время сканирования, но обнаружение службы не удается. Я обнаружил, что вызывается периферия: didDiscoverServices, но список служб для этого периферийного устройства пуст. (2) Если на моем периферийном устройстве я каким-либо образом изменяю список характеристик (добавляю новую, удаляю одну), приложение iOS вообще не замечает этого изменения. При обнаружении характеристик представлен тот же список характеристик (до модификации). Опять же, выключение и включение Bluetooth-радио на устройстве iOS, похоже, единственное, что исправляет это.

Похоже, что iOS кэширует периферийные службы и характеристики BTLE при обнаружении нового периферийного устройства, и единственный способ очистить этот кеш — выключить и снова включить Bluetooth-радио.

person Joe M    schedule 04.05.2015