如何通过编程找出运营商信号强度

4

这是我用来查找载波信号强度的代码:

int getSignalStrength()
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    int (*CTGetSignalStrength)();
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
    if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
    int result = CTGetSignalStrength();
    dlclose(libHandle);
    return result;
}

它给我的值在60到100之间,但是当我通过拨打*3001#12345#*号码来测试设备的信号强度时,它显示为-65。下面我附上了截图。那么getSignalStrength()返回的值准确吗?为什么它总是返回正值?

没有度量单位,任何测量都是毫无意义的,除了相对比较。 - Paul R
5个回答

6

getSignalStrength()显示的是负数的dB衰减,例如-(-60)== 60。而呼叫中以一种比零更小的测量方式来显示它。是的,这些类型的变化是典型的。即使在严格控制的条件下,您也可能会得到+/-20分贝。您可以通过按时间间隔(例如每秒钟)进行一系列测量,并保留最近10个或更多的测量结果,然后报告平均值、中位数或其他统计数据来解决这个问题。根据我的经验,这样可以大大减少变化。您还可以进行标准差计算,以提供可靠性度量。


жҲ‘们жҳҜеҗҰзҹҘйҒ“getSignalStrength()иҝ”еӣһзҡ„жҳҜGSMпјҹCDMAпјҹ3Gпјҹ4GпјҹLTEпјҹдҝЎеҸ·ејәеәҰж•°жҚ®пјҹ - Cole

5
我的观察是,在CoreTelephony中调用CTGetSignalStrength()函数,它会返回运营商信号强度的RSSI(接收信号强度指示)值。我进行的实验显示,该函数返回0至100之间的值,我认为这是根据此链接的解释,“运营商信号强度百分比”的意思。

同时,iOS并不像此链接所述,以线性方式测量信号强度。

我还注意到,即使状态栏中显示有5个信号强度条,RSSI值也可能不是100。


3
getSignalStrength()提供的结果是负数。可以使用高通滤波器来控制差异。
您应该收集过去10次观测的结果。在添加新观测时,取最近10次观测的平均值。乘以0.1。取当前读数并乘以0.9。将两者相加。如果总观测次数大于10,则删除下一次计算的最旧观测。
这样可以使您的结果更可靠,并且还可以有效处理信号强度的突然变化。

这是一个用于规范化读数的数学公式吗?换句话说,我在哪里可以阅读更多关于规范化读数的内容? - rebellion

1

1

对于许多信号,应该与高通滤波算法一起使用getSignalStrength()

还要确保在一定时间内进行平均测量(10-15次连续测量)。 而且,它给出负结果是正常的,电话信号的dB值就是这样的;-)


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