Android如何获得SNR(信噪比)

时间:2014-10-21 03:53:43

标签: android

我想知道是否有人知道如何以编程方式获得Android手机中的LTE / WCDMA信号的SNR或信噪比。 SNR可以从三星机型的密码*#0011#中查看,但在Nexus 5等其他手机中无法查看。我在想是否有实际的API,可能是现有API的计算?

我知道您可以使用SignalStrength API获取有关信号的详细信息,但我已经解析了我看到的部分,但似乎无法找到任何SNR读数。

非常感谢任何帮助或建议!

谢谢!

其他信息:

我应该补充一点,我已经从这个帖子[链接] How to get LTE signal strength in Android?修补了信号强度,所以这是我的问题的起点。

我的结果如下:

LteSignalStrength - >根据位置在15-30之间波动,不知道这是什么..

LteRsrp - >显示dBm,我想这就是手机如何确定信号质量(大致无论如何)。

LteRsrq - >显示-7到-11,不确定

LteRssnr - >因某种原因总是300,不明白为什么......

LteCqi - >渠道质量指标?一些巨大的数字,似乎是最大的32位整数值,不确定

有没有办法从这个API获得SNR,或者我在大海捞针中寻找一个不存在的针?

三星GalaxyNote2的屏幕截图,SNR读数来自*#0011#密码: enter image description here

2 个答案:

答案 0 :(得分:10)

我从2014年8月开始密集研究这个问题。 首先,我希望您熟悉一些电信知识和Android开源项目(AOSP)。那么,根据我的研究,我说:

  1. 通过查看AOSP内部本机类,似乎Android通过从 AT + CSQ 命令中返回值来提供SignalStrength值(请检查AOSP本机类 reference-ril.c < / strong>)通过调制解调器。而且只有它。问题是这个命令只能提供信号质量和块错误率(BLER),并且不会告知任何其他输入信号;在LTE调制解调器中,某些设备似乎没问题,但是当你改用UMTS网络时,事情变得不清楚/不一致;
  2. 您可以通过使用来自其他小区的接收信号强度的电信公式(相关RSSI,RSCP,EcNo等等)的一些推导来计算输入干扰(SNR和其他),或者 AT + CGREG AT + CREG (同样,请检查 reference-ril.c 类)。;
  3. 我挖掘了所有AOSP内部类,跟踪和绘制与电话相关的方法调用。我已经从SDK层(我们使用 TelephonyManager PhoneStateListener API类)查看了所有内容,然后查看了用c / c ++编写的本机无线电接口层类。在任何时候,我都发现SNQ计算真正基于其他单元格,但只作为从调制解调器获得的值 AT + CSQ (此命令仅提供信号质量和BLER)。这听起来很奇怪,因为干扰是用其他接收信号计算的值,包括那些不是来自GSM的信号。因此,对我来说,从Android API获得的传入SNR有点蹩脚或不完整。
  4. 基于以上所述,我认为:

    1. Google不是3GPP。而且3GPP不是谷歌。 Android是一个庞大而复杂的项目,拥有超过1200万行代码。 Android和电信之间可能会错过沟通/理论信息,这是非常合理的;
    2. 特别是我正在搜索CQI,我怀疑CQI处于LQR(链路质量报告)的上下文中,以L2 PPP(点对点协议)计算;
    3. 此主题的主题确实存在问题。没有圣杯,因为不同的设备拥有不同的(可能是封闭的)硬件驱动程序。我们需要为每个不同的设备支持不同的软件。也许,如果您需要为所有设备提供正确的值,您需要为每个设备重新编译整个Android ROM。
    4. 我希望它能给你带来一些启示。如果您有任何其他信息,请在此处分享。

答案 1 :(得分:1)

I use the following to get the SNR:

public class PhoneStateListener extends android.telephony.PhoneStateListener
{
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength)
    {
        double snr = (double) SignalStrength.class.getMethod("getLteRssnr").invoke(signalStrength)/10D;
    }
}

You just need to register for signal events:

TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
PhoneStateListener mPhoneStateListener = new PhoneStateListener();
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);