2015-03-17 6 views
2

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

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

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

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

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

Wifi menu with available iPhone hotspot

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

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

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

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

ответ

0

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

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

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