Периферийные и центральные одновременно на iOS

Я везде искал и все пробовал, но ничего не работает: (

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

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

Однако, когда оба устройства одновременно являются периферийными и центральными, я получаю случайные ошибки: на любом этапе (обнаружение сервисов/характеристик или установка уведомления на значение YES) иногда случаются ошибки, а иногда discoverServices doesn ' t даже вызывать didDiscoverServices

Есть ли что-то другое, что я должен делать? Я просто объединил периферийный и центральный код в один контроллер представления. Я заметил, что если устройство "a" подключается к устройству "b", а затем устройство "b" подключается к устройству "a", оно работает чаще, чем нет. Я управляю этим, используя NSThread sleepForTimeInterval: вручную для разного количества времени на каждом устройстве, но как я могу заставить одно устройство подключить сначала (а затем и другое) надежным (а не вручную заранее определенным) способом?

Если я получаю ошибки, обычно они просто Unknown error

Пожалуйста, дайте мне знать, если вам нужен какой-либо код или любая другая информация:)

Ответ 1

Да, это может быть в обеих ролях одновременно. Вам просто нужно инициализировать CBPeripheralManager и CBCentralManager. Как только периферийный менеджер инициализируется и вы получаете состояние POWER ON, устройство начинает действовать как периферийное устройство. Вы можете добавить свои услуги в этот момент и получать соединения с других устройств. В то же время вы можете использовать центральный менеджер для сканирования и инициирования подключений к другим периферийным устройствам.

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

Для ваших ошибок я предлагаю:

  • Перед началом соединения отключите сканирование. То есть сканирование, поиск периферийных устройств, остановка сканирования, подключение. Подключение и сканирование не похожи друг на друга.
  • Используйте выделенную очередь для обработки событий bluetooth, а не для основной очереди. [[CBCentralManager alloc] initWithDelegate:self queue:my_dedicated_bluetooth_q]
  • К сожалению, стек иногда становится неустойчивым. Возможно даже перезапуск. Но это обычно происходит только при тяжелых нагрузках или нескольких одновременных соединениях. Надеюсь, это будет улучшено в iOS7.
  • Незначительный Unknown error начал появляться для нескольких разработчиков в последнее время. Судя по вашему описанию, возможно, есть несколько причин, по которым ваша установка может завершиться неудачей, и для этого потребуется гораздо больше информации, которая хорошо вписывается в вопрос SO.

Для получения дополнительной информации я предлагаю вам искать архивы списков рассылки bluetooth-dev https://lists.apple.com/archives/Bluetooth-dev или отправлять почту [email protected] Сообщество предоставляет большую помощь, если вы подходите с такими разумными вопросами, как это.

Ответ 2

Во-первых, что вы имеете в виду "в одно и то же время"? Если вы имеете в виду рекламу устройства на других устройствах при сканировании других устройств, это невозможно. Но вы можете создать два потока, которые имеют один и тот же замок для рекламы и сканирования. Перед сканированием прекратите рекламу, прежде чем рекламировать, прекратите сканирование. Я тестировал свои iPhone 4 и iPad, работал хорошо.

Ответ 3

В соответствии с моим пониманием одно устройство может работать с одним режимом за раз. То есть, если устройство работает в периферийном режиме, тогда вы не можете работать в нем как центральный режим. Если вы видите некоторые стандартные примеры, такие как передача BTLE или lilke Светло-голубой, которые работают в одном режиме за раз.