安卓如何获取信噪比(Signal to Noise Ratio,SNR)

9
我想知道是否有方法可以在Android手机中以编程方式获取LTE/WCDMA信号的SNR或信噪比。 SNR可以从三星型号的* # 0011#秘密代码中查看,但在其他手机(例如Nexus 5)中无法查看。我在想,如果没有实际的API,也许可以从现有的API计算出来?
我知道您可以使用SignalStrength API获取有关信号的详细信息,但我已解析了我看到的部分,似乎找不到任何SNR读数。
非常感谢您的任何帮助或建议!
谢谢!
附加信息:
我应该补充说,我一直在尝试使用此线程的Signal Strength [link] (如何在Android中获取LTE信号强度?),所以这是我的问题的起点。
我的结果如下:
LteSignalStrength->在位置之间波动约为15-30,不知道这是什么..
LteRsrp->显示dBm,我想这就是手机确定信号质量的方法(大致如此)。
LteRsrq->显示-7至-11,不确定
LteRssnr->由于某种原因始终为300,不知道为什么...
LteCqi->信道质量指示符?一些巨大的数字,似乎是最大的32位整数值,不确定。
是否有一种方法可以从此API获得SNR,还是我在干草堆中寻找不存在的针?
三星GalaxyNote2的截图,其中包含来自*#0011#秘密代码的SNR读数: enter image description here

嗯...我相信手机以某种方式看到它,因为三星变体能够通过秘密代码显示它。只希望API更加可用。 - publicknowledge
1
很抱歉,我还没有足够的声望来发布它... =( - publicknowledge
现在您可以上传图片。您可以在此处发布链接或仅写下SNR的值。 - Atif Farrukh
目前我的信噪比大约在14-15左右。 - publicknowledge
谢谢你的点赞。现在附上截图。 - publicknowledge
显示剩余5条评论
2个回答

12
  • 通过查看AOSP内部的原生类,似乎Android通过从调制解调器返回的值进行封装,并使用AT+CSQ命令(请检查AOSP本机类reference-ril.c)提供SignalStrength值。但只有这一个命令提供的信息。问题在于,该命令只提供与块误码率(BLER)耦合的信号质量,并未提供其他传入信号的任何信息;在某些设备中的LTE调制解调器中似乎没问题,但当您切换到UMTS网络时,情况变得不明确/不一致;
  • 您可以通过自己使用其他单元的接收信号强度计算传入干扰(SNR和其他),或者使用AT+CGREG和AT+CREG(再次,请检查reference-ril.c类)中获取的接收信号强度的电信公式推导(相关RSSI、RSCP、EcNo等)。;
  • 我挖掘了所有与电话相关的AOSP内部类,跟踪和绘制了关于电信的方法调用。我从SDK层开始(我们使用TelephonyManager和PhoneStateListener API类),一直到用C/C++编写的本机无线电接口层类。我从未发现基于其他单元计算的SNQ计算,但只是作为使用AT+CSQ从调制解调器获得的值而已(此命令仅提供信号质量和BLER)。 对我来说,这听起来很奇怪,因为干扰是使用其他接收信号计算的值,包括不属于GSM的信号。 因此,对我来说,从Android API获取的传入SNR有些无能或不完整。
  • 基于上述,我认为:

    1. 谷歌不是3GPP,3GPP也不是谷歌。Android项目庞大而复杂,有超过1200万行代码。很可能在Android和电信之间会错过一些通讯/理论信息;
    2. 我特别在寻找CQI,我怀疑CQI是在L2 PPP(点对点协议)中计算的LQR(链路质量报告)上下文中;
    3. 这篇文章讨论的主题真的很棘手。因为不同的设备拥有不同(可能是封闭的)硬件驱动程序,所以没有什么神器。我们需要为每个不同的设备支持不同的软件。也许,如果您需要所有设备的正确值,则需要为每个设备重新编译整个Android ROM。
    4. 希望这些能给您带来一些启示。如果您有任何额外的信息,请在此分享。


    3
    我使用以下代码来获取信噪比(SNR):
    public class PhoneStateListener extends android.telephony.PhoneStateListener
    {
        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength)
        {
            double snr = (double) SignalStrength.class.getMethod("getLteRssnr").invoke(signalStrength)/10D;
        }
    }
    

    您只需要注册信号事件:

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

    1
    请注意,从Android Q开始,它已更改为 CellSignalStrengthLte.getRssi()。 https://developer.android.com/about/versions/10/non-sdk-q - Keselme
    如何找到WCDMA的信噪比(SNR)? - Mercy Angel
    @MercyAngel 您可以通过获取所有可能的cellInfolist来使用类型转换过程:- val telephonyManager: TelephonyManager = this.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager cellInfoList = telephonyManager.allCellInfo 然后,您可以简单地检查您获得的cell info列表项是否为wcdma!如下所示: if (cellInfo is CellInfoWcdma) { ... } 希望这对您有所帮助。 - A S M Sayem

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接