我正在使用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);
那么我如何使用这两个值rssi
和txPower
来计算距离呢?
我尝试了这个,但得到了错误的结果。
适配器
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)
}
计算距离
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)
}
}
请帮助我。非常感激任何帮助。