Есть ли способ быстрее обнаружить периферийную службу BLE?

Я считаю, что моя реализация протокола BLE в iOS7 очень медленная на этапе запуска. Последовательность запуска составляет ~ 68% от всего времени выполнения в моем приложении.

Что я могу сделать, чтобы это было быстрее?

Я рассчитал время и вот что у меня получилось.

     t     dt   
37.598          [BLE] Discovered peripheral at RSSI -27 with UUID:XYZ
37.599  0.001   [BLE] Connecting to peripheral                                                                            
37.602  0.003   [BLE] Scanning stopped                                                                                           
37.685  0.083   [BLE] Peripheral connected                                                                                
38.48   0.795   [BLE] Discovered service  
38.599  0.119   [BLE] Discovered characteristic    

Как видите, есть огромная пробка, прежде чем вы обнаружите эту услугу.

Мой стартовый код упростился:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
            [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUuid]]
                                            options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
            break;
        case CBCentralManagerStatePoweredOff:
            [central stopScan];
            break;
        default:
            break;
    }
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    if (self.discoveredPeripheral != peripheral) {
        self.discoveredPeripheral = peripheral; // Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
        [central connectPeripheral:peripheral options:nil];
        [central stopScan];
    }
}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    [peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUuid]]];
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:@[array of characteristics]
                                 forService:service];
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
    ...
}

ИЗМЕНИТЬ

Я узнал, что аналогичные приложения на Android делают это в десять раз быстрее (что делает приложение Android более быстрым -> лучший пользовательский интерфейс), поэтому мне любопытно, является ли моя реализация, уровень BLE или оборудование узким местом. Проверено на iPhone 4S.


person MdaG    schedule 16.10.2013    source источник
comment
Мне любопытно, сколько времени у вас ушло на то, чтобы обнаружить периферийное устройство. Я предполагаю, что настало время для обнаружения периферийных устройств, и их услуги связаны с их аппаратной реализацией.   -  person reTs    schedule 17.10.2013
comment
По моему опыту, периферийным устройствам, которые рекламируют себя с большей скоростью, потребуется меньше времени для обнаружения услуг. Возможно, совпадение, так как у меня есть только несколько периферийных устройств, с которыми можно поиграть. Кроме того, самое долгое время, которое я трачу на обнаружение сервисов периферийного устройства, составляет ~ 0,5 с, что для меня приемлемо.   -  person reTs    schedule 17.10.2013
comment
Я снова протестировал два совершенно разных (аппаратных) периферийных устройства, и результаты были одинаковыми (плюс-минус 50 мс). Я не уверен, как измерить время до обнаружения периферийного устройства? Тем не менее разница во времени между обнаружением периферийных устройств и обнаружением службы довольно значительна, поскольку из-за этого приложение кажется более медленным, чем могло бы быть.   -  person MdaG    schedule 17.10.2013
comment
какие устройства вы использовали ..? Я пробовал использовать электронный ключ CiragoBLE BT8000 .. но он не обнаруживает ... Пожалуйста, укажите мне какой-нибудь bluetooth-ключ для обнаружения в ios. Заранее спасибо!   -  person    schedule 29.04.2014
comment
Я не использую ключ, я использую отдельное периферийное устройство BLE, созданное специально для связи с устройствами BLE (не только устройствами iOS). Вы пробовали определять свой ключ с помощью LightBlue? itunes.apple.com/gb/app/ голубой-bluetooth-low-energy /   -  person MdaG    schedule 30.04.2014


Ответы (2)


Когда вы шифруете соединение, iOS должна кэшировать базу данных GATT. Следовательно, последующие вызовы обнаружения после первого должны происходить мгновенно.

Начиная с iOS 7, даже значения характеристик кэшируются, что означает, что вы можете считывать статические значения, такие как «Имя устройства», через свойство значения характеристики. Если вы хотите их обновить, вам все равно необходимо отправить запрос на чтение значения характеристики.

Для получения дополнительных сведений о поведении кэширования см. сеанс 703 WWDC 2013 со слайда. 48 (наверное, стоит посмотреть соответствующую часть в видео).

Что касается времени подключения и обнаружения, это в основном интервал объявления. Есть несколько рекламных интервалов, которые Apple рекомендует для максимальной производительности в Рекомендации по дизайну аксессуаров Bluetooth для Apple. Продукты (раздел 3.5 Рекламный интервал). Также следует отключить сканирование при подключении, так как сканирование замедляет процесс подключения примерно в 55 раз.

Обратите внимание, что основанные на iOS ограничения на количество пакетов, отправляемых на событие подключения, не должны заметно влиять на время обнаружения (если у вас нет гигантской базы данных GATT и вы запрашиваете все это). Эти ограничения должны стать видимыми только для «Запись без ответа» и «Уведомление о значении характеристики» в соответствии с конструкцией протокола LE.

person Etan    schedule 26.10.2013
comment
Отправленные вами ссылки на WWDC 2013 session 703 не работают, обновите их для этой: разработчик. apple.com/videos/wwdc/2013/?id=703 - person GoRoS; 24.05.2014

API на уровне фреймворка для повышения скорости обнаружения отсутствует. BTLE сосуществует с классическим Bluetooth (на уровне структуры системы) и Wi-Fi (на уровне антенны), поэтому максимальное время нахождения на антенне ограничено системой.

person cbowns    schedule 24.10.2013
comment
Значит, это зависит от оборудования? Тогда это объяснило бы более быстрое приложение для Android. - person MdaG; 24.10.2013
comment
Более-менее да. Я полагаю, что на телефонах Android вы также можете увидеть некоторую вариативность в скорости отклика: разные наборы микросхем и компоновки антенн будут диктовать разные требования к сосуществованию. - person cbowns; 24.10.2013