iOS Bluetooth LE: невозможно подключиться с использованием сохраненных данных сопряжения

Что я пытаюсь сделать

Я пытаюсь подключить свое приложение к устройству Bluetooth LE, которое необходимо подключить.

Текущее поведение

Нет проблем без сопряжения устройства и моего приложения для iPhone. Я могу без проблем подключать, переподключать и читать / писать характеристики.

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

Наконец-то ...

После нескольких часов безуспешных поисков в Интернете, вот мои вопросы:

  • Как я могу подключить свое приложение к устройству Bluetooth LE из моего приложения iPhone, используя данные сопряжения, хранящиеся в моем телефоне? Я что-то упускаю?

  • Возможно ли, что это не проблема IOS, потому что, если в телефоне есть данные сопряжения для подключаемого устройства, они используются автоматически?

Есть ли кто-нибудь, у кого есть опыт работы с Bluetooth LE и IOS, чтобы мне помочь?

Обновление 2013-10-27

Я обнаружил, что вы не можете прочитать защищенную характеристику путем парной аутентификации сразу после того, как характеристика была обнаружена, если парное соединение существует (нет всплывающего окна подтверждения). Нет проблем с незащищенной характеристикой! Я не знаю точно, почему это происходит, но поведение таково, что приложение IOS никогда не получает ответов от устройства.

Так что, если первое чтение будет сделано после, это не вызовет проблем. Вот код, который я использую для определения характеристик при чтении данных в комментариях.

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
{
    NSArray     *characteristics    = [service characteristics];
    CBCharacteristic *characteristic;

    if (peripheral != servicePeripheral) {
        NSLog(@"Wrong Peripheral.\n");
        return ;
    }

    if (service != batteryService) {
        NSLog(@"Wrong Service.\n");
        return ;
    }

    if (error != nil) {
        NSLog(@"Error %@\n", error);
        return ;
    }

    for (characteristic in characteristics) {
        NSLog(@"discovered characteristic %@", [characteristic UUID]);

        if ([[characteristic UUID] isEqual:[CBUUID UUIDWithString:kBatteryCharacteristicUUIDString]]) { // Bat
            NSLog(@"Discovered Bat Characteristic");
            batteryCharacteristic = [characteristic retain];
            //--> generate problem when pairing exists between IOS app and device
            //[peripheral readValueForCharacteristic:batteryCharacteristic];
        }
    }
}

person sdespont    schedule 25.10.2013    source источник
comment
Можете ли вы проверить с помощью сниффера Bluetooth? Насколько мне известно, iOS только шифрует каналы и позволяет считывать защищенные характеристики, когда вы выполняете полное сопряжение на основе PIN-кода. В противном случае ваше удаленное устройство сможет использовать информацию о сопряжении только для распознавания iPhone в будущих подключениях.   -  person Etan    schedule 28.10.2013
comment
Я столкнулся с той же проблемой. Итак, когда вы сказали, что проблема была на стороне чипа, как вы продвинулись и решили проблему? Не могли бы вы дать несколько указателей?   -  person Subzero    schedule 29.04.2015
comment
@Subzero Я использовал чип Nordic BLE nRF51822, и характеристики характеристик не были четко определены в uController.   -  person sdespont    schedule 30.04.2015
comment
я также сталкиваюсь с той же проблемой всякий раз, когда я пишу что-то на ble, он не отвечает, и я не получаю никаких данных в didupdatecharcaterstics   -  person Nex Mishra    schedule 23.11.2015
comment
@sdespont Вы достигли этого? У меня такая же проблема ... Также используется тот же чип Nordic BLE nRF51822.   -  person Solid Soft    schedule 02.05.2016
comment
@SolidSoft Проблема была не в iOS, а в чипе Nordic. Свойства характеристик не были четко определены в uController   -  person sdespont    schedule 02.05.2016
comment
@sdespont ОК, программист nRF51822 заявил, что безопасное соединение уже сделало это. Но в iOS я не мог использовать метод connectPeripheral: options:. В iOS мы не хотим ничего менять. Только метод connectPeripheral откроет диалоговое окно сопряжения, если чип nRF51822 запрограммирован правильно. Верно ? Пожалуйста, ответь.   -  person Solid Soft    schedule 04.05.2016
comment
@sdespont Пожалуйста, оставьте комментарий к вышеуказанному запросу.   -  person Solid Soft    schedule 06.05.2016
comment
@SolidSoft Извините, я не могу вам помочь. Вам следует попытаться задать вопрос на странице devzone.nordicsemi.com/questions.   -  person sdespont    schedule 06.05.2016


