2013-08-06 3 views
3

Использование беспроводных инструментов для linux в программе c, и я выполнил сетевое сканирование, требующее найти уровень сигнала (дБм) каждой из обнаруженных сетей.Wireless.h Как распечатать уровень сигнала?

Я нашел следующее в wireless.h:

struct iw_quality 
{ 
    __u8  qual;  /* link quality (%retries, SNR, 
         %missed beacons or better...) */ 
    __u8  level;  /* signal level (dBm) */ 
    __u8  noise;  /* noise level (dBm) */ 
    __u8  updated; /* Flags to know if updated */ 
}; 

Я распечатать "уровень" в моей программе C так:

printf("Transmit power: %lu ", result->stats.qual.level); 

также попытался % D , но получил тот же результат.

В результате я получаю номера, которые выглядят как-то 178, 190, 201, 189 и т.д. ...

Есть ли шанс, что эти цифры в ваттах? Согласно преобразователю watt-> dBm, 178 Вт составляет ок. 52,50 дБм?

Что я должен получать вместо этого? Потому что я думал, что dBm переводится на -80dBm или что-то в этом роде.

Нужно ли преобразовывать эти цифры? Как получить правильный результат?

Спасибо!

======= ========= UPDATE

я заметил некоторое странное поведение. Когда я использую свойство уровня wireless.h через свою программу, «самое сильное» значение, которое я записал, составляет -50 дБм, тогда как с тем же маршрутизатором, когда я запускал «iw wlan0 scan», я получаю около -14dBm как самый сильный сигнал.

Кто-нибудь знает, что вызывает эту разницу?

+0

Является ли __u8 неподписанным int? Зачем использовать unsigned int для значения, которое, как ожидается, будет отрицательным?

+0

-80 дБм типичен для мобильной сети, это то, что вы используете? –

+0

@SList Я понятия не имею. __u8 означает, что правильно? Может быть, я ищу неправильный заголовочный файл? Но в нем четко указано, что это для дБм. Я просматриваю точки доступа WiFi, -80, которые я дал, был всего лишь примером. Я просто знаю, что это должно быть отрицательно. – bubbly

ответ

3

Похоже, вы нашли правильный ответ. Для записи это то, что говорит о кодировке source (iwlib.c).

/* People are very often confused by the 8 bit arithmetic happening 
    * here. 
    * All the values here are encoded in a 8 bit integer. 8 bit integers 
    * are either unsigned [0 ; 255], signed [-128 ; +127] or 
    * negative [-255 ; 0]. 
    * Further, on 8 bits, 0x100 == 256 == 0. 
    * 
    * Relative/percent values are always encoded unsigned, between 0 and 255. 
    * Absolute/dBm values are always encoded between -192 and 63. 
    * (Note that up to version 28 of Wireless Tools, dBm used to be 
    * encoded always negative, between -256 and -1). 
    * 
    * How do we separate relative from absolute values ? 
    * The old way is to use the range to do that. As of WE-19, we have 
    * an explicit IW_QUAL_DBM flag in updated... 
    * The range allow to specify the real min/max of the value. As the 
    * range struct only specify one bound of the value, we assume that 
    * the other bound is 0 (zero). 
    * For relative values, range is [0 ; range->max]. 
    * For absolute values, range is [range->max ; 63]. 
    * 
    * Let's take two example : 
    * 1) value is 75%. qual->value = 75 ; range->max_qual.value = 100 
    * 2) value is -54dBm. noise floor of the radio is -104dBm. 
    * qual->value = -54 = 202 ; range->max_qual.value = -104 = 152 
    * 
    * Jean II 
    */ 

level и noise падение в примере 2, и может быть декодирован с броском к подписанному 8-битового значения.

+0

Я использую беспроводные инструменты 29, поэтому в соответствии с этим кодировка не совпадает с нормальными ожиданиями dBm. он говорит, что они между -192 и 63 ?? Как я могу использовать флаг IW_QUAL_DBM для отображения дБм? – bubbly

3

Для будущих записей это было решено из комментариев, благодаря соответствующим людям.

Мне просто нужно было отличить unsigned int к подписанному, и он был решен.

Изменено линию печати на это:

printf("Transmit power: %d ", (int8_t) result->stats.qual.level); 

Теперь значения, которые выглядели как 178, 200 повернулся к -80, -69 и т.д.!

Смежные вопросы