RSSI(Received Signal Strength Indication)是接收的信号强度指示,用来判定链接质量,利用RSSI信号值可以计算主设备和蓝牙设备的距离信息。通过至少三个设备的RSSI值即可计算出二维平面内点的相对位置。
转自lil-Xing的个人博客
RSSI为什么是负值
RSSI的单位是dBm,表示的是蓝牙信号的强度,因为无线信号多为mW级别,所以对它进行了极化,转化为dBm而已,不表示信号是负的,1mW就是0dBm,小于1mW就是负数的dBm数。理想情况下RSSI可以达到最大值0,实际情况下当你将主设备贴着蓝牙设备也只能获取到-50dBm。
获取RSSI
在上篇蓝牙模块的基础上,直接在onReceive()方法中通过下面方法获取RSSI信号强度。注意获取到的值为负
short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);
计算主设备与蓝牙设备之间的距离
计算公式:d = 10^((abs(RSSI) - A) / (10 * n))
参数含义:
d - 所求距离
RSSI - 信号强度(负值)
A - 发射端和接收端相隔1米时的信号强度
n - 环境衰减因子
因为不同环境下的环境衰减因子不同,所以在每个环境下都要重新计算A和n,先测出发射端和接收端相隔1米时的信号强度A,再随机取个距离,计算n,需要多次计算取均值。实例如下:
public double getDistance(double Rssi) {
Rssi = (Rssi - 60) / 36.0;
double d= Math.pow(10.0, Rssi);
d = (double) Math.round(d * 100) / 100;
return d;
}