“SIM卡状态”中的dBm和状态栏的信号格数是对应的吗?

来源:互联网 发布:粒子群算法的具体应用 编辑:程序博客网 时间:2024/04/28 04:26

Android手机设置中最后一项一般都是“关于手机”,在这个项目中可以找到查看sim卡状态的子页面。


其中可以查看信号强度,测试人员可以依据dBm和状态栏的信号格数大致确认两者之间的关系。

这个大部分情况下是ok的,不过对于Cdma网络来说这个就有可能出问题了。截图中的状态栏信号格数是双行的,这个是Cdma的特点,1X信号和EVDO信号同时注册的,1x用来语音通话,EVDO就和其名称一样(Evolution Data Only)是用于数据业务的。但是状态栏可以不显示双行啊,苹果的电信版本手机就只会显示一行。在Cdma网络中,这个设置中显示的Dbm和状态栏就不一定是对应的关系了。

截图中Activity的代码在设置中,packages/apps/Settings/src/com/android/settings/RadioInfo.java

    private final void updateSignalStrength() {        ...        int signalDbm = mPhoneStateReceiver.getSignalStrengthDbm();        ...    }

其中的mPhoneStateReceiver就是frameworks/opt/telephony/src/java/com/android/internal/telephony/PhoneStateIntentReceiver.java

    public int getSignalStrengthDbm() {        if ((mWants & NOTIF_SIGNAL) == 0) {            throw new RuntimeException                ("client must call notifySignalStrength(int)");        }        return mSignalStrength.getDbm();    }
frameworks/base/telephony/java/android/telephony/SignalStrength.java

    public int getDbm() {        int dBm;        if(isGsm()) {            dBm = getLteDbm();            if (dBm == INVALID) {                dBm = getGsmDbm();            }        } else {            int cdmaDbm = getCdmaDbm();            int evdoDbm = getEvdoDbm();            return (evdoDbm == -120) ? cdmaDbm : ((cdmaDbm == -120) ? evdoDbm                    : (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm));        }        if (DBG) {            log("getDbm=" + dBm);        }        return dBm;    }
从代码中看出cdma网络下是选择1x信号和evdo信号中的最小值作为输出。

状态栏中的格数代码同样在SignalStrength.java中

    public int getLevel() {                 int level;        if (isGsm) {            level = getLteLevel();            if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {                level = getGsmLevel();            }        } else {            int cdmaLevel = getCdmaLevel();            int evdoLevel = getEvdoLevel();            if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {                /* We don't know evdo, use cdma */                level = cdmaLevel;            } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {                /* We don't know cdma, use evdo */                level = evdoLevel;            } else {                /* We know both, use the lowest level */                level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;            }            //log("lq_signal getLevel() cdmaLevel = " + cdmaLevel + "; evdoLevel = " + evdoLevel + "; level = " + level);        }        if (DBG) {            log("getLevel=" + level);        }        return level;    }

信号格数同样是选取evdo和1x信号格数的最小值做为输出。1x信号在大于-90dBm就是满格了(cdma的特点,依据编码的正交来区别用户,对载波要求很低,相邻基站可以是同频率的载波),而evdo在大于-65dbm才能满格。

这样设置中显示的dBm就可能是1x,也可能是evdo;状态栏信号格数也是同样的状况。两者不一致的情况发生可能性很大。

对于cdma来说还是依据仪器或者日志查看靠谱。




原创粉丝点击