Android手機信號強度檢測詳細介紹
作者:skxy 字體:[增加 減小] 類型:轉載 時間:2016-11-17 我要評論
這篇文章主要介紹了Android手機信號強度檢測的相關資料,android定義了2種信號單位:dBm和asu。具體兩種的關系本文給大家介紹非常詳細,需要的朋友可以參考下
最近到處在跑著找工作,難免在面試過程中遇到這樣那樣的問題,記得最清楚一次在面試過程中被問到,當手機處於弱網狀態下,如何處理,如何監聽網路信號強度變化。但是真是蒙了,回答的亂七八糟,思路一點都不明確。今天小編在這里帶領大家了解下關於手機信號強度的相關幾個概念。
Android手機信號強度介紹
android定義了2種信號單位:dBm和asu。它們之間的關系是:dBm =-113+2asu,這是google給android手機定義的特有信號單位。例如,我的信號強度為-53dBm,則對應30asu,因為-53 = -113 + (230) 。
詳細介紹兩者:
asu:alone signal unit 獨立信號單元,是一種模擬信號。ASU僅僅代表手機將它的位置傳遞給附近的信號塔的速率。它和dBm測量的是一樣的東西,但是是以一種更加線性的方式來表示。
dBm:是一個表示功率絕對值的值(也可以認為是以1mW功率為基準的一個比值),計算公式為:10log(功率值/1mw)。
[例] 如果功率P為1mw,折算為dBm後為0dBm。
[例] 對於0.01mW的功率,按dBm單位進行折算後的值應為: 10log(0.01/1)=-20dBm。
這個數值越大,表明信號越好。由於手機信號強度一般較小,折算成為dBm一般都是負數。
中國移動的規范規定,手機接收電平>=(城市取-90dBm;鄉村取-94dBm) 時,則滿足覆蓋要求,
也就是說此處無線信號強度滿足覆蓋要求.-67dBm要比-90dBm信號要強20多個dB,
那麼它在打電話接通成功率和通話過程中的話音質量都會好的多。再引入一個相關概念dB。
dB:是一個表徵相對值的值,純粹的比值,只表示兩個量的相對大小關系,沒有單位,當考慮甲的功率相比於乙功率大或小多少個dB時,按下面的計算公式:10log(甲功率/乙功率),如果採用兩者的電壓 比計算,要用20log(甲電壓/乙電壓)。
[例] 甲功率比乙功率大一倍,那麼10lg(甲功率/乙功率)=10lg2=3dB,即甲的功率比乙的功率大3 dB。反之,如果甲的功率是乙的功率的一半,則甲的功率比乙的功率小3 dB。
總結:dBm是負數,越接近0信號強度越高,信號越好,但不可能為0。asu為正數,值越大信號越好。dB是兩個量之間的比值,表示兩個量間的相對大小,而dBm則是表示功率絕對大小的值。
關於對數運算,不記得的自行復習一下了。
下面再來了解一下網路類型吧,還是很多的,不過在國內只要了解國內三大運營商的網路類型大概就可以了。
電信
2G CDMA
3G CDMA2000
4G TD-LTE,FDD-LTE
移動
2G GSM
3G TD-SCDMA
4G TD-LTE,FDD-LTE
聯通
2G GSM
3G WCDMA
4G TD-LTE,FDD-LTE
而谷歌API給我們提供的有19種類型,在TelephonyManager類中定義,具體如下
/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN = 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE = 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD = 14;
/** Current network is HSPA+ */
public static final int NETWORK_TYPE_HSPAP = 15;
/** Current network is GSM {@hide} */
public static final int NETWORK_TYPE_GSM = 16;
/** Current network is TD_SCDMA {@hide} */
public static final int NETWORK_TYPE_TD_SCDMA = 17;
/** Current network is IWLAN {@hide} */
public static final int NETWORK_TYPE_IWLAN = 18;
下面通過一些實例來測試一下吧
首先記得加許可權
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_wifi_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
實例代碼
public class MainActivity extends AppCompatActivity {
private static final int NETWORKTYPE_WIFI = 0;
private static final int NETWORKTYPE_4G = 1;
private static final int NETWORKTYPE_2G = 2;
private static final int NETWORKTYPE_NONE = 3;
public TextView mTextView;
public TelephonyManager mTelephonyManager;
public PhoneStatListener mListener;
/**
* 網路信號強度監聽
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textview);
//獲取telephonyManager
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//開始監聽
mListener = new PhoneStatListener();
//監聽信號強度
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onResume() {
super.onResume();
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onPause() {
super.onPause();
//用戶不在當前頁面時,停止監聽
mTelephonyManager.listen(mListener, PhoneStatListener.LISTEN_NONE);
}
private class PhoneStatListener extends PhoneStateListener {
//獲取信號強度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
//獲取網路信號強度
//獲取0-4的5種信號級別,越大信號越好,但是api23開始才能用
// int level = signalStrength.getLevel();
int gsmSignalStrength = signalStrength.getGsmSignalStrength();
//獲取網路類型
int netWorkType = getNetWorkType(MainActivity.this);
switch (netWorkType) {
case NETWORKTYPE_WIFI:
mTextView.setText("當前網路為wifi,信號強度為:" + gsmSignalStrength);
break;
case NETWORKTYPE_2G:
mTextView.setText("當前網路為2G移動網路,信號強度為:" + gsmSignalStrength);
break;
case NETWORKTYPE_4G:
mTextView.setText("當前網路為4G移動網路,信號強度為:" + gsmSignalStrength);
break;
case NETWORKTYPE_NONE:
mTextView.setText("當前沒有網路,信號強度為:" + gsmSignalStrength);
break;
case -1:
mTextView.setText("當前網路錯誤,信號強度為:" + gsmSignalStrength);
break;
}
}
}
public static int getNetWorkType(Context context) {
int mNetWorkType = -1;
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
String type = networkInfo.getTypeName();
if (type.equalsIgnoreCase("WIFI")) {
mNetWorkType = NETWORKTYPE_WIFI;
} else if (type.equalsIgnoreCase("MOBILE")) {
return isFastMobileNetwork(context) ? NETWORKTYPE_4G : NETWORKTYPE_2G;
}
} else {
mNetWorkType = NETWORKTYPE_NONE;//沒有網路
}
return mNetWorkType;
}
/**判斷網路類型*/
private static boolean isFastMobileNetwork(Context context) {
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_LTE) {
//這里只簡單區分兩種類型網路,認為4G網路為快速,但最終還需要參考信號值
return true;
}
return false;
}
}
關於信號獲取流程,這個還需深入研究,目前只在應用層簡單獲取了網路信號。
2. 如何查看手機信號強度的數值
手機信號強度全解析
1.dB
dB是一個表徵相對值的值,純粹的比值,只表示兩個量的相對大小關系,沒有單位,當考慮甲的功率相比於乙功率大或小多少個dB時,
按下面的計算公式:10log(甲功率/乙功率),如果採用兩者的電壓比計算,要用20log(甲電壓/乙電壓)。)
[例] 甲功率比乙功率大一倍,那麼10lg(甲功率/乙功率)=10lg2=3dB。也就是說,甲的功率比乙的功率大3 dB。
反之,如果甲的功率是乙的功率的一半,則甲的功率比乙的功率小3 dB。
2.dBm
dBm是一個表示功率絕對值的值(也可以認為是以1mW功率為基準的一個比值),計算公式為:10log(功率值/1mw)。
[例] 如果功率P為1mw,折算為dBm後為0dBm。
[例] 對於40W的功率,按dBm單位進行折算後的值應為:
10log(40W/1mw)=10log(40000)=10log4+10log10000=46dBm。
總之,dB是兩個量之間的比值,表示兩個量間的相對大小,而dBm則是表示功率絕對大小的值。在dB,dBm計算中,要注意基本概念,
用一個dBm減另外一個dBm時,得到的結果是dB,如:30dBm - 0dBm = 30dB。
3.手機信號強度表示
好了,那麼手機上顯示的數字的單位是那個呢,是dBm。當你仔細看的時候會發現這個值是負的,也就是說手機會顯示比如 -67(dBm),那就說明信號很強了。
一個小知識:
中國移動的規范規定,手機接收電平>=(城市取-90dBm ;鄉村取 -94dBm )時,則滿足覆蓋要求,也就是說此處無線信號強度滿足覆蓋要求。
-67dBm 要比-90dBm 信號要強20多個dB ,那麼它在打電話接通成功率和通話過程中的話音質量都會好的多(當然也包括EDGE/GPRS上網的速度那些 )
所以,那個值越大信號就越好,因為那是個負值,而且它永遠是負值 ,如果感興趣且附近有無線基站的天線的話,可以把手機盡量接近天線面板,那麼值就越來越大,如果手機跟天線面板挨到一起,那麼它可能十分接近於0了(0是達不到的,這里的0的意思不是說手機沒信號了。)
在信號強度計選擇工程模式,顯示了很多參數,只要看BCCHLev(控制信道電平值)它就是手機的信號強度值,單位dBm,多大的信號手機可以正常接聽呢,BCCHLev-C1,C1也有顯示數值,如:BCCHLev(-63) ,C1(34),表示手機在信號大於-97dBm的狀況下是不會掉話的。
再來看手機發射功率要多大才合適呢,按GSM協議規定,手機發射功率是可以被基站控制的。基站通過下行SACCH信道,發出命令控制手機的發射功率級別,
每個功率級別差2dB;
GSM900 手機最大發射功率級別是5(2W=2000mw,33dBm),最小發射功率級別是19(3mw,5dBm),
DCS1800手機最大發射功率級別是0(1W,30dBm),最小發射功率級別是15(1mW,0dBm)。
當手機遠離基站,或者處於無線陰影區時,基站可以命令手機發出較大功率,直至33dBm(GSM900),
以克服遠距離傳輸或建築物遮擋所造成的信號損耗。
強度計里的TXPower就是手機發射功率,在撥打電話的狀態下可以看出手機發射功率,也就是數值越大越省電,輻射越小,數值在5,電話耗電大電池用不了一天,通話時別人經常聽不到聲音,手機經常會突然沒信號,會掉話,這樣可以打投訴電話讓運營商來做信號覆蓋,讓手機信號好起來,減少輻射。
以上那麼多字,只有一個核心意思。不要被手機信號還有多少格欺騙!!!那都是手機廠商自己定義的。咱要玩專業點的,直接看信號強度dBm。
android系統查信號強度在設置—關於手機—網路里。
室內和室外的信號強度是有差距的。一般室外信號比室內好。
現在來看這個所謂的dBm,數值范圍在-XX~0之間。這個數越大,信號強度越高。
-50dBm~0dBm范圍內,信號已經好得很了。
-90dBm~-60dBm,基本不會面臨打不了電話的問題。如果打不了的,找運營商。
G室內,DS放桌上信號強度-67dBm,23asu。作打電話狀握手裡,-75dBm,19asu。調整各種姿勢,看到的最低是-83dBm,15asu。
這屬於什麼等級呢?簡單說就是,信號很不錯。室外沒看,但肯定比這個高,至於其他手機,可以自己上網去看,和DS的dBm值大多在一個檔次。有同志炫耀自己大於-50dBm的,都是因為他就在基站邊上。正常的范圍是-90dBm~-60dBm。
3. 安卓Android系統快速查看系統信號強度
手機最大的功能自然是打電話和發簡訊等基礎性電話功能應用,而限制這些功能實用的根本,除了手機自身以外,就是有運營商的網路情況。那麼我們能夠在自己的Android手機中查看到目前所在網路的信號強度情況嗎?
當然可以,Android手機屬於智能手機,能夠時事顯示出手機的當前狀態,手機信號強度當然也不例外,其實系統本身帶有顯示功能,不用通過第三方的查看工具也能夠查看到當前手機信號強度,適合剛接觸。
Android系統的機友了解一下。
1、進入設置選項,在主屏界面中按下Android手機Menu鍵,在彈出的進階菜單中選擇最後一項「設置」(英文系統即為"Settings"
2、將滑動條拖動至最下方,點擊「關於手機」(英文系統即為"About
Phone")分類。
3、選擇第二項「狀態」(英文系統即為"Status")分類。
4、這時,就能夠看到「信號強度」(英文系統即為"Signal
Strength")選項,前面的-xx(這是一個負數數字)dBm則是手機信號強度。
5、一般"0"—"-50"之間都是一個非常不錯的信號強度,而數值越小則代表著信號越差。
4. 安卓手機怎麼設置wifi信號弱的問題
無線路由器放置的位置和周圍的環境會直接影響到路由器的信號強弱度。
一、無線設備的WIFI信號強度將會對網路傳輸速率造成直接的影響。如果信號質量太差給人最直觀的感覺就是網速慢和卡。實際上,Wi-Fi信號差除了熱點(AP或者無線路由器)的本身的問題外,還受制於其他的一些因素。
5. 移動4g信號強度范圍是多少
移動4g卡手機信號強度數值在-75dBm到-85dBm之間屬於正常范圍。
移動4g卡信號強度詳細介紹:
移動4g卡手機對信號定義了兩個表示單位,一個是dBm,另外一個是asu。
我們通常提到最多的是dBm的表示方法,在手機硬體沒有問題的情況下,信號強度數值在-75dBm到-85dBm之間屬於正常范圍,該數值內手機接聽撥打電話都不會出現問題。信號強度數值在-85dBm到-95dBm之間時手機信號格數往往就不再是滿格狀態,但手機通話還是沒有問題。
而數值在-100dBm到-110dBm之間時說明手機的信號已經比較弱,此時如果用戶撥打電話恰好遇到從一個信號基站移動到另外一個信號基站時就會出現手機通話中斷的情況。而在-110dBm以下手機基本處於無服務狀態,撥打電話肯定會出現掉線情況。
(5)安卓網路信號強度擴展閱讀:
4G網路的理論最高速度能達到100Mbps,約為12.5M/秒。但在實際使用過程中,受限於信號強度、基站損耗、手機的信號接入能力等各種因素的影響,一般在1-2M/S左右。
第四代行動電話行動通信標准,指的是第四代移動通信技術,外語縮寫:4G。4G能夠以100Mbps以上的速度下載,比目前的家用寬頻ADSL(4兆)快25倍,並能夠滿足幾乎所有用戶對於無線服務的要求。
6. 如何測量Android手機的信號強度
在你手機屏幕上方顯示的信號條永遠不會是最好的方法來確定你手機的信號,無論你用什麼手機都一樣。Android也是,用很粗的條來展示很強的信號,但這些條僅僅表示最高的信號。或許你並不熟悉,信號通常是以dBm度量的。dBm是每毫瓦特的電磁波產生的功率。-60dBm的信號接近完美,-112dBm就很容易掉線,如果你在 -87dBm以上,Android會顯示一個4格的滿信號。
如果你想查看信號的原始數據,你可以查看Android菜單的狀態屏幕。只要拉起菜單,向下滾動,選擇關於手機,然後選擇狀態。在這個屏幕上,你將能看到你的信號以dBm 或者AUS的形式呈現。ASU僅僅代表手機將它的位置傳遞給附近的信號塔的速率。它和dBm測量的是一樣的東西,但是是以一種更加線性的方式來表示。你可以用這個公式將ASU轉換成dBm:dBm=-113+(2*ASU)。
所以如果你看這些數字的話將會對屏幕上方那個模糊的長條有更深刻的理解。另一種確定你想要什麼類型信號的方式是觀察你離信號塔有多遠。用Android商店裡一個叫天線的應用,你可以看到一張地圖,你手機能搜到的所有信號塔的位置都在上面。你可以知道朝向哪個方向才能得到最好的信號覆蓋。
當你在3G網路時,這個應用會受到Android中一些 API的限制。多數運行商在同一個城鎮都同時有2G和3G設備,所以為了防止探測混亂,這個應用只能在2G中工作;它在網路連接菜單里。天線能用ASU來向你展示你手機從周圍各個信號塔可以得到的相近信號(如果你想獲得dBm的值,你必須轉化它)。在3G網中,它只能向你展示手機正連接著的信號塔的信號強弱,但在2G網路里,它會向你展示周圍所有信號塔的信號強弱。不幸的是,CDMA像3G一樣受到限制,所以在Sprint和 Verizon的網路中你也得不到更多的信息。
然後該怎麼辦呢?
或許你已經用上述的方法測試過你所在地的信號強度了,然後發現 Android的信號顯示條並不精確。或許你發現自己在一個信號覆蓋很好的地方,並且希望當你離開那時,希望得到更多的警告。此時,在-88dBm處第一格才會消失的信號提示沒什麼用處。你可以使用一個應用來展示你自己定製的方便查看的信號強度顯示。叫做真實信號的應用會在信號條處展示一個5格的信號提示。
沒有管理員許可權你是無法替換標準的Android信號條的,但是你可以培養自己看左上方而不是右上方的習慣。真實信號會讓你用ASU來給每個條劃分數值。如果你向下拉提示條,它將會展示當前時刻的ASU和應用啟動後ASU的最高和最低值。這項服務開啟關閉可以隨你所願。對於那些不相信系統自帶信號顯示條的人來說這是一個相當好的選擇。
Nexus One會有「握死」現象嗎?
現在許多的手機把天線放在話筒的底部,Nexus One也不例外。這是由FCC測試手機輸出功率的方式決定的。他們通常把手機放在一個人頭部類似物的旁邊,然後測量從話筒處傳來的能量。將天線安置在底部意味著感測器會探測到最少的電磁波。知道這些後,那是否有握**在使用Nexus One的時候使信號消失呢?
我們首先測試了將手機平放在桌子上時的信號。在HSDPA(3G)中,顯示-91dBm,11ASU。你的初始信號差不多也會是這樣。用一個蘋果認可的手機套來握住Nexus One,不要觸摸手機的表面,我們看到信號沒有明顯的減弱。用手蓋住手機底部的一半是種更自然的握資,但這確實會影響信號。信號在-101dBm和 -98dBm之間往返,所有這些仍舊在3G信號中測試。
在信號轉到EDGE之前,在「握死」下的信號強度
採用一種更極端的方式,我們用雙手握住手機的一半,包括整個底部。幾秒鍾後,3G信號顯示在-101dBm至 -111dBm之間,然後掉到0。在那時,EDGE服務開始生效。即使我們超越了信號測量儀的測量界限,3G標志仍舊沒有消失,因為軟體啟動了向EDGE 網路的連接。我們覺得在信號為0時還是有可能獲得一些數據的,但是語音就是另一回事了。我們決定嘗試手機只連接3G網路,然後試著通過用雙手來包裹手機來使電話掉線。
我們用測試語氣撥打了一個號碼然後開始覆蓋住手機(PS:我們不確定那個電話是免費的,但是我們還是冒險了)。和預期的一樣,任何用一隻手來握手機的正常方式都沒問題。當我們把手機夾在兩只手中間的時候,電話在大概10秒後掉線了。在不關閉2G網路的情況下我們又試了一次,這次通話在2G網路上繼續了,其間沒有間斷。所以,你可以使Nexus One的3G信號消失,但這需要兩只手。
現在無論身處何地我們都在使用智能手機。正因如此,我們希望無論我們在哪它們都能正常工作。但悲哀的是,3G信號比我們期望的要少得多(在美國)。即使生活在大城市的郊區,信號都可能很弱。在你希望得到某種程度的服務前,最好先弄清楚你在使用什麼工作。幸運的是,在 Android上你不必相信手機的信號條。你有工具,包括第三方的,可以幫助你掌握真實情況。
7. 安卓手機查看信號強度代碼
1.進入設置選項,在主屏界面中按下Android手機Menu鍵,在彈出的進階菜單中選擇最後一項「設置」(英文系統即為"Settings");
2.將滑動條拖動至最下方,點擊「關於手機」(英文系統即為"About
Phone")分類;
3.選擇第二項「狀態」(英文系統即為"Status")分類;
4.這時,就能夠看到「信號強度」(英文系統即為"Signal
Strength")選項,前面的-xx(這是一個負數數字)dBm則是手機信號強度。
5.一般"0"—"-50"之間都是一個非常不錯的信號強度,而數值越小則代表著信號越差。