Как определить с помощью CoreBluetooth, когда исчезает периферия?
Я хотел бы иметь список устройств, к которым может подключиться моя iOS, который обновляется при появлении и исчезновении устройств.
Для этого я создал NSMutableDictionnary* peripheralsAvailable
и каждый раз - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
вызывается CBCentralManager, я добавляю периферийное устройство к словарю "Периферийные данные доступны" (а затем обновляю UITableView). Все в порядке здесь.
Однако я не могу найти, как я могу обновить словарь, если периферийные устройства "исчезают". Кажется, что я могу добавить периферию в свой словарь только тогда, когда они обнаружены, но я не могу удалить одну, когда я отключаю ее, например.
Не могли бы вы сказать мне, если я что-то упустил?
2 ответа
ОС будет кэшировать обнаружение устройств. Т.е. вы получите только одно событие "обнаружения" на устройство.
Чтобы непрерывно получать события обнаружения во время рекламы периферийного устройства, необходимо использовать следующую опцию:
CBCentralManagerScanOptionAllowDuplicatesKey
Логическое значение, которое указывает, должно ли сканирование выполняться без фильтрации дубликатов.
Значением этого ключа является объект NSNumber. Если ДА, фильтрация отключена, и событие обнаружения генерируется каждый раз, когда центральное устройство получает рекламный пакет от периферийного устройства. Отключение этой фильтрации может отрицательно повлиять на срок службы батареи и должно использоваться только при необходимости. Если НЕТ, множественные открытия одного и того же периферийного устройства объединяются в одно событие обнаружения. Если ключ не указан, значением по умолчанию является НЕТ.
Установка вышеуказанной опции в YES
Вы можете отслеживать все периферийные устройства, которые рекламируют, и когда он прекращает рекламу, вы можете удалить его из списка.
Для устройства, к которому вы подключены, есть didDisconnectPeripheral
делегат мероприятия.
Устройства Bluetooth не объявляют о том, что они собираются уходить, и при этом они не объявляют о том, что вы собираетесь выйти из зоны действия. Вы получаете рекламу, когда они рекламируют, и вы находитесь в пределах досягаемости, и вы ничего не получаете, когда вы находитесь вне зоны досягаемости или они прекращают рекламу. Там нет события, чтобы вызвать, когда они ушли. Вы должны помнить устройства, которые рекламируют, и когда они прекращают рекламу (вы давно не получали рекламу), вы можете удалить ее из списка.
Отличный ответ от Маркуса. Еще одно примечание, которое нужно добавить, это то, что опция сканирования CBCentralManagerScanOptionAllowDuplicatesKey, как упомянуто выше, не работает в фоновом режиме.
Приложения, которые указали центральный режим Bluetooth, могут сканировать в фоновом режиме. При этом они должны явно сканировать одну или несколько служб, указав их в параметре serviceUUIDs. Параметр сканирования CBCentralManager игнорируется при сканировании в фоновом режиме.