如何使用 CoreBluetooth 找到中心周围所有已知的 BLE 外围设备?
How to find all the known BLE peripherals around the central using CoreBluetooth?
我正在尝试翻译我开发的一个 Android 应用程序,该应用程序可以找到中央周围的所有外围设备并将它们 returns 提供给用户。然后用户可以连接到其中一个(或多个)来做其他事情。
问题:设备与 CoreBluetooth 连接后,扫描期间不再返回。它应该通过已知设备列表重新获取,该列表不提供任何有关返回设备附近的信息。
有没有比尝试连接到每个已知设备以了解它是否在范围内更简单的方法?
编辑: 已知设备确实在扫描期间返回,我正在使用没有相同广告名称和 GAPP 名称的 BLE 设备,这让我在重新扫描后感到困惑第一次连接到设备:)
如果您能看到某个设备在做广告,就知道它在范围内。
有多种广告形式:
- 可连接
- 不可连接
- 可连接定向(外围设备愿意连接的设备白名单)
- 不可连接定向(可以看到此外围设备何时进行广告的设备的白名单,即使它们无法连接到它)
某些设备在您连接后仅宣传它们提供的一部分服务。这样做的原因是您只能发送 31 个字节的广告数据,如果您使用蓝牙标准服务,则每个服务将是两个字节。如果您使用自定义服务,则只需 16 个字节来宣传该服务!
它还可以通告它的服务列表,因此您知道连接到它可以用来做什么。
也就是说你要解析返回的广告数据;这样做是在 this Stack Overflow question.
的范围内
我用这个 Swift 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)
}
您可以使用 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 之间,则外围设备处于良好的通信范围内。如果 RSSI 值大约为 80 或更高,则表示通信范围较差。
我正在尝试翻译我开发的一个 Android 应用程序,该应用程序可以找到中央周围的所有外围设备并将它们 returns 提供给用户。然后用户可以连接到其中一个(或多个)来做其他事情。
问题:设备与 CoreBluetooth 连接后,扫描期间不再返回。它应该通过已知设备列表重新获取,该列表不提供任何有关返回设备附近的信息。
有没有比尝试连接到每个已知设备以了解它是否在范围内更简单的方法?
编辑: 已知设备确实在扫描期间返回,我正在使用没有相同广告名称和 GAPP 名称的 BLE 设备,这让我在重新扫描后感到困惑第一次连接到设备:)
如果您能看到某个设备在做广告,就知道它在范围内。
有多种广告形式:
- 可连接
- 不可连接
- 可连接定向(外围设备愿意连接的设备白名单)
- 不可连接定向(可以看到此外围设备何时进行广告的设备的白名单,即使它们无法连接到它)
某些设备在您连接后仅宣传它们提供的一部分服务。这样做的原因是您只能发送 31 个字节的广告数据,如果您使用蓝牙标准服务,则每个服务将是两个字节。如果您使用自定义服务,则只需 16 个字节来宣传该服务!
它还可以通告它的服务列表,因此您知道连接到它可以用来做什么。
也就是说你要解析返回的广告数据;这样做是在 this Stack Overflow question.
的范围内我用这个 Swift 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)
}
您可以使用 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 之间,则外围设备处于良好的通信范围内。如果 RSSI 值大约为 80 或更高,则表示通信范围较差。