2013-03-15 22 views
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()的值是否准确?那为什么它总是返回正值呢?

enter image description here

+0

没有单元的任何除了相对比较之外,测量没有意义。 – 2013-03-15 08:17:28

回答

7

getSignalStrength()显示了否定的dB衰减,例如, - ( - 60)== 60.调用显示更传统的测量值小于零。是的,这些变化是典型的。即使在严格控制的条件下,您也可以获得+/- 20分贝。解决这个问题的一种方法是随着时间的推移进行一系列测量,例如每秒一次,并保留最近10次左右测量的运行列表。然后报告平均数或中位数或其他统计数据。根据我的经验,这大大减少了变化。您也可以执行标准偏差来提供可靠性度量。

+0

我们知道getSignalStrength()是否返回GSM吗? CDMA? 3G? 4G? LTE?信号强度数据? – Cole 2013-07-03 16:25:39

3

getSignalStrength()以负值提供结果。可以使用高通滤波器来控制差异。

您应该收集最近10次观察结果。在添加新观测值时,取最近10次观测的平均值。乘以0.1。取当前的读数并乘以0.9。同时添加。如果总观测值大于10,则删除最早的观测值以便进行下一次计算。

它会使您的结果更可靠,并且您还可以有效处理信号强度的突然变化。

+0

这是一个数学公式来规范读数?换句话说,我在哪里可以阅读更多关于正常化读数的内容? – 2014-08-27 12:37:40

1

至于许多信号getSignalStrength()应与高通滤波器算法联合使用。

还要确保在一段时间内进行平均测量(连续测量10-15次)。 而且它给了否定的结果是正常的,对电话dB的信号是像CoreTelephony上CTGetSignalStrength()是;-)

5

我的观察是,它返回的载波的信号强度的 RSSI(Received Signal Strength Indication)值。我对此的实验返回范围0 - 100之间的值,我相信这是根据this载波的“百分比信号强度”。

此外iOS不以线性方式根据this

测量信号强度我还注意到,即使当我们在状态栏5巴,RSSI值可以不是100