在android手机上,通过“设置”-“关于手机”-“状态”-“信号强度”可以查看到手机的信号强度,显示出如“-87 dBm 13 asu”这样的数据。ASU与dBm之间的关系是:dBm=-113+(2*ASU)。
在你手机屏幕上方显示的信号条永远不会是最好的方法来确定你手机的信号,无论你用什么手机都一样。Android也是,用很粗的条来展示很强的信号,但这些条仅仅表示最高的信号。或许你并不熟悉,信号通常是以dBm度量的。dBm是每毫瓦特的电磁波产生的功率。-60dBm的信号接近完美,-112dBm就很容易掉线,如果你在 -87dBm以上,Android会显示一个4格的满信号。
android界面UI信号显示是通过RIL对通讯模块发送AT命令来实现的,如AT+CSQ,我们查看一般可以通过 logcat -b radio来获取一些RIL的实时信息,可以通过关键字“CSQ”查找radio.log,查看手机信号强度。log如:AT< +CSQ: 14,99 这里的14就是ASU值,在4.0源码中有SignalStrength.java类,其中有ASU值转换为几格信号的方法:
403
public int getGsmLevel() {
404
int level;
405
406
// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
407
// asu = 0 (-113dB or less) is very weak
408
// signal, its better to show 0 bars to the user in such cases.
409
// asu = 99 is a special case, where the signal strength is unknown.
410
int asu = getGsmSignalStrength();
411
if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
412
else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
413
else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
414
else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
415
else level = SIGNAL_STRENGTH_POOR;
416
if (DBG) log("getGsmLevel=" + level);
417
return level;
418
}
-----------------------------------------------------------------------------------------
以下是从网上找到的相关资料。
在RILConstants.java中找到:
int RIL_UNSOL_SIGNAL_STRENGTH = 1009;
在RIL.java中找到与其相关的代码:
private void
processUnsolicited (Parcel p) {
…….
case RIL_UNSOL_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;
…..
case RIL_UNSOL_SIGNAL_STRENGTH:
// Note this is set to “verbose” because it happens
// frequently
if (RILJ_LOGV) unsljLogvRet(response, ret);
if (m