Ответы (1)


Вам не нужно ничего делать в своем приложении для управления сопряжением.

Если ваше приложение работает в режиме LE Central и периферийное устройство отправляет код ошибки недостаточной аутентификации в ответ на запрос чтения / записи, iOS автоматически соединится с вашим устройством и попытается повторить запрос.

Если вы отключитесь от устройства, а затем снова подключитесь, периферийное устройство должно снова отправить код ошибки недостаточной аутентификации, чтобы iPhone перезапустил шифрование. Опять же, здесь вам не нужно делать ничего особенного в своем приложении.

Если ваше приложение работает в периферийном режиме LE, все обстоит немного иначе. При настройке базы данных GATT убедитесь, что установлены правильные флаги для CBAttributePermissions и CBCharacteristicProperties. Это сообщит iOS, что она должна сама отправить код ошибки недостаточной аутентификации, если он не сопряжен. В этом случае центральное устройство должно запустить процесс шифрования.

Дополнительные ограничения описаны в рекомендациях по проектированию аксессуаров Bluetooth для продуктов Apple.

  • Ваш аксессуар должен иметь возможность разрешать частные адреса Bluetooth. IPhone будет время от времени менять свой общедоступный адрес Bluetooth, и только сопряженные устройства будут иметь правильный ключ для разрешения этого публичного адреса и распознавания iPhone.

  • «Раздел 3.9 Сопряжение» тоже интересен.

  • Обратите внимание, что если вы выполняете сопряжение без защиты «человек посередине» (MITM), ваше периферийное устройство может использовать полученный ключ для разрешения частного Bluetooth-адреса iPhone. Однако вы не сможете зашифровать канал.

    Сопряжение с защитой MITM на iOS предполагает ввод PIN-кода, который отображается на удаленном устройстве. Внеполосное сопряжение (OOB), при котором вы отправляете данные сопряжения по внешнему каналу, не поддерживается iOS, насколько мне известно (по крайней мере, нет общедоступных API-интерфейсов для установки данных OOB).

    Короче говоря: если у вас есть только пара «Сопряжение» / «Отмена», вы не сможете зашифровать канал LE, а только распознаете iPhone при будущих подключениях. Приятно то, что вы все равно можете распознать iPhone, даже если разорвите его на стороне iPhone, и даже после восстановления прошивки iPhone ;-).

Что касается шифрования LE в целом: оно в любом случае небезопасно (см. http://eprint.iacr.org/2013/309) .

person Etan    schedule 26.10.2013
comment
Спасибо за полный и интересный ответ. Поскольку на моем устройстве нет дисплея или клавиатуры, метод аутентификации - Just Works. Вы правы насчет того, что мне не нужно ничего делать для работы с текущей информацией о сопряжении. Имея в виду ваш ответ, я смог указать на настоящую проблему. Проверьте мой вопрос в обновлении. - person sdespont; 27.10.2013
comment
проблема была в стороне чипа BLE. Спасибо, что помог мне поверить в поведение iPhone, я обвинял не то устройство: o) - person sdespont; 05.12.2013
comment
@Etan. Я пытаюсь выполнить сопряжение устройства iOS с принтером через Bluetooth. Я бы знал MAC-адрес и PIN-код Bluetooth для принтера. Как я могу сделать это в коде без отображения диалога? Является ли это возможным? - person Jorgen; 17.04.2014
comment
Это невозможно с общедоступными API. Возможно, вы можете использовать частный фреймворк BluetoothManager (недокументированный) для этого. Интерфейс здесь: github.com/nst / iOS-Runtime-Headers / blob / master / - person Etan; 17.04.2014
comment
@ Этан, спасибо. Я просмотрел его и отправил запрос владельцу GitHub, чтобы узнать, может ли он пролить на него свет. Однако это выглядит очень многообещающе. - person Jorgen; 22.04.2014
comment
Можем ли мы получать информацию с какого-либо устройства без сопряжения в iPhone. - person Rajath Shetty K; 18.03.2016
comment
@rajath Это значение по умолчанию, если вы не укажете специальные разрешения / свойства. - person Etan; 22.03.2016
comment
Я не могу открыть диалоговое окно сопряжения. Как его вызвать при подключении периферийного устройства? - person Solid Soft; 02.05.2016