Как определить уровень сигнала несущей программно
Вот код, который я использовал, чтобы узнать уровень сигнала несущей:
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()
точный? Тогда почему он всегда возвращает положительные значения?
5 ответов
getSignalStrength()
показывает отрицательное затухание в дБ, например -(-60) == 60. Вызов отображает его более условно как измерение, меньшее нуля. Да, такие разновидности типичны. Даже в строго контролируемых условиях вы можете получить +/- 20 децибел. Один из способов исправить это - выполнить серию измерений во времени, скажем, каждую секунду, и вести список последних 10 или около того измерений. Затем сообщите среднее значение, медиану или другую статистику. По моему опыту это сильно сокращает вариации. Вы также можете сделать стандартное отклонение, чтобы обеспечить меру надежности.
Мое наблюдение на CTGetSignalStrength()
в CoreTelephony, он возвращает RSSI(Received Signal Strength Indication)
значение силы сигнала несущей. Мои эксперименты с этим возвращают значения в диапазоне 0 - 100, который, как я полагаю, является "силой сигнала в процентах" несущей в соответствии с этим.
Также iOS не измеряет уровень сигнала линейным способом в соответствии с этим
Я также заметил, что, даже если у нас есть 5 баров в строке состояния, значение RSSI не может быть 100.
getSignalStrength()
дает результат в отрицательной шкале. Разницу можно контролировать с помощью фильтра верхних частот.
Вы должны собрать результаты последних 10 наблюдений. На момент добавления нового наблюдения возьмите среднее значение за последние 10 наблюдений. Умножьте это на 0,1. Возьмите текущее значение и умножьте его на 0,9. Добавьте оба. Если общее количество наблюдений превышает 10, удалите самое старое наблюдение для следующего расчета.
Это сделает ваш результат более надежным, и вы также сможете эффективно справляться с внезапными изменениями уровня сигнала.
Я бы порекомендовал читать по децибелам. Следующая ссылка должна помочь. Как читать силу сигнала
Что касается многих сигналов getSignalStrength()
должен использоваться совместно с алгоритмом фильтра верхних частот.
Также убедитесь, что в течение некоторого времени проводилось среднее измерение (10-15 последовательных измерений). И это нормально, что это дает отрицательный результат, сигналы дБ для телефонии такие;-)