如何以编程方式找出载波信号强度
Posted
技术标签:
【中文标题】如何以编程方式找出载波信号强度【英文标题】:How to find out carrier signal strength programmatically 【发布时间】:2013-03-15 08:12:01 【问题描述】:这是我用来检测载波信号强度的代码:
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()
的值是否准确?那为什么总是返回正值呢?
【问题讨论】:
没有单位,任何测量都是没有意义的,除非是相对比较。 【参考方案1】:getSignalStrength()
显示否定的 dB 衰减,例如-(-60) == 60。调用更常规地将其显示为小于零的测量值。是的,这些变化是典型的。即使在严格控制的条件下,您也可以获得 +/- 20 分贝。您可以解决它的一种方法是随着时间的推移进行一系列测量,比如每秒,并保留最后 10 次左右测量的运行列表。然后报告平均值或中位数或其他一些统计数据。以我的经验,这大大减少了变化。您还可以使用标准差来衡量可靠性。
【讨论】:
我们知道getSignalStrength()
是否正在返回GSM?码分多址? 3G? 4G? LTE?信号强度数据?【参考方案2】:
我对 CoreTelephony 中 CTGetSignalStrength()
的观察是,它返回
RSSI(Received Signal Strength Indication)
运营商信号强度值。我对此的实验返回的值介于 0 - 100 之间,我认为这是根据 this 的运营商的“信号强度百分比”。
ios 也不会根据this 以线性方式测量信号强度
我还注意到,即使我们在状态栏中有 5 条,RSSI 值也可能不是 100。
【讨论】:
【参考方案3】:getSignalStrength()
提供负比例的结果。可以使用高通滤波器控制差异。
您应该收集最近 10 次观察的结果。在添加新观测值时,取最后 10 个观测值的平均值。乘以 0.1。取当前读数并乘以 0.9。两者都加。如果总观测值大于 10,则删除最旧的观测值以进行下一次计算。
这将使您的结果更加可靠,并且您还可以有效地处理信号强度的突然变化。
【讨论】:
这是标准化读数的数学公式吗?换句话说,我在哪里可以阅读更多关于标准化读数的信息?【参考方案4】:我建议阅读分贝测量。以下链接应该会有所帮助。 How to Read Signal Strength
【讨论】:
【参考方案5】:对于很多信号getSignalStrength()
应该配合高通滤波算法使用。
还要确保在一段时间内进行平均测量(10-15 次连续测量)。 它给出负面结果是正常的,电话的dB信号就是这样;-)
【讨论】:
以上是关于如何以编程方式找出载波信号强度的主要内容,如果未能解决你的问题,请参考以下文章
如何在 c++ linux 中获取 3g 调制解调器信号强度?