4

Here is the code that I have used to find out carrier signal strength:

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;
}

It is giving me values between 60 to 100, but when I test the signal strength in device by calling to this *3001#12345#* number it showed me as -65. Below I have attached the screenshot. Is the value coming from getSignalStrength() accurate? Then why is it returning positive values always?

enter image description here

4

5 回答 5

6

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

于 2013-03-20T18:26:15.927 回答
5

我对CTGetSignalStrength()CoreTelephony 的观察是,它返回 RSSI(Received Signal Strength Indication)运营商信号强度的值。我对此的实验返回的值介于 0 到 100 之间,我相信这是根据this的载波的“信号强度百分比” 。

iOS也不会根据这个以线性方式测量信号强度

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

于 2014-08-05T04:58:06.320 回答
3

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

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

这将使您的结果更加可靠,您还可以有效地处理信号强度的突然变化。

于 2013-03-23T05:33:26.537 回答
1

至于很多信号getSignalStrength()应该联合使用一个高通滤波算法。

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

于 2013-03-26T18:47:10.193 回答
1

我建议阅读分贝测量。以下链接应该有所帮助。 如何读取信号强度

于 2013-03-15T13:05:15.217 回答