Обратный вызов подключения CBPeripheralManager

Я пытаюсь установить Bluetooth-соединение между двумя устройствами iOS. Идея состоит в том, что одно устройство предлагает услугу, и к ней подключаются несколько устройств:

Устройство А (служба): пользователь просматривает презентацию

Устройство B (несколько клиентов): пользователь смотрит презентацию, никакого взаимодействия

В моем понимании тот, кто предлагает услугу, должен рекламировать ее и, соответственно, быть периферийным, создав CBPeripheralManager и внедрив CBPeripheralManagerDelegate -> Device A.

С другой стороны, есть несколько центральных устройств, которые сканируют периферийные устройства, используя CBCentralManager и реализуя CBCentralManagerDelegate. После установления соединения они отправляют запросы на чтение и запись на периферийное устройство, используя класс CBPeripheral и CBPeripheralDelegate -> Device B.

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

Поэтому моей первой идеей было поменяться ролями. Теперь центральное устройство предлагает услугу, сканируя устройства, которые сообщают, что они хотят использовать эту услугу (?!?), и несколько периферийных устройств могут подключаться к одному центральному устройству. Уже звучит так, как будто это должно быть неправильно, верно? И вот беда: теперь периферийные устройства (пользователи, которые смотрят презентацию) больше не получают уведомления, если соединение было установлено или потеряно (аааааааа).

Теперь к вопросу: есть ли хороший способ сделать устройство iOS периферийным устройством и распознавать подключения и отключения (которые должны включать отключения по расстоянию и т. д.)?

ДОБАВЛЕНО: в WWDC 2012 Session 705 (ссылка на слайды презентации) центральные методы Упоминаются :didConnect и Central:didDisconnect. Но даже в бета-документации CBPeripheralManagerDelegate для iOS 7 эти методы не упоминаются. Может быть, это тупик, и Apple сейчас смеется надо мной...

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

Бенджамин


person benjamin.ludwig    schedule 10.07.2013    source источник
comment
Очень хотелось бы найти что-то, чтобы получать уведомления о соединениях. При удаче?   -  person christophercotton    schedule 13.01.2014


Ответы (2)


Вы должны сделать Устройство A (ведущее) периферийным устройством, рекламирующим услугу, а Устройство B (зрители) — центральным, которое подписывается на услугу периферийного устройства.

Вы можете использовать CBPeripheralManagerDelegate для получения уведомлений, когда центральный сервер подключается к вашему периферийному устройству. Ниже приведена документация по методам делегата CBPeripheralManager: Ссылка

Это метод, который вам нужно реализовать, чтобы распознавать, когда центральное устройство (устройство B, средство просмотра) подключается к вашему периферийному устройству (устройство A, докладчик):

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic

Это метод, который вам нужно распознать, когда центральное устройство (устройство B, средство просмотра) отключилось от вашего периферийного устройства (устройство A, докладчик):

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic

Когда вам нужно уведомить подписанные центральные устройства (устройство B, зрители) об изменении слайда, используйте этот метод (newValue будет своего рода индикатором обновленной позиции в презентации, например, номером слайда):

[self.peripheralManager updateValue:newValue forCharacteristic:yourCharacteristic onSubscribedCentrals:nil];

Если вы хотите просмотреть простую демонстрацию совместного использования Bluetooth LE с устройствами, выступающими в качестве центральных и периферийных устройств, вы можете проверить этот проект: SimpleShare

Надеюсь, это поможет! Дайте мне знать, если я могу что-то прояснить.

Лаура

person Laura    schedule 14.01.2014
comment
Я попробовал периферийный менеджер: центральный: дидсубскриптохарактеристик:, но он никогда не вызывается. В сигнатуре сказано, что он будет вызываться по характерной подписке, а не по центральному соединению. Я все еще ищу способ получать уведомления, когда центральный подключается. - person Lensflare; 23.02.2016

Начиная с iOS 10.3.3, для которой я написал приложение, в котором я делаю iPhone периферийным устройством и подключаюсь к нему с помощью центрального устройства BLE, у iPhone нет прямого способа узнать, когда он подключен и когда он отключен. .

Подписка на уведомление или команда/запрос записи в характеристику могут рассматриваться как способ узнать, что центральный сервер подключился, но обнаружение отключения по-прежнему сложно. Я заметил, что даже когда центральный BLE отключается, API didUnsubscribeFromCharacteristic не запускается до тех пор, пока он не отменит подписку самостоятельно.

Что я сделал, так это использовал таймер, который перезапускается каждый раз, когда получена «запись в характеристику». Когда время истекает, я объявляю, что соединение потеряно.

Я не понимаю, почему Apple не предоставляет API для таких маленьких, базовых вещей и не делает наши реализации (и нашу жизнь) такими сложными?!

person Sushant Shidore    schedule 20.09.2017