日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 信号格客制化问题处理

發布時間:2024/1/1 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 信号格客制化问题处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[Android?Q]

信號強度客制化代碼位置:

NR(5G)CellSignalStrengthNr.java updateLevel()
LTEMtkSignalStrength.java?updateMtkLteLevel()
WCDMA/UMTSCellSignalStrengthWcdma.java updateLevel()
TDSCDMACellSignalStrengthTdscdma.java updateLevel()
GSMCellSignalStrengthGsm.java updateLevel()
CDMACellSignalStrengthCdma.java updateLevel()

?

[信號上報過程簡介]

modem底層信號數據 → modem L4中轉化為Asu并上報信號強度dbm值 → 在AP端將Asu或dbm值映射成信號格數從底層物理信號參數,到上層信號格顯示的流程大致是:

Asu與信號強度的對應關系由modem L4決定,此部分的代碼建議不要做任何的修改。

?

[信號強度AT命令格式說明]

Modem上報信號強度的格式:

3G modem:

+ECSQ: <asu>, <ber>, <rssi> (2G網絡)

+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no> (3G網絡)

4G modem:

+ECSQ: <asu>, <ber>, <rssi>, <rscp>,1,1,1,<act> (2G網絡)

+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>,1,1, <act> (3G網絡)

+ECSQ: <rsrq>, <rsrp>,1,1,1,<rsrq_qdbm >,<rsrp_qdbm> <act> (4G網絡)

?

L版本、以及以后版本

NetworkControllerImpl.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\policy)的updateTelephonySignalStrength()函數會根據獲取到的信號強度來設置狀態欄信號格的圖標。里面會執行mLastSignalLevel = iconLevel = mSignalStrength[slotId].getLevel(); 語句。

這個 getLevel() 函數定義在SignalStrength.java (frameworks\base\telephony\java\android\telephony)中,用于劃分信號格區間。在這個函數里面:
(1)LTE會執行 getLteLevel() 函數; getLteLevel()函數會執行 rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);語句,并返回 rsrpIconLevel 的值,作為信號格圖標的level,即1格、2格之類。
(2)2G、3G會執行getGsmLevel()函數; getGsmLevel()函數會執行 level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm); 語句,并返回 level 的值,作為信號格圖標的level。

上面的 ssExt 對象涉及到當前項目配置的是OM版本、OP01版本等。 不同版本的實現有所不同。
請根據實際項目配置的版本,查看對應的代碼文件。

CMCC版本的代碼文件是:/vendor/mediatek/proprietary/operator/OP01/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP01.java
CU版本的代碼文件是:/vendor/mediatek/proprietary/operator/OP02/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP02.java
Open market版本的代碼文件是: /vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java

?

JB/JB2/JB3/JB5/KK1MP1

1?信號的物理參數會通過AT+ECSQ上報給AP端,格式為:

AT< +ECSQ: <asu>, <ber>, <rssi>????(2G網絡)

AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>?????3G網絡)

其中<rssi>, <rscp>, <ec/no>這幾個物理參數上報時單位為qdbm,換算為dbm的公式為:dbm=qdbm/4

?

2SignalStrength.java中使用IServiceStateExt作為不同運營商客制化的接口。

???對于普通版本:IServiceStateExt的實現為ServiceStateExt.java

???對于中國移動(OP01)版本:IServiceStateExt的實現為ServiceStateExtOP01.java

步驟1:請修改ServiceStateExtXXX.java中的mapGsmSignalDbm(int GsmRscpQdbm,int asu)接口為以下形式,以方便我們接下來的客制化

????public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){

????????int dBm;

?//mtk add (這部分在KK版本中已經包含)

????????if(mGsmRscpQdbm?< 0 &&?mGsmRscpQdbm?! = -1)

????????????dBm = GsmRscpQdbm / 4; // Return raw value for 3G network.

????????else

//mtk add end

????????????dBm = -113 + (2 * asu);? ?

????????return dBm;

????}

?

???KK1MP3--4G(mtk 對4G部分只使用到了Rsrp的部分來計算信號強度)

?

mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength){

??? ......

??? if(mLteRsrp > -44) rsrpIconLevel = -1;

??? else if(mLteRsrp >= -85) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GREAT;

??? else if(mLteRsrp >= -95) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GOOD;

??? else if(mLteRsrp >= -105) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_MODERATE;

??? else if(mLteRsrp >= -115) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_POOR;

??? else if(mLteRsrp >= -140) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

?

????步驟2:SignalStrength.java中修改getGsmLevel()

????public int getGsmLevel() {

????????int level;

?

????????// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5

????????// asu = 0 (-113dB or less) is very weak

????????// signal, its better to show 0 bars to the user in such cases.

????????// asu = 99 is a special case, where the signal strength is unknown.

????????int asu = getGsmSignalStrength();

????????int dBm = getGsmDbm();???//mtk add

????????boolean is3G = (mGsmRscpQdbm?< 0 &&?mGsmRscpQdbm?! = -1) ??true : false;????//mtk add (這部分在KK版本中已經包含)

?

????????try{
//mtk add (這部分在KK版本中已經包含)

????????????//level = mServiceStateExt.mapGsmSignalLevel(asu);

????????????level = mServiceStateExt.mapGsmSignalLevel(is3G, dBm, asu);

//mtk add end

????????} catch (Exception e){

????????????if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

????????????else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;

????????????else if (asu >= 8)??level = SIGNAL_STRENGTH_GOOD;

????????????else if (asu >= 5)??level = SIGNAL_STRENGTH_MODERATE;

????????????else level = SIGNAL_STRENGTH_POOR;

????????}

????????if (DBG) log("getGsmLevel=" + level);

????????return level;

????}

?

步驟3:ServiceStateExtXXX.java中添加mapGsmSignalLevel (boolean is3G, int?dBm,int asu),做信號格mapping

a.區分3G網絡與2G網絡

可以通過判斷函數參數is3G是否是3G網絡,若是3G網絡的話為true,反之則是2G網絡。

b.使用asuicon level來匹配

利用傳入的asu參數,根據自己信號格標準修改代碼

c.使用dbmicon level來匹配

利用傳入的dBm參數,根據自己信號格標準修改代碼

????Example:使用asu作為參數計算WCDMA/GSM信號

?

總結

以上是生活随笔為你收集整理的Android 信号格客制化问题处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。