使用核心蓝牙 ios 扫描外围设备时如何更改特征顺序

Posted

技术标签:

【中文标题】使用核心蓝牙 ios 扫描外围设备时如何更改特征顺序【英文标题】:How to change order of charateristics ID discovered while scanning peripheral using core bleutooth ios 【发布时间】:2014-10-18 06:08:10 【问题描述】:

我在 ios 中使用核心蓝牙框架并扫描并发现 2 个特征 ID,但我希望它们的顺序与我得到的不同,所以是否可以通过编程方式更改它们的顺序或任何东西?

代码

   if (service.UUID.isEqual(CBUUID.UUIDWithString("F4F2-BC76-3206341A")))
    
        println(service.characteristics.count)
        for aChar:CBCharacteristic in service.characteristics as [CBCharacteristic]

        
            println(aChar)
            println(aChar.UUID)

            /* Write data*/
            if aChar.UUID.isEqual(CBUUID.UUIDWithString("D0F0AECD-6405-0B040047"))
            
                var str:NSString = "heyaa..!!"
                data = str.dataUsingEncoding(NSUTF8StringEncoding)!
                peripheral.writeValue(data, forCharacteristic: aChar, type: CBCharacteristicWriteType.WithResponse)
                println("Write performed")
            

            /* read data  */
            if aChar.UUID.isEqual(CBUUID.UUIDWithString("C8853E-A248-C6F0B1"))
            
                peripheral.readValueForCharacteristic(aChar)
                println("Read performed")
            
        
    

在这个读取数据的特征 ID 被首先调用,但我想先调用写入数据特征 ID,所以有什么办法可以解决。请帮帮我。提前谢谢你。

【问题讨论】:

【参考方案1】:

这些特征将以任意且未定义的顺序被发现,但这不重要。

您应该存储对已发现特征的引用,以便您可以根据需要对其进行写入。

你的应用应该经历不同的阶段

    扫描并发现广告特定服务的外围设备 连接到目标外围设备 发现服务的特点 根据需要读取/写入数据 - 根据需要重复此步骤 断开连接

例如:

    var writeCharacteristic : CBCharacteristic?
    var readCharacteristic : CBCharacteristic?

    optional func peripheral(_ peripheral: CBPeripheral!, didDiscoverCharacteristicsForService service: CBService!,error error: NSError!)     

      if (service.UUID.isEqual(CBUUID.UUIDWithString("F4F2-BC76-3206341A"))) 
      

        println(service.characteristics.count)
        for aChar:CBCharacteristic in service.characteristics as [CBCharacteristic]

        
            println(aChar)
            println(aChar.UUID)

            /* Write data*/
            if aChar.UUID.isEqual(CBUUID.UUIDWithString("D0F0AECD-6405-0B040047"))
            
                self.writeCharacteristic=aChar
            
            else if aChar.UUID.isEqual(CBUUID.UUIDWithString("C8853E-A248-C6F0B1"))
            
                self.readCharacteristic=aChar

            
        
      
      if (self.writeCharacteristic != nil && self.readCharacteristic != nil) 
            var str:NSString = "heyaa..!!"
            data = str.dataUsingEncoding(NSUTF8StringEncoding)!
            peripheral.writeValue(data, forCharacteristic: self.writeCharacteristic!, type: CBCharacteristicWriteType.WithResponse)
            println("Write performed")
      
    

    optional func peripheral(_ peripheral: CBPeripheral!,didWriteValueForCharacteristic characteristic: CBCharacteristic!,error error: NSError!) 
       peripheral.readValueForCharacteristic(self.readCharacteristic!)
       println("Read performed")
    

【讨论】:

我怀疑硬件的特征 ID 是否按字母顺序扫描?比如先是“C882”,然后是“D889”。它不是以任意方式找到它有固定的顺序。 我想先发现 ID“D889”,然后再发现其他 ID“C882”,我该怎么办?请帮帮我。 您无法控制发现特征的顺序,这也不重要。您需要对代码进行结构化,以便顺序无关紧要。 如果硬件团队说它是 ID "C882" 用于读取操作,但读取操作不会给我输出,除非我执行写入操作,所以首先我必须执行写入操作才能读取值。 ID描述可能是错误的?是否有任何地方写着我们无法控制订单,因为我必须证明这一点。谢谢 顺序无关紧要。我已经更新了我的答案,以展示一种处理特征的方法。

以上是关于使用核心蓝牙 ios 扫描外围设备时如何更改特征顺序的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用蓝牙重新连接断开的外围设备而无需再次扫描 ios

如何使用核心蓝牙 sdk 扫描蓝牙设备?

如何使用 Core Bluetooth 在 iOS 中设置 BLE 外围设备的名称

如何在 iOS 应用程序中从蓝牙 LE 设备获取通知

核心蓝牙问题

低功耗蓝牙Ble的详细使用流程