我正在尝试使用getRssi()
private void checkWifi(){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo Info = cm.getActiveNetworkInfo();
if (Info == null || !Info.isConnectedOrConnecting()) {
Log.i("WIFI CONNECTION", "No connection");
} else {
int netType = Info.getType();
int netSubtype = Info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI) {
wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int linkSpeed = wifiManager.getConnectionInfo().getLinkSpeed();
int rssi = wifiManager.getConnectionInfo().getRssi();
Log.i("WIFI CONNECTION", "Wifi connection speed: "+linkSpeed + " rssi: "+rssi);
//Need to get wifi strength
}
}
}
事情是我得到像-35或-47等数字...而我不明白他们的价值观..我已经看过android文档及其所有声明:
public int getRssi()
因为:API Level 1返回接收信号强度指示符 当前的802.11网络。
这不是规范化的,但应该是!
返回RSSI,范围是???到???
有人可以解释如何“正常化”或理解这些结果吗?
答案 0 :(得分:11)
我在WifiManager.java中找到了这个:
/** Anything worse than or equal to this will show 0 bars. */
private static final int MIN_RSSI = -100;
/** Anything better than or equal to this will show the max bars. */
private static final int MAX_RSSI = -55;
android上的相关rssi范围是-100和-55 。
有一种静态方法WifiManager.calculateSignalLevel(rssi,numLevel)可以为你计算信号水平:
int wifiLevel = WifiManager.calculateSignalLevel(rssi,5);
返回0到4之间的数字(即numLevel-1):您在工具栏中看到的条数。
答案 1 :(得分:7)
根据IEEE 802.11文档:较小的负值表示较高的信号强度。
范围在-100到0 dBm之间,接近0是强度更高,反之亦然。
答案 2 :(得分:0)
来自维基百科:
供应商提供自己的准确性,粒度和范围 实际功率(以mW或dBm测量)及其RSSI值范围 (从0到RSSI_Max)。
例如,Cisco Systems卡的RSSI_Max值为100和 将报告101个不同的功率电平,其中RSSI值为0到 100.另一种流行的Wi-Fi芯片组由Atheros制造。基于Atheros的卡将返回带有128的RSSI值0到127(0x7f) (0x80)表示无效值。
所以这很大程度上取决于设备。
答案 3 :(得分:0)
从ben75的答案开始,我们可以使用这种方法来规范化rssi:
public static int normalizeRssi(int rssi){
// Anything worse than or equal to this will show 0 bars
final int MIN_RSSI = -100;
// Anything better than or equal to this will show the max bars.
final int MAX_RSSI = -55;
int range = MAX_RSSI - MIN_RSSI;
return 100 - ((MAX_RSSI - rssi) * 100 / range);
}