他们曾经有一些额外的措施来找出距离。正如 cmets 中的 hotpaw2 所注意到的那样
快速解答 - Swift 4.2
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let power = advertisementData[CBAdvertisementDataTxPowerLevelKey] as? Double{
print("Distance is ", pow(10, ((power - Double(truncating: RSSI))/20)))
}
}
TL:DR;
影响RSSI的因素
RSSI 读数不太稳定且高度依赖环境
它也可能因多种因素而有所不同,包括感应/发射无线电的功率和灵敏度,以及环境因素(您在室内还是室外?附近有很多人吗?嘈杂的无线环境或不是,以此类推)。
然而,问题在于信标信号实际上是无线电波,可以被金属、墙壁、水等吸收。由于它们在常用的 2.4GHz 频段传输无线电信号,因此从信标接收到的信号强度会有所不同广泛因为干扰。
最常用的计算距离的公式之一是
d = 10 ^ ((TxPower - RSSI) / 20)
TxPower 通常称为发射功率
如何从 BLE 广告数据中获取 TxPower
txPower 值将在 BLE 广告数据中可用(仅当广播公司(外围设备)提供其 Tx 功率级别时才可用)。
根据苹果文档,CBAdvertisementDataTx 中 CBAdvertisementDataTxPowerLevelKey 的值
访问原始广告数据的委托方法
optional func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber)
也可以使用BlueCap API访问
了解 AirPlay 比传统蓝牙的更多优势
https://www.cambridgeaudio.com/blog/airplay
RSSI 和距离
根据下图来自Link
如果您覆盖信标(例如,有人挡在您和信标之间),RSSI 会下降。也就是说,您仍然在相同的距离内,但 RSSI 下降了——因此,如果您根据 RSSI 估算距离,那么距离会上升,而您不会移动一英寸。
以上许多解释取自其他网站。
我希望它可以满足您的需求!