Wireless.h ¿Cómo imprimo el nivel de señal?

Usando herramientas inalámbricas para Linux en un progtwig de CA, e hice un escaneo de red para encontrar la intensidad de la señal (dBm) de cada una de las redes detectadas.

Encontré lo siguiente en el 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 */ }; 

Imprimo el “nivel” en mi progtwig de C así:

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

También probé % d , pero obtuve la misma salida.

El resultado que obtengo son números que parecen algo como 178, 190, 201, 189, etc …

¿Hay alguna posibilidad de que estos números estén en vatios? Según un convertidor de vatios-> dBm, 178 vatios son aprox. 52.50dBm?

¿Qué debo obtener en su lugar? Porque pensé que dBm se traduce a -80dBm o algo así.

¿Necesito convertir esos números? ¿Cómo obtengo la salida correcta?

¡¡Gracias!!

======= ACTUALIZACIÓN =========

Noté un comportamiento extraño. Cuando uso la propiedad level de wireless.h a través de mi progtwig, el valor “más fuerte” que he registrado es de alrededor de -50dBm, mientras que con el mismo enrutador, cuando ejecuté “iw wlan0 scan”, recibo alrededor de -14dBm como el más fuerte. señal.

¿Alguien sabe qué causa esta diferencia?

Parece que has encontrado la respuesta correcta. Para el registro, esto es lo que dice la fuente (iwlib.c) sobre la encoding.

  /* 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 y el noise caen bajo el ejemplo 2, y se pueden decodificar con una conversión a un valor de 8 bits con signo.

Para registro futuro, esto se resolvió a partir de los comentarios, gracias a las personas relevantes.

Simplemente necesitaba lanzar el int sin firmar a uno firmado y se resolvió.

Cambió la línea de impresión a esto:

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

¡Ahora los valores que parecían 178, 200 pasaron a -80, -69, etc.!