Подключение CBCentral к CBPeripheral без сканирования

У меня есть два устройства iOS на 7.1, одно работает как CBCentral, а другое как CBPeripheral. На обоих устройствах работает программное обеспечение моей собственной разработки, поэтому все UUID/CBService/CBCharacteristic генерируются мной, а все параметры фиксированы и всегда известны.

Кроме того, оба устройства имеют доступ к общему серверу для хранения любых произвольных данных, которые мне могут понадобиться.

Учитывая, что я контролирую всю экосистему, есть ли способ подключить устройство CBCentral к устройству CBPeripheral без предварительного вызова scanForPeripheralsWithServices:? В каком-то смысле я хочу «научить» центральное о существовании периферийного до того, как два устройства вступят в контакт друг с другом.

Возможно, есть какие-то данные или значения, которые модуль CBPeripheralManager мог бы отправить на сервер, которые модуль CBCentralManager мог бы получить, а затем напрямую выделить/инициировать свой собственный объект CBPeripheral для использования с connectPeripheral:options:?


person christopherdrum    schedule 17.03.2014    source источник


Ответы (1)


Нет, ты не можешь. Core Bluetooth использует внутренне сгенерированные UUID для идентификации одноранговых узлов. Если вы не сканируете, система не идентифицирует периферийные устройства, и вы не сможете вызвать метод retrievePeripheralsWithIdentifiers: для получения периферийного устройства CBPeripheral, для которого вы можете вызвать connectPeripheral:.

Поскольку нет возможности внедрить UUID, вы должны выполнить сканирование хотя бы один раз. Но в зависимости от многих факторов, наверное, много раз.

person allprog    schedule 17.03.2014
comment
Я бы также добавил, что вы не можете хранить CBPeripheral, так как он не реализует протокол NSCoding. Это то, что я хотел сделать сначала в своем приложении (пользователь получает сканирование при первом запуске, а не после). Придется сканировать при каждом запуске. - person Jissay; 17.03.2014
comment
@allpro - Что ж, это подтверждает мои собственные выводы. Кажется, этот внутренне сгенерированный UUID является большим блокировщиком. Я надеялся, что у кого-то умнее меня есть способ! - person christopherdrum; 17.03.2014
comment
@Jissay - Да, я тоже это нашел. Честно говоря, меня не так расстраивает необходимость сканирования, как тот факт, что два устройства в фоновом режиме не могут обнаружить друг друга, несмотря на то, что они вещают и сканируют именно друг друга и никого другого. Отсутствие рекламы сервиса + невозможность общего сканирования всех ближайших устройств в фоновом режиме — это настоящий удар один-два в нижние регионы. - person christopherdrum; 17.03.2014
comment
Конечно, эта неспособность уже погубила многие проекты. Кроме того, аргумент Apple о том, что это будет проблема конфиденциальности, кажется не очень актуальным. Может быть, потребность в мощности - единственная правдоподобная причина этого. Так или иначе, нам придется с этим жить, пока кто-нибудь не придумает батарею, которая работает на порядок дольше. - person allprog; 17.03.2014
comment
Да, я не вижу проблем с конфиденциальностью, если заинтересованные стороны соглашаются на это. Я вижу озабоченность по поводу власти; однако такие устройства, как Estimote, работают от одной литиевой батареи два года. Я думаю, что iOS-устройство может справиться с дневной трансляцией с каждой ночной зарядкой устройства. Что ж, будем надеяться на будущее! - person christopherdrum; 18.03.2014
comment
Я не понимаю. Я использую уровень абстракции (от производителя чипов Bluetooth), который именно это и делает: сохраняет UDID и возвращает их с помощью retrievePeripheralsWithIdentifiers:. Даже худшее, в самый первый раз (после сканирования) я сохраняю указатель на этот CBPeripheral, но все равно вызываю connectPeripheral неt do anything if it wasn't done after a сканировать`... - person StuFF mc; 07.01.2016