Диалоговое окно сопряжения iOS BLE не отображается при удалении информации сопряжения на периферийном устройстве

Я разрабатываю приложение для iOS, которое работает как центральный BLE с настраиваемыми службами и характеристиками.

А периферийное устройство разработано определенным производителем.

Системе необходимо объединить центральное и периферийное устройства в пары для записи значения характеристики. А теперь у меня проблема с сопряжением.

Если я удалю информацию о сопряжении на центральной (iPhone) стороне с помощью [Забыть это устройство] в [Bluetooth] в [Настройки],
последовательность сопряжения начнется снова, когда мое приложение попытается записать значение характеристики после подключения и обнаружить службу и характеристику. (Диалог сопряжения отображается в моем приложении)

Последовательность такая, как показано ниже,

 1. Complete connection
     [_centralMgr centralManager:didConnectPeripheral:]
 2. Discover service
 [_centralMgr peripheral:didDiscoverServices:]
 3. Discover characteristic
 [_centralMgr peripheral:didDiscoverCharacteristicsForService:error:]
 4. Try to write characteristic value
 [_centralMgr peripheral:writeValue:forCharacteristic:tyep:]
 5. At this timing, paring  dialog is shown and user tap [Paring] button
 6. Complete writing of characteristic value without error
 [_centralMgr peripheral:didWriteValueForCharacteristic:error:]

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

Диалог сопряжения никогда не отображается, и ответ на запрос записи не возвращается.

Последовательность, как показано ниже,

 1. Complete connectiton
 [_centralMgr centralManager:didConnectPeripheral:]
 2. Discover service
 [_centralMgr peripheral:didDiscoverServices:]
 3. Discover characteristic
 [_centralMgr peripheral:didDiscoverCharacteristicsForService:error:]
 4. Try to write characteristic  value
 [_centralMgr peripheral:writeValue:forCharacteristic:tyep:]
 5. At this timing, paring dialog is never shown
 6. Response of writing request(in STEP 4.) doesn't return

Производитель периферийного устройства сообщает, что iPhone не запрашивает сопряжение, даже если периферийное устройство возвращает ошибку записи.

Но мое приложение (по крайней мере, уровень приложения в iOS) не получило API-интерфейс делегата ошибки записи.

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

Добавьте код записи значения характеристики

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(nonnull CBService *)service error:(nullable NSError *)error
{
    NSArray* characteristics = service.characteristics;

    for (CBCharacteristic* characteristic in characteristics) {
        if (characteristic.properties & CBCharacteristicPropertyWrite) {
            if ([[characteristic.UUID UUIDString] isEqualToString:MY_CUSTOM_CHARACTERISTIC]) {
                NSData* data = MY_CUSTOM_DATA;
                [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
                NSLog(@"writeValue:%@", data);
            }
        }
    }
}

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

Но только в последнем случае (удален на периферийной стороне) последовательность сопряжения не запускается.


person M.Masa    schedule 02.10.2015    source источник
comment
Можете ли вы публиковать связанные части кода (а не только функции, которые вы используете)?   -  person Raptor    schedule 02.10.2015
comment
Мне такое поведение кажется понятным. Вы удалили данные ключа связывания с периферийного устройства, но не с iOS, поэтому iOS считает, что у него все еще есть действительная информация о связывании, и не будет инициировать запрос связывания. Однако вы можете отправить в Apple запрос об ошибке / поддержке и посмотреть, что они скажут. Нет ничего явного, что вы можете сделать через Core Bluetooth, чтобы очистить или инициировать процесс сопряжения / связывания.   -  person Paulw11    schedule 02.10.2015
comment
@Raptor Я добавил код записи значения характеристики. Спасибо.   -  person M.Masa    schedule 02.10.2015
comment
@ Paulw11 Моя команда, также разрабатывающая приложение для Android, и инженер периферийного устройства сказали, что запрос Android снова синхронизируется, если периферийное устройство возвращает ошибку записи после удаления информации о сопряжении. на периферической стороне. И я разместил тот же вопрос на форуме разработчиков iOS. Я спрошу об инциденте технической поддержки (TSI), если это необходимо. Спасибо.   -  person M.Masa    schedule 02.10.2015


Ответы (1)


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

person Imran    schedule 02.10.2015
comment
Спасибо за ваш ответ. Я хотел бы еще раз подтвердить один момент. Когда информация о сопряжении удалена со стороны iPhone (в центре), iPhone (платформа) запросит сопряжение. И когда информация о сопряжении удаляется на стороне устройства (периферийного устройства), устройство должно запросить сопряжение, после чего на экране iPhone отобразится диалоговое окно сопряжения. Я правильно понимаю? - person M.Masa; 02.10.2015
comment
@Imram Я разговаривал с инженерами по периферийному устройству, и он сказал, что приложение Android (мы тоже разрабатываем) запрашивает сопряжение, когда периферийное устройство возвращает ошибку записи после удаления информации о сопряжении. на периферийном устройстве. А периферийное устройство не может распознать центральную платформу ОС (Android или iOS), поэтому они не могут запрашивать сопряжение с периферийной стороны. - person M.Masa; 02.10.2015
comment
@ M.Masa Как вы знаете, вы не можете много играть со связями и спариванием на стороне приложения, поскольку все это делается в iOS. Вы должны спросить об этом на форуме Apple или сообщить об ошибке, как предлагает Paulw11. - person Imran; 02.10.2015