首页 > 解决方案 > 在 iOS 中监听多个连接的 BLE 设备的特征值变化

问题描述

我有一个在 BLE v4.1 上运行的定制 BLE 设备,我正在使用 swift 5 制作一个 iOS 应用程序,该应用程序能够连接到 iOS 手机范围内的所有 BLE 设备。

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

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-lowenergycore-bluetoothswift5

解决方案


“获取广告数据”可以有几种解释。广告数据是 BLE 广告过程中的一种信息,您会在 CentralManager 扫描过程中收到这些信息,并且不会显示在上面显示的函数中。我假设在这里一般使用广告数据来表示在您的应用程序连接到外围设备后可以读取或收听的特征数据。

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

我们需要查看用于处理服务和特征发现以及注册通知或生成读取请求的代码,以确定发生了什么。我怀疑那里有问题。读取请求很可能仅针对单个特征进行。除了坚持外围,我相信你必须坚持每个设备的CBCharacteristic。例如,如果您为所有外围设备存储单个 CBCharacteristic,则可能会导致此问题。

更多细节会有所帮助,但问题可能在于如何完成读取,以及 CBPeripheral 和 CBCharacteristic 引用的管理。


推荐阅读