【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 反推
相关推荐
Q***f6352 小时前
Kotlin在Android性能优化中的工具
android·开发语言·kotlin
杨筱毅2 小时前
【底层机制】Android图形渲染体系深度解析:VSync信号机制
android·图形渲染·底层机制
江澎涌3 小时前
JHandler——一套简单易用的 C++ 事件循环机制
android·c++·harmonyos
心疼你的一切4 小时前
Unity开发Rokid应用之离线语音指令交互模型
android·开发语言·unity·游戏引擎·交互·lucene
2501_915909065 小时前
iOS APP 抓包全流程解析,HTTPS 调试、网络协议分析与多工具组合方案
android·ios·小程序·https·uni-app·iphone·webview
Propeller5 小时前
【Android】快速上手 Android 组件化开发
android·架构
那我掉的头发算什么5 小时前
【javaEE】多线程进阶--CAS与原子类
android·java·jvm·java-ee·intellij-idea
Yue丶越6 小时前
【Python】基础语法入门(二)
android·开发语言·python
q***08746 小时前
MySQL压缩版安装详细图解
android·mysql·adb