“SIM卡狀態”中的dBm和狀態欄的信號格數是對應的嗎?

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來說還是依據儀器或者日誌查看靠譜。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章