【Settings】获取 SIM 卡信号强度 dBm 和 ASU

一、需求描述

运营商的设备管理应用,需要定时上报设备的信号强度,单位是 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));
            }
        }
    }

signalNrDbmsignalNrAsu 表示 5G 网络的信号强度

signalDbmsignalAsu 表示非 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 系统)中,dBmASU 是两种常用于表示手机信号强度的单位,它们含义不同,但可以相互换算。

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 反推
相关推荐
czlczl2002092513 小时前
IN和BETWEEN在索引效能的区别
android·adb
Volunteer Technology13 小时前
ES高级搜索功能
android·大数据·elasticsearch
北京自在科技14 小时前
Find Hub App 小更新
android·ios·安卓·findmy·airtag
lbb 小魔仙14 小时前
2026远程办公软件夏季深度横测:ToDesk、向日葵、网易UU远程全面对比,远控白皮书
android·服务器·网络协议·tcp/ip·postgresql
coding_fei14 小时前
AudioServer初始化过程
android
brucelee18615 小时前
Docker 运行 Android 模拟器
android·docker·容器
私人珍藏库15 小时前
[Android] 小柚市场app v2.3.0.8安卓版TV版
android
HackTorjan15 小时前
MySQL高可用架构设计与最佳实践
android·人工智能·mysql·adb·自动化
Gary Studio15 小时前
自定义 Android 系统服务与 HAL 交互全流程指南
android·交互
JMchen12315 小时前
NDK新趋势——Rust与Android深度集成实战
android·开发语言·rust·jni·内存安全·android ndk·移动端性能