【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 反推
相关推荐
千里马学框架18 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台19 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone19 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc20 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo21 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui