CoreBluetooth GAP服务-如何动态广播和更新服务特征?

问题描述 投票:0回答:1

我是蓝牙和CoreBluetooth的新手,正在尝试创建一个测试应用程序:

  • 将iOS设备用作GAP服务广播器
  • 使用相同的iOS设备发现其他广播相同服务的iOS设备
  • 广播服务的任何应用程序都可以动态更新服务特征,而其他数量的设备可以动态查看更新后的特征。

动态性质不必是立即/实时的,但接近实时会很好。互动将是一个奖励。

本质上,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

是否可以在iOS上创建具有动态更新的广播模式GAP服务,并对其进行动态更新?

或者我是否误解了Centrals和连接,是否可以反复地动态地进行超轻量级的连接?

我当前的尝试设置:

  • 所有广播的iOS设备共享的1个“硬编码”服务UUID
  • 2个广播的iOS设备共享的2个“硬编码”特征UUID

  • 每个广播iOS设备都会为特征ID创建一个CBMutableCharacteristic-每个ID都具有只读和nil值,期望稍后会[[动态更新。

  • 每个设备创建一个CBPeripheralManager来广播服务
  • 每个设备创建一个CBCentralManager以发现特定服务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) {

    但是,我发现的外围设备无法自省,上面出现未连接错误。

    欢迎任何指针

  • ios bluetooth bluetooth-lowenergy core-bluetooth
    1个回答
    0
    投票
    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) }

    © www.soinside.com 2019 - 2024. All rights reserved.