2013-03-15 2 views
4

Вот код, который я использовал, чтобы узнать уровень сигнала несущей:Как узнать уровень сигнала несущей программно

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() точным? Тогда почему он всегда возвращает положительные значения?

enter image description here

+0

Без единиц каких-либо измерение бессмысленно, за исключением относительных сравнений. –

ответ

7

getSignalStrength() показывает отрицательное ослабление дБ, например. - (- 60) == 60. Призыв отображает его более условно как измерение, меньшее нуля. Да, эти разновидности типичны. Даже в строго контролируемых условиях вы можете получить +/- 20 децибел. Один из способов исправить это - провести серию измерений с течением времени, скажем каждую секунду, и сохранить список из последних 10 или около того измерений. Затем сообщите среднюю или среднюю или некоторую другую статистику. По моему опыту это значительно сокращает вариацию. Вы также можете выполнять стандартное отклонение, чтобы обеспечить степень надежности.

+0

Знаем ли мы, что 'getSignalStrength()' возвращает GSM? CDMA? 3G? 4G? LTE? данные о силе сигнала? – Cole

3

getSignalStrength() обеспечивает результат в отрицательном масштабе. Разницу можно контролировать с помощью фильтра высоких частот.

Вы должны собрать результаты последних 10 наблюдений. Во время добавления нового наблюдения возьмите среднее из последних 10 наблюдений. Умножьте его на 0,1. Возьмите текущее чтение и умножьте его на 0,9. Добавьте оба. Если общее количество наблюдений больше 10, удалите самое старое наблюдение для следующего расчета.

Это сделает ваш результат более надежным, и вы также сможете эффективно реагировать на внезапные изменения мощности сигнала.

+0

Это математическая формула для нормализации показаний? Другими словами, где я могу больше узнать о нормализации показаний? –

1

Как для многих сигналов getSignalStrength() следует использовать совместно с алгоритмом фильтра верхних частот.

Также убедитесь, что у вас среднее время измерения (10-15 последовательных измерений). И это нормально, что она дает отрицательный результат, сигналы дБ для телефонии, как этот ;-)

5

Мои наблюдения на CTGetSignalStrength() в CoreTelephony является то, что она возвращает значение силы сигнала оператора RSSI(Received Signal Strength Indication). Мои эксперименты с этим возвращают значения между диапазоном 0 - 100, который, я считаю, является «процентным уровнем сигнала» несущей в соответствии с this.

Также IOS не измеряет уровень сигнала в линейном порядке в соответствии с this

Я также заметил, что, даже когда у нас есть 5 баров в строке состояния, значение RSSI не может быть 100.