Iphone 查找与蓝牙低能耗设备的RSSI值之间的距离

Iphone 查找与蓝牙低能耗设备的RSSI值之间的距离,iphone,objective-c,ios7,bluetooth-lowenergy,Iphone,Objective C,Ios7,Bluetooth Lowenergy,我正在从事蓝牙低能耗概念项目。我得到的是RSSI值 在1到100之间。当我移动标签时,RSSI值随着外围设备远离iPhone而增加,随着外围设备靠近iPhone而减少 有人能帮我根据RSSI值计算出iPhone和蓝牙标签之间的准确距离吗?有可用的配方吗 借助此蓝牙低能量委托方法,我获得设备的RSSI值: - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)p

我正在从事蓝牙低能耗概念项目。我得到的是RSSI值 在1到100之间。当我移动标签时,RSSI值随着外围设备远离iPhone而增加,随着外围设备靠近iPhone而减少

有人能帮我根据RSSI值计算出iPhone和蓝牙标签之间的准确距离吗?有可用的配方吗

借助此蓝牙低能量委托方法,我获得设备的RSSI值:

 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral   
   *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

我用另一条线索回答了这个问题,在这里重复

在视线范围内(没有引起RSSI变化的障碍物),-6dB似乎是距离的两倍

如果在1m距离处读取RSSI-40dB,则2m给出-46dB,4m给出-52dB,8m给出-58dB,16m给出-64dB

你不能得到一个精确的位置,只有一个圆形的最大距离

使用2-3台或更多设备进行三角测量,可以获得更精确的定位结果。 您完全可以从广告包中获取此信息,但您必须禁用扫描->启用扫描,或告诉iOS CoreBlutooth报告所有adv软件包


在前台模式下,你可以这样做,但在后台模式下,你不能得到所有的adv软件包。您必须连接并读取RSSI才能在后台执行此操作。

查找与RSSI的距离有点棘手,这取决于许多因素,甚至测试环境和天线方向等。 下面的文章将对此进行一些研究

有很多基于RSSI的定位技术,如三角测量和指纹识别。没有一个是完美的。RSSI受障碍物、多径衰落、天线极化和跨体屏蔽等多种因素的影响

RSSI和距离之间的理论关系如下:

RSSI[dbm] = −(10n log10(d) − A) 
其中,d是距离,A是距离BLE装置1米处测量的RSSI点的偏移量

只需谷歌搜索
RSSI[dbm]=−(10n对数10(d)− A) 
您将在swift 4.2中找到一些关于它的资料。


更详细的回答

好。我认为我的情况不太正确。在我的例子中,在1米距离内,它的读数总是-66dB。这实际上不是-66dB,而是-66dBm。基本上,它是模拟放大器输出上的电压,这不取决于距离,还取决于使用的天线类型、两侧的天线位置和许多其他方面。当你走2倍远的时候,变化大约是6分贝。不是吹毛求疵,但在这种情况下,它实际上是三边测量,而不是三角测量。你不知道所涉及的角度,这就是整点,你所知道的只是横向距离,因此这就是三边测量。这个算法把你放在645米之外,RSSI值为-96。这个算法是不正确的,而且增长不是真正的指数增长。有人能得到这个问题的解决方案吗?使用RSSI的BLE和外围设备之间的距离?有人吗?此线程或多或少是此线程的副本:。结论是这很棘手。你有没有用RSSI得到BLE设备和用户位置之间的距离?如果是,那么请指导我。这个等式中的‘n’是什么?它是一个经验值,在不同的地形、城市地区、山区和偏远地区是不同的。一般在2~4左右。我手头没有参考资料。本文中提到(进一步参考资料来源):“室内定位RSSI的可靠性评估”。在一次基于wifi的测试中。ITU室内路径损耗模型提供了极好的结果。d实际上是等于(距离/1米)txPower的无量纲量始终为零
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)))
   }
}