一、需求描述
运营商的设备管理应用,需要定时上报设备的信号强度,单位是 dBm(分贝毫瓦)
二、需求分析
参考设置中关于设备 - SIM 状态对话框 - 信号强度的实现方式

Settings/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
java
private void updateSignalStrength(SignalStrength signalStrength) {
if (signalStrength == null) {
return;
}
// by default we show the signal strength
boolean showSignalStrength = true;
if (mSubscriptionInfo != null) {
final int subscriptionId = mSubscriptionInfo.getSubscriptionId();
final PersistableBundle carrierConfig =
mCarrierConfigManager.getConfigForSubId(subscriptionId);
if (carrierConfig != null) {
showSignalStrength = carrierConfig.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL);
}
}
if (!showSignalStrength) {
mDialog.removeSettingFromScreen(SIGNAL_STRENGTH_LABEL_ID);
mDialog.removeSettingFromScreen(SIGNAL_STRENGTH_VALUE_ID);
return;
}
ServiceState serviceState = getTelephonyManager().getServiceState();
if (!Utils.isInService(serviceState)) {
return;
}
int signalDbm = getDbm(signalStrength);
int signalAsu = getAsuLevel(signalStrength);
if (signalDbm == -1) {
signalDbm = 0;
}
if (signalAsu == -1) {
signalAsu = 0;
}
/** SR.599.001006.003160 @{*/
if (mSubscriptionInfo != null) {
boolean isInNsa = false;
int signalNrDbm = 0;
int signalNrAsu = 0;
if (mTelephonyDisplayInfo != null) {
if (mTelephonyDisplayInfo.getOverrideNetworkType()
== TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) {
isInNsa = true;
for (CellSignalStrengthNr cellNr :
signalStrength.getCellSignalStrengths(CellSignalStrengthNr.class)) {
signalNrDbm = cellNr.getDbm();
signalNrAsu = cellNr.getAsuLevel();
}
if (signalNrDbm == Integer.MAX_VALUE) {
signalNrDbm = 0;
signalNrAsu = 0;
}
Log.d(TAG, "updateSignalStrength signalNrDbm : " + signalNrDbm + " signalNrAsu: "
+ signalNrAsu);
}
}
if (isInNsa) {
mDialog.setText(SIGNAL_STRENGTH_VALUE_ID, "LTE: " +
mRes.getString(R.string.sim_signal_strength,
signalDbm, signalAsu) + (isInNsa ? ("\n NR: " + mRes.getString
(R.string.sim_signal_strength,
signalNrDbm, signalNrAsu)) : ""));
} else {
mDialog.setText(SIGNAL_STRENGTH_VALUE_ID, mRes.getString(R.string.sim_signal_strength,
signalDbm, signalAsu));
}
}
}
signalNrDbm 和 signalNrAsu 表示 5G 网络的信号强度
signalDbm 和 signalAsu 表示非 5G 网络的信号强度
三、解决方案
获取 TelephonyManager
java
TelephonyManager mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
通过 getSignalStrength 来解析,会区分 5G 网络和其他,单位是 dBm(分贝毫瓦) ,这里只获取了 dBm 作为参考
java
public int getCsq() {
int dbm = 0;
SignalStrength signalStrength = mTelephonyManager.getSignalStrength();
if (signalStrength != null) {
if (mTelephonyManager.getDataNetworkType() == TelephonyManager.NETWORK_TYPE_NR) {
int signalNrDbm = 0;
for (CellSignalStrengthNr cellNr : signalStrength.getCellSignalStrengths(CellSignalStrengthNr.class)) {
signalNrDbm = cellNr.getDbm();
}
return signalNrDbm;
}
List<CellSignalStrength> cellSignalStrengthList = signalStrength.getCellSignalStrengths();
if (cellSignalStrengthList == null) {
return dbm;
}
for (CellSignalStrength cell : cellSignalStrengthList) {
if (cell.getDbm() != -1) {
dbm = cell.getDbm();
break;
}
}
}
return dbm;
}
四、关于 dBm 和 ASU
在移动通信(包括 Android 系统)中,dBm 和 ASU 是两种常用于表示手机信号强度的单位,它们含义不同,但可以相互换算。
1. dBm(Decibel-milliwatt)
-
定义 :dBm 是一种绝对功率单位 ,表示相对于 1 毫瓦(mW)的对数功率值,计算公式为:

-
特点:
- 信号强度通常为负值,因为接收到的信号远小于 1 mW。
- 典型范围:-30 dBm(极强)到 -110 dBm(极弱) 。
- -70 dBm 或更高(如 -60 dBm)通常表示良好信号 。
-
用途:广泛用于工程和网络优化中,因为它直接反映信号的物理强度。
2. ASU(Arbitrary Strength Unit)
-
定义 :ASU 是一个无量纲的整数单位 ,是手机内部对信号强度的相对度量,不同网络制式下定义不同 。
-
特点:
- GSM 网络 :ASU 范围为 0--31,其中 99 表示未知;ASU = 99 通常意味着无服务。
- UMTS(3G)网络 :ASU 表示 RSCP(Received Signal Code Power) ,范围 0--97 。
- LTE/5G 网络 :ASU 通常基于 RSRP(Reference Signal Received Power)。
-
与 dBm 的换算关系(以 LTE 为例) :

例如:ASU = 30 → dBm = 2×30 − 113 = -53 dBm(极强信号)。
3. 对比总结
| 项目 | dBm | ASU |
|---|---|---|
| 单位类型 | 绝对功率单位(物理量) | 相对整数单位(设备内部表示) |
| 数值范围 | -30 ~ -110 dBm(典型) | 0--31(GSM)、0--97(UMTS)等 |
| 是否负值 | 是 | 否 |
| 是否通用 | 是,跨平台通用 | 否,依赖网络制式和设备厂商 |
| 换算 | 可由 ASU 换算(依网络类型而定) | 可由 dBm 反推 |