如何以编程方式找出载波信号强度

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

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#*号码来testing设备的信号强度时,它显示为-65 。 下面我附上了截图。 来自getSignalStrength()的值是否准确? 那为什么总是返回正值?

在这里输入图像说明

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

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

此外,iOS不会按照这种线性方式测量信号强度

我也注意到,即使在状态栏中有5个小节,RSSI值也可能不是100。

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

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

它会使你的结果更加可靠,你也可以有效地处理信号强度的突然变化。

我会build议阅读分贝的措施。 以下链接应该有所帮助。 如何读取信号强度

对于许多信号, getSignalStrength()应与高通滤波器algorithm联合使用。

同时确保在一段时间内进行平均测量(连续测量10-15次)。 这是正常的,它会给负面的结果,电话的dB信号是这样的;-)