下面是我用来找出载波信号强度的代码:
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()
准确吗? 那为什么返回正值始终?
getSignalStrength()
是表示否定dB的衰减,例如, - ( - 60)== 60中更通常显示它作为测量小于零的呼叫。 是的,这些种类的变体是典型的。 即使是在严格控制的条件就可以得到+/- 20分贝。 你能解决这个问题的方法之一是采取一系列的测量随着时间的推移,说每一秒,并且保留最后10次左右的测量的运行列表。 然后报告平均值或中值或其他一些统计。 在我的经验,这减少了变化了很多。 你也可以做标准差来提供可靠性的措施。
我在观察CTGetSignalStrength()
在CoreTelephony是,它返回的RSSI(Received Signal Strength Indication)
的载波的信号强度值。 100,我相信这是根据“百分比信号强度”的载体的-我与此实验的范围内0之间返回值此 。
也iOS不根据以线性的方式测量的信号强度这
我还注意到,即使我们在状态栏5条,RSSI值可能不是100。
getSignalStrength()
将结果提供在负规模。 的差异可以使用高通滤波器来控制。
你应该收集过去10所观察的结果。 在增加新的观测时间,取最后10个观察值的平均值。 0.1相乘。 就拿当前的读数和0.9相乘。 添加两者。 如果总的观察是大于10,除去用于下一次计算的最古老的观察。
它会使你的结果更可靠,也可以有效地处理在信号强度的突然变化。
我会建议在分贝衡量学生的阅读起来。 点击以下链接应该有所帮助。 如何阅读信号强度
作为许多信号getSignalStrength()
应cojointly具有高通滤波器算法中使用。
另外,还要确保有一个平均测量过一段时间(10-15连续测量)。 而这是正常的,它给了否定的结果,分贝信号,电话都是这样的;-)