3

Я разрабатываю приложение, которое несколько раз подключается и отключается от различных периферийных устройств с низкой энергией Bluetooth. После многих исследований в Интернете я не нашел способ хранить уже обнаруженные сервисы и характеристики, чтобы я мог снова подключиться. В настоящее время я обнаруживаю требуемые услуги и характеристики после каждого повторного подключения, которое стоит мне от 1,5 до 2 секунд.Снова подключите CBPeripheral

Есть ли у кого-нибудь опыт или решение для хранения/кеширования CBService или CBCharacteristic или кто-то знает способ быстрее подключиться?

Спасибо за любую помощь

+0

Вы спрашиваете, как кешировать что-то в своем приложении? –

+1

Это было бы решением для кеширования сервисов и характеристик, но я уже пытался сделать копию услуг. Но, к сожалению, CBPeripheral, CBService и CBCharacteristic не приняли NSCopying. Есть ли другой способ их хранения? –

+0

Вы можете поместить Pripheral в массив. Этот массив вы можете «сохранить» как пользователь по умолчанию с NSUserDefaults Class –

ответ

6

Я попытался кэшированием периферического, обслуживания и характерные объектов в памяти и ручного кэширования не работает. Как только вы отключитесь от периферии, сервисные и характерные объекты больше не подходят для использования. Фактически даже CBPeripheral может переключаться из-под вас - CoreBluetooth имеет внутреннее поведение, когда UDID устройства будет меняться каждые несколько минут (если CBPeripheral - другое устройство iOS).

Однако, если вы работаете в разработке для iOS 6, есть способ ускорить работу. Если вы используете watch расширенный разговор Bluetooth на WWDC 2012, вы увидите слайд в конце о кешировании сервисов и характеристик. По сути, ОС может кэшировать их все для вас , но только для сопряженных устройств. Для сопряжения вам необходимо ответить на запрос записи с недостаточной ошибкой проверки подлинности. Например, для периферийного устройства IOS можно было бы написать что-то вроде:

- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests { 
     ... 

     [peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication]; 

     ... 
} 

Это будет всплывающее диалоговое окно спаривание на IOS периферийная, после чего вы будете работать в паре. Помимо этого вам не нужно менять свой код - просто вызовите функции DiscoverServices и т. Д., Как обычно, и они будут реагировать быстрее (т.е. мгновенно).

Я также протестировал это поведение на 10.8.3 и, похоже, не работает. Итак, я не знаю, как ускорить работу на OS X (кроме подключения к периферии).

+0

Благодарю вас за ответ. Я уже заполнил отчет об ошибке, и Apple сказала мне, что они кэшируют сервисы и характеристики. Но я тестировал это с помощью своего периферийного устройства, и я видел такой же медленный интервал соединения. Является ли это кэширование доступным только с 2 устройствами iOS или с периферийным устройством сторонних производителей? –

+1

Он должен работать с сторонним периферийным устройством, если вы установили с ним зашифрованную ссылку. Не проверял это сам. –

+0

имеет ли это зашифрованное соединение? Потому что на данный момент я подключаюсь к своему периферийному устройству без какого-либо шифрования вообще –

3

iOS 7 добавляет дополнительное кэширование (iOS 7: What's New in Bluetooth LE). Я вижу времена менее 100 мс (~ 80 мс в среднем) для повторного подключения к периферии, обнаружения сервисов, обнаружения характеристик и чтения значения одной характеристики.

Моя тестовая конфигурация была iPad Air, подключаемая к iPad 3.

+0

Darrinm, можете ли вы точно указать, где объяснение кэширования в статье? Я мог бы быть глупым, я просто не могу найти его. – Max

+0

@Max Не так много объяснений, только «Кэширование периферийных данных [...] улучшено с еще большим количеством данных от каждой характеристики и службы, включая последнее известное значение каждого признака». Таким образом, я приурочил все функции connect/discovery services/Discover/read value, чтобы узнать, насколько улучшено новое кэширование. – darrinm

Смежные вопросы