【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));
            }
        }
    }

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 反推
相关推荐
电商API_1800790524713 分钟前
闲鱼商品列表API接口商品详情API接口请求示例(含一份真实响应数据示例)
android·数据挖掘·网络爬虫·跨境电商·反向海淘
我命由我1234529 分钟前
Android 广播 - 组件通信
android·java·开发语言·android studio·android jetpack·android-studio·android runtime
阿俊-全栈开发30 分钟前
LikeShop 单商户标准版商品管理二开:分类、SKU 规格与库存联动实现
android·likeshop·likeshop开源商城
用户2181697049303 小时前
Kotlin 语法二
android
妖星4 小时前
android 源码分析surfaceFinger是如何通过设置属性启动bootanim
android
JoyMonitor4 小时前
APK mmap 内存增长定位:pagemap 与 DEX 结构联合定位方法
android
有什么事4 小时前
永久虚拟免费云手机能实现吗,本地安卓容器与云端托管的技术边界
android·智能手机
妖星4 小时前
Android 源码 .rc 语法详解
android
JMchen4 小时前
实战项目一——实现一个高性能图片滤镜App
android·c++·性能优化