聆听iOS中多个已连接BLE设备的特征值更改

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

我有一个在BLE v4.1上运行的定制BLE设备,并且我使用swift 5制作了一个iOS应用,该应用可以连接到iOS手机范围内的所有BLE设备。

我能够连接并显示所有设备(具有特定名称),并在表格中显示它们。另一方面,我具有使用BTService中的didUpdateValueFor委托方法连接到第一个发现的BLE设备,发现服务,发现特征,读取特征值的完整实现。

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {

    NSLog("didUpdateValue function called from BTService")

      if error != nil {
         print("ERROR ON UPDATING VALUE FOR CHARACTERISTIC: \(characteristic) - \(String(describing: error?.localizedDescription))")
         return
      }
    print("updating value of peripheral \(String(describing: peripheral))")
    print("Value of characteristic updated and didUpdateValueFor called. Value of characteristic is: \(characteristic.value!)")

      DispatchQueue.main.async(execute: { () -> Void in
         self.didReceiveData(characteristic.uuid, characteristic.value!)

                if characteristic == OTAUpgradeCharacteristic {
                    NSLog("Value updated for bootloader characteristic")

                    bootloaderModel.peripheralValueUpdate(peripheral, characteristic: characteristic, error: error)

                }
      })
   }

我想同时读取在相同种类的多个BLE设备中通告的特性的值。我要连接的所有BLE设备具有相同的广告名称和相同的特征,但标识符不同。每个设备可能发送不同的特性值。每次尝试同时从多个连接的BLE设备读取建议数据时,我的代码仅从最后一个连接的设备读取数据。

是否可以使用任何种类的库或代码从所有设备同时获取广告数据,或者为每个连接的外围设备调用didUpdateValueFor

bluetooth-lowenergy core-bluetooth swift5
1个回答
0
投票

“获取广告数据”可以用几种方式解释。广告数据是BLE广告过程的一部分,是您在CentralManager扫描过程中收到的信息,不会在上面显示的功能中显示。我假设广告数据在这里被通用地使用,是指在您的应用程序连接到外围设备之后可以读取或收听的特征数据。

简而言之,每次您的代码通过CentralManager connect(_:options :)连接到设备时,iOS都会为该特定外围设备创建连接。因此,您的代码需要持有对外围设备的引用,并且必须为每个外围设备分配一个委托,为每个外围设备进行服务/特性发现,等等。代码可能使用单个类作为每个对象的委托进行操作。连接的外围设备。上面的代码段暗示了这一点,但是并不确定。

我们将需要查看用于处理服务和特征发现以及注册通知或生成读取请求的代码,以确保正在发生的事情。我怀疑那里有问题。读取请求很可能仅基于单个特征发出。除了坚持外设,我相信您还必须坚持每个设备的CBCharacteristic。例如,如果您要存储所有外围设备的单个CBCharacteristic,可能会导致此问题。

多一点细节会有所帮助,但问题可能出在读取的方式以及CBP外设和CB特性引用的管理上。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.