如何使用CoreBluetooth在中心周围找到所有已知的BLE外设?

问题描述:

我想翻译一个我开发的Android应用程序,它可以找到中心周围的所有外围设备,并将它们返回给用户。然后用户可以连接到其中的一个(或多个)来做其他事情。如何使用CoreBluetooth在中心周围找到所有已知的BLE外设?

问题:设备与CoreBluetooth连接后,在扫描过程中不再返回。应该通过已知的设备列表重新获取,该列表不提供关于返回设备附近的任何信息。

是否有比试图连接到每个已知设备知道它是否在范围更简单的方法?

编辑:已知的装置在扫描过程中确实回来了,我的工作对不具有相同的广告名称和国家新闻出版总署名BLE装置,在设备第一次连接之后重新扫描时搞糊涂了:)

+0

如果你已经连接,但丢失,因为范围的连接,就可以得到通知。你不能使用它吗? – ladislas

您知道设备在范围内,如果您可以看到它的广告。

有广告的多种形式:

  • 可连接
  • 非连接
  • 可连接的定向(白名单设备的所述外围愿意连接到)
  • 非可连接的定向(的白名单即使无法连接到该设备,也能看到此外设正在进行广告的设备)

一些设备只会在您连接时宣传他们提供的服务的子集。原因在于您只能发送31个字节的广告数据,如果您使用蓝牙标准服务,则每个服务的字节数将为两个字节。如果您使用自定义服务,则只需要16个字节来宣传该服务!

它也可以公布其服务列表,所以你知道你可以用它来连接它做什么。

这意味着你应该解析返回的广告数据;这样做的范围是this Stack Overflow question

我在斯威夫特3

启动应用程序时使用此

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
    let perip = peripheral.identifier.uuidString 

    if !perip.isEmpty { 

     if peripheral == myPeriperal { 


      print("myPeriperal Ok") 
     } 


    }else{ 
     print("no ble") 

    } 

} 

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 


    centralManager.connect(myPeriperal, options: nil) 

} 
+0

如何在启动应用程序时帮助我知道已知设备是否在范围内? – Louis

+0

@Slowbro看看我的编辑,我用它在我的应用程序,并运行良好。 – Rob