#ios #bluetooth-lowenergy #core-bluetooth #btle
#iOS #bluetooth -низкое энергопотребление #ядро-bluetooth #btle
Вопрос:
Объяснение :
Я подключаюсь к периферийному устройству BTLE с помощью core bluetooth framework, сохраняя идентификатор периферийного устройства в базе данных.
В то же время я сохраняю периферийные устройства в массиве для обработки повторного подключения к периферийным устройствам.
Но, когда пользователь вручную выходит из приложения, мой массив становится пустым.
из-за чего я не смогу снова подключить эти периферийные устройства.
Теперь у меня есть идентификаторы периферийных устройств в моей базе данных.
Я прочитал об этом и обнаружил, что существует метод делегирования
- (NSArray<CBPeripheral *> *)retrievePeripheralsWithIdentifiers:(NSArray<NSUUID *> *)identifiers NS_AVAILABLE(NA, 7_0)
Чтобы получить периферийные устройства, но он ничего не возвращает.
Как я могу снова получить периферийные устройства?
Я также проверяю приведенный выше документ. В этом они упомянули о методах повторного подключения к периферийным устройствам
Retrieving a List of Known Peripherals
The first time you discover a peripheral, the system generates an identifier (a UUID, represented by an NSUUID object) to identify the peripheral. You can then store this identifier (using, for instance, the resources of the NSUserDefaults class), and later use it to try to reconnect to the peripheral using the retrievePeripheralsWithIdentifiers: method of the CBCentralManager class. The following describes one way to use this method to reconnect to a peripheral you’ve previously connected to.
When your app launches, call the retrievePeripheralsWithIdentifiers: method, passing in an array containing the identifiers of the peripherals you’ve previously discovered and connected to (and whose identifiers you have saved), like this:
knownPeripherals =
[myCentralManager retrievePeripheralsWithIdentifiers:savedIdentifiers];
The central manager tries to match the identifiers you provided to the identifiers of previously discovered peripherals and returns the results as an array of CBPeripheral objects. If no matches are found, the array is empty and you should try one of the other two reconnection options. If the array is not empty, let the user select (in the UI) which peripheral to try to reconnect to.
When the user selects a peripheral, try to connect to it by calling the connectPeripheral:options: method of the CBCentralManager class. If the peripheral device is still available to be connected to, the central manager calls the centralManager:didConnectPeripheral: method of its delegate object and the peripheral device is successfully reconnected.
Note: A peripheral device may not be available to be connected to for a few reasons. For instance, the device may not be in the vicinity of the central. In addition, some Bluetooth low energy devices use a random device address that changes periodically. Therefore, even if the device is nearby, the address of the device may have changed since the last time it was discovered by the system, in which case the CBPeripheral object you are trying to connect to doesn’t correspond to the actual peripheral device. If you cannot reconnect to the peripheral because its address has changed, you must rediscover it using the scanForPeripheralsWithServices:options: method.
Комментарии:
1. Если
retrievePeripheralsWithIdentifiers
не возвращает периферийное устройство, вам нужно будет обнаружить периферийное устройство, просканировав его рекламу.2. Не имеет ли больше смысла сохранять UUID в локальной базе данных и извлекать его из фонового потока
3. Да, Дэниел, но как вы их повторно используете. поскольку я использовал периферийный метод retrive и передал ему идентификаторы. но все же я не получил эти периферийные устройства.
Ответ №1:
При запуске приложения я бы просто обнаружил все периферийные устройства, а затем сравнил обнаруженные периферийные устройства с идентификаторами периферийных устройств, хранящимися в базе данных.
После сравнения обнаруженных периферийных устройств и периферийных устройств можно установить соединения для требуемых периферийных устройств.
Комментарии:
1. Привет, Липпонен, я тоже думаю о том же. но будет интересно, есть ли какое-либо другое решение.
2. Зачем вам другое решение? Просто записывайте свой массив в базу данных каждый раз, когда он обновляется, и повторно заполняйте свой массив из базы данных, когда он пуст, а база данных не пуста.
3. Мы сохраняем идентификатор периферийных устройств в базе данных, но у нас нет объекта периферийных устройств для связи с BLE. Итак, нужен способ получить периферийные устройства из идентификаторов.
4.
CBCentralManager.retrievePeripherals(withIdentifiers:)
вот как вы это делаете, но только если центральный сервер все еще знает о них. Часто это происходит, но в данном случае это не так, поэтому вам нужно заново открыть их. Страница, на которую вы ссылаетесь, предоставляет поток. Все дело в том, что кэшируется или не кэшируется. В каждом случае невозможно перейти от «у меня есть идентификатор» к «У меня есть CBPeripheral» за один шаг. Иногда да, но иногда нет, и для этого вам просто нужно закодировать. Периферийные устройства обычно сохраняют свой идентификатор некоторое время, но этого тоже никто не обещает. У того же периферийного устройства может быть новый идентификатор.