【问题标题】:How to get distance from beacons如何与信标保持距离
【发布时间】:2020-12-03 10:32:43
【问题描述】:

我正在使用 Moko H2 beacon 并使用此library 获取信标列表我正在成功获取信标列表

我在扫描后收到这种类型的响应

[
  {
    "mac": "F2:EE:97:63:1B:B6",
    "validDataHashMap": {
      "20": {
        "data": "20000bc117c0006673d201552aa1",
        "type": 2
      }
    },
    "rssi": -53
  },
  {
    "name": "BeaconX",
    "mac": "C4:7D:65:69:95:B7",
    "validDataHashMap": {
      "0afcc47d656995b7220164426561636f6e58": {
        "data": "0afcc47d656995b7220164426561636f6e58",
        "type": 4
      }
    },
    "rssi": -58
  },
  {
    "name": "BeaconX",
    "mac": "D0:24:EA:4E:1F:B3",
    "validDataHashMap": {
      "0afcd024ea4e1fb3220164426561636f6e58": {
        "data": "0afcd024ea4e1fb3220164426561636f6e58",
        "type": 4
      },
      "20": {
        "data": "20000bd91980005b4af60130014a",
        "type": 2
      }
    },
    "rssi": -59
  },
  {
    "mac": "D3:B9:AF:E1:D7:D3",
    "validDataHashMap": {
      "1000016d6f6b6f736d61727400": {
        "data": "1000016d6f6b6f736d61727400",
        "type": 1
      }
    },
    "rssi": -61
  },
  {
    "name": "BeaconX",
    "mac": "CB:4C:90:6C:E7:43",
    "validDataHashMap": {
      "1000016d6f6b6f736d61727400": {
        "data": "1000016d6f6b6f736d61727400",
        "type": 1
      },
      "0afccb4c906ce743220163426561636f6e58": {
        "data": "0afccb4c906ce743220163426561636f6e58",
        "type": 4
      }
    },
    "rssi": -61
  },
  {
    "mac": "CF:EB:82:02:6A:78",
    "validDataHashMap": {
      "20": {
        "data": "20000ba51b40006675dd0155316e",
        "type": 2
      }
    },
    "rssi": -61
  }
]

我的要求是如何从远处获得距离

我有一个rssi 值和 txPower 计算 int txPower = Integer.parseInt(data.substring(2, 4), 16);

那么我如何使用这两个值 rssitxPower 计算距离

我试过了,但得到了错误的结果

适配器

holder.itemView.tvDistance.text = "${model.rssi.toInt().getDistance(model.measure_power.toInt()).convertMeterToFt().toRoundString()} ft" 

扩展功能

fun Int.getDistance(txPower: Int): Double {
    return Math.pow(10.0, ((Math.abs(this) - Math.abs(txPower)) / (10 * 2)).toDouble())
}

fun Double.convertMeterToFt(): Double {
    return (3.281 * this) // to ft
}

fun Double.toRoundString(): String {
    return DecimalFormat("#0.##").format(this)
}

rssi@1m 为 -59

计算距离

fun calcDistbyRSSI(rssi: Int, measurePower: Int = -59): String? {
        val iRssi = Math.abs(rssi)
        val iMeasurePower = Math.abs(measurePower)
        val power:Double = (iRssi - iMeasurePower)/(10*2.0)
        // ft = m * 3.2808

        if (Math.pow(10.0,power) * 3.2808 < 1.0){
            return String.format("%.2f ft(Immediate)", Math.pow(10.0,power) * 3.2808)
        }else if (Math.pow(10.0,power) * 3.2808 > 1.0 && Math.pow(10.0,power) * 3.2808 < 10.0){
            return String.format("%.2f ft(Near)", Math.pow(10.0,power) * 3.2808)
        }else{
            return String.format("%.2f ft(Far)", Math.pow(10.0,power) * 3.2808)
        }
    }

请帮助我,我们将不胜感激。

【问题讨论】:

    标签: android distance beacon rssi ble-txpower


    【解决方案1】:

    如果您有信标的 RSSI 值,则不需要使用 txPower。您可以使用以下公式从 RSSI 值计算距离信息:

    距离 = 10^((测量功率 - 即时 RSSI)/10*N)。

    N 是环境因素的常数。它取 2-4 之间的值。测得的功率是一米处的RSSI值。

    因此,当您获得新的信标信息时。您可以计算当前距离。假设您的 RSSI 信息为 -61,您的 N 因子为 2.4。您在一米处测得 RSSI 值为 -44。

    当您获得 -61 RSSI 时。它对应于 10^((-44-(-61))/10*2.4) = rssi 发送器和接收器之间的 5.10 米距离。

    【讨论】:

    • 我不明白如何计算测量功率和 N 请输入方程式
    • 您不会计算测量功率。您应该手动观察它。将信标与接收器保持 1 米的距离,并观察信标的 rssi 值。你也不需要计算N因子。这是信号衰减的一个因素。它在不同的环境中发生变化,您可以尝试不同的值,直到找到给出最准确距离的值。因为这是关于环境中的空气。你可以从here阅读公式3的解释
    • 所以测得的功率是距离 1 米远的 rssi?
    • 我在 1 米内收到 rssi,例如 -65、-66、-70、-72、-73、-74 这些是多个信标
    • 如果距离不正确,您应该检查您的参数。另请注意:您无法使用 RSSI 获得确切的距离。通常,距离值具有容错性。 RSSI 值很容易受到任何事物的影响。所以距离信息可能会产生误导。我建议你应该搜索类似的作品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多