Сервис CoreBluetooth GAP - как динамически транслировать и обновлять характеристики сервиса? - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в Bluetooth и CoreBluetooth и пытаюсь создать тестовое приложение, которое:

  • использует устройство iOS в качестве вещателя GAP
  • использует то же самое iOS Устройство для обнаружения других iOS устройств, передающих ту же услугу
  • , любое приложение, передающее услугу, может динамически обновлять характеристики услуги c и другое количество устройств, чтобы динамически видеть обновленную характеристику c.

Динамическая природа c не обязательно должна быть немедленной / реальной, но близкой к реальной было бы неплохо. Интерактив будет бонусом.

По сути, id любит локальный многоадресный эквивалент, не полагаясь на какие-либо соединения или централи. В моем случае использования приложения нет необходимости в центральном и периферийном устройстве для согласования соединения. Все данные передаются, анонимизируются и предназначены только для чтения.

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

2020-03-19 12:27:15.842128-0400 no-go[374:89822] [CoreBluetooth] API MISUSE: <CBPeripheral: 0x17d925b0, identifier = <UUID HERE>, name = SERVICE_NAME, state = disconnected> can only accept commands while in the connected state

Можно ли создать службу GAP широковещательного режима с динамическими c обновлениями на iOS и их динамическое обновление?

Или я неправильно понимаю центральные узлы и соединения, и можно ли делать сверхлегкие соединения, возникающие многократно и динамично?

Моя текущая попытка настроена:

  • 1 UUID с «жестко заданным» сервисом, который все широковещательные iOS устройства совместно используют
  • 2 «жестко закодированные» характеристики c UUID, с которым все широковещательно iOS совместно используют устройство

  • Каждое широковещательное iOS устройство создает CBMutableCharacteristic для идентификаторов c идентификаторов - каждый с только для чтения и нулевыми значениями в ожидании, что он будет обновляться динамически позже.

  • Каждое устройство создает CBPeripheralManager для трансляции услуги

  • Каждое устройство создает CBCentralManager для поиска других вещателей для указанного c UUID

Код обнаружения:

        self.centralManager.scanForPeripherals(withServices: [ self.service ], options: nil)
        print("Started Listening")

Устройства обнаруживают, когда друг друга становятся активными (запуск приложения) - с помощью метода центрального делегата:

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

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

Любые указатели приветствуются

1 Ответ

0 голосов
/ 29 марта 2020

1.) В методе делегата func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) проверьте, что central.state == .poweredOn

2.) Затем убедитесь, что периферийное устройство еще не подключено, и подключитесь к периферийному устройству:

if peripheral.state == .disconnected {
    central.connect(peripheral, options: nil)
}
...