【问题标题】:Finding distance from RSSI value of Bluetooth Low Energy enabled device查找启用蓝牙低功耗设备的 RSSI 值的距离
【发布时间】:2012-11-22 05:46:48
【问题描述】:

我正在研究低功耗蓝牙概念项目。我正在获取 RSSI 值 介于 1 和 100 之间。当我移动标签时,RSSI 值会随着外围设备远离 iPhone 而增加,而随着它靠近而减小。

谁能帮我根据 RSSI 值获得 iPhone 和蓝牙标签之间的准确距离?有没有可用的公式?

我正在借助这种蓝牙低功耗委托方法获取设备的 RSSI 值:

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

【问题讨论】:

  • 这个话题或多或少是这个话题的副本:stackoverflow.com/questions/15687332/…。结论是非常棘手。
  • 您是否使用 RSSI 获得了 BLE 设备和用户位置之间的距离?如果是,请指导我。

标签: iphone objective-c ios7 bluetooth-lowenergy


【解决方案1】:

我在另一个帖子中回答了这个问题,在这里重复。

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

如果您在 1m 距离读取 RSSI -40dB,则 2m 为 -46dB,4m 为 -52dB,8m 为 -58dB,16m 为 -64dB。

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

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

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

【讨论】:

  • 好吧。我不认为这在我的情况下是完全正确的。在我的情况下,在 1m 距离内,它的读数始终约为 -66dB。
  • 这实际上不是-66dB,而是-66dBm。基本上它是模拟放大器输出上的电压,这不仅取决于距离,还取决于所使用的天线类型、两侧的天线位置和许多其他方面。当你离开 2 倍的距离时,只需改变大约 6 分贝。
  • 不是吹毛求疵,但在这种情况下,它实际上是三边测量,而不是三角测量。您不知道所涉及的角度,这就是重点,您所知道的只是横向距离,因此它是三边测量。
  • 此算法将您置于 645 米外,RSSI 值为 -96。这个算法不正确,增长不是真正的指数
  • 有没有人解决这个问题?使用 RSSI 的 BLE 和外围设备之间的距离?有人吗?
【解决方案2】:

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

RSSI和距离的理论关系是这样的:

RSSI[dbm] = −(10n log10(d) − A) 

其中 d 是距离,A 是距离 BLE 设备 1 米处测得的 RSSI 偏移量。

只需在谷歌上搜索RSSI[dbm] = −(10n log10(d) − A),您就会找到一些关于它的资源。

【讨论】:

  • 这个等式中的“n”是什么?
  • 是一个经验值,在不同的地形、市区、山区、偏远地区是不同的。通常在2~4左右。我现在手头没有参考资料。
  • 本文中提到(进一步参考出处):'Evaluation of the Reliability of RSSI for Indoor Localization'rn.inf.tu-dresden.de/dargie/papers/icwcuca.pdf.
  • 在一个基于wifi的测试中。 ITU 室内路径损耗模型取得了出色的效果。
  • d实际上是等于(距离/1米)的无量纲量
【解决方案3】:

从 RSSI 找到距离有点棘手,它取决于很多因素,甚至是测试环境和天线方向等。 以下论文正在对此进行一些研究 http://www.s2is.org/Issues/v1/n2/papers/paper14.pdf

【讨论】:

    【解决方案4】:

    在 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)))
       }
    }
    

    更详细的回答Here

    【讨论】:

    • txPower 始终为空
    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2016-08-29
    • 2013-03-07
    • 2016-10-09
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多