如何从信标获取距离

3
我正在使用Moko H2信标,并使用获取信标列表,我成功地获取到了信标列表。
扫描后,我得到了这样的响应。
[
  {
    "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" 

Extension function

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 rssi@1m

计算距离

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

请帮助我。非常感激任何帮助。

1个回答

10
如果你有信标的RSSI值,就不需要使用txPower。你可以使用以下公式从RSSI值计算距离信息:
Distance = 10^((Measured Power - Instant RSSI)/(10*N)).

N是环境因素的常量。它取值在2到4之间。测量功率是一米处的RSSI值。

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

当您获得-61的RSSI时,对应于rssi发送者和接收者之间的5.10米距离,计算公式为10^((-44-(-61))/(10*2.4))。


1
我不明白如何计算测量功率和N,请提供方程式。 - Chirag Patel
2
你不需要计算测量功率。你应该手动观察它。将信标放在接收器1米远的地方,并观察信标的RSSI值。此外,你不需要计算N因子。这是一个衰减信号的因素。它在不同的环境下发生变化,你可以尝试不同的值,直到找到最精确的距离值。因为这是关于环境中的空气。你可以在这里阅读方程式3的解释 - bsgal
是的,没错。如果您阅读我引用的文章,您可以看到“其中距离d0是单位距离(即1米),A代表单位距离的RSSI”这一行。而^是指数符号。对于10^x,您可以使用Math.pow(10, x)。最后,您可以使用不同RSSI的算术平均值来计算1米的RSSI。 如果我的回答有帮助,请点赞以便其他人也能看到它。 - bsgal
1
如果距离不正确,您应该检查参数。还要注意:您无法使用RSSI获得精确的距离。通常,距离值具有误差容限。RSSI值很容易受到任何影响。因此,距离信息可能会误导。我建议您应该搜索类似的作品。 - bsgal
1
让我们记住,测量功率指的是在1米处的RSSI值。如果您的测量功率低于即时RSSI值,则意味着信标和信号接收器之间的距离小于1米。方程式“测量功率-RSSI”的含义是:假设您的测量功率为-44,而您的RSSI为-30,在这种情况下,距离将是:10^((-44+30)/10*2.4) = 0.26 米,小于1米。简而言之:如果测量功率低于RSSI,计算出的距离将小于1米。 - bsgal
显示剩余15条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接