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

时间:2016-12-16 13:16:11

标签: swift bluetooth-lowenergy core-bluetooth

我正在尝试翻译我开发的Android应用,该应用找到中心周围的所有外围设备并将其返回给用户。然后,用户可以连接到其中一个(或多个)以执行其他操作。

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

是否有一种比尝试连接到每个已知设备更简单的方法来了解它是否在范围内?

编辑:扫描期间确实返回了已知设备,我正在处理没有相同广告名称和GAPP名称的BLE设备,这在第一次连接到a后重新扫描时让我很困惑设备:)

3 个答案:

答案 0 :(得分:0)

如果你能看到它正在广告,你就知道设备在范围内。

有多种形式的广告:

  • 可连接
  • 非连接
  • 可连接定向(外围设备愿意连接的设备的白名单)
  • 非可连接定向(可以看到此外围设备何时广告的设备白名单,即使它们无法连接到它)

有些设备只会在您连接后宣传他们提供的服务的子集。原因是您可以发送只有31个字节的广告数据,如果您使用蓝牙标准服务,则每个服务的字节数为2个字节。如果您使用自定义服务,那么只需要16个字节来宣传该服务!

它还可以宣传其服务列表,因此您知道可以使用哪些服务来连接它。

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

答案 1 :(得分:0)

我在Swift 3中使用它

启动应用时

controllersConfigService

之后

 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")

    }

}

答案 2 :(得分:0)

您可以使用RSSI(接收信号强度指示器)找到外围设备的近距离范围

使用更新的芯片组,RSSI值范围从0到100(dbm)。在较旧的芯片集中,RSSI的范围从0到256(dbm)

这是确定RSSI的代码,以查找

var RSSIs = [NSNumber]() //在viewcontroller中定义属性,以将外围设备RSSI值存储在数组附近

 func centralManager(_ central: CBCentralManager, didDiscover peripheral: 
CBPeripheral,advertisementData: [String : Any], rssi RSSI: NSNumber) {

    self.RSSIs.append(RSSI)
    }

如果RSSI值在50到60之间,则表明Peripheral处于通信的良好范围。如果RSSI值在80左右或更高,则您的通讯范围较差。