如何以编程方式找出载波信号强度
这里是我用来找出载波信号强度的代码:
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信号是这样的;-)