Seguridad Wireless - Wifi

Equipos y materiales => Puntos de acceso, routers, switchs y bridges => Openwrt & LEDE => Mensaje iniciado por: neodark en 05-01-2015, 00:35 (Lunes)

Título: ar-5387un openwrt led de nivel de señal
Publicado por: neodark en 05-01-2015, 00:35 (Lunes)
Buenas noches, estoy reclutando routers ar-5387un para los equipos de clientes para una red wifi que quiero montar ya que me parecen un buen aparato, le he instalado openwrt con luci y he asignado los leds dsl e internet para transmisión y recepción de datos respectivamente.

Los configuro en modo cliente y quiero también añadir la particularidad de ver la señal en los leds (para no tener que conectar un pc para orientar la antena)... y he pensado en el led wlan (para dejar el de power y los de lan libres para sus funciones específicas), el caso es que el led de wlan parpadee un número determinado de veces para indicar el nivel de la señal... por ejemplo en una escala del 1 al 4 (1 guiño señal 25%, dos guiños señal 50%, tres guiños señal 75% y 4 guiños señal 100%) con una pausa de 3-4 segundos y vuelve a hacer el ciclo, creo que es una buena idea para no tener que subir un pc y ver la señal del router...
Por lo que, por ejemplo, si la señal es del 30% el led wlan guiñaría 1 vez, pausa de 3-4 segundos y guiñaría otra vez y así periódicamente)... o bien más guiños... del 1 al 10 (teniendo un valor de 10% cada guiño) y sería más exacto el "medidor de señal".

Alguien podría orientarme para poder llevar ésto a cabo? Estoy instalando en los routers OpenWrt Barrier Breaker 14.07-rc3 / LuCI Trunk

Muchas gracias por vuestra ayuda!!
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 05-01-2015, 17:14 (Lunes)
No sé si esta función está disponible en algún paquete instalable por en openwrt

Tu idea es sencilla y útil. Solo puedo indicar 3 formas de hacerlo aunque no inmediatas.

1- mediante script
Ejemplo en: https://forum.openwrt.org/viewtopic.php?id=19738
Esta sería la forma más inmediata pero menos eficiente. El script por supuesto habría que adaptarlo.

2. mediante aplicación binaria
Ejemplo: http://svn.dd-wrt.com/browser/src/router/services/tools/beep.c
Sería más eficiente, pero habría que crear el paquete para openwrt y compilarlo, tambíen supongo requeriría de adaptación.

3. mediante módulo de kernel

Ejemplo: http://lxr.free-electrons.com/source/drivers/leds/trigger/ledtrig-heartbeat.c
La opción ideal, eficiente y limpia, pero tal vez más compleja para quienes no conocen los entresijos del kernel.

Por supuesto yo preferiría siempre la última forma. Si alguien quiere inscribir su nombre en el kernel linux, esta sería una buena forma. Sería algo digno de presumir mejor que llevar pantalones de marca  >:D.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: neodark en 05-01-2015, 23:21 (Lunes)
@danitool muchísimas gracias por tu respuesta, el problema es mi escaso conocimiento en programación, habría algún colaborador que me echase un cable? ya que llevo un par de semanas dando vueltas al tema y no consigo nada.

Gracias!!
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 06-01-2015, 02:41 (Martes)
Enhorabuena por la idea. En cuanto a la forma de llevarla a cabo, me quedo con el script. Más que nada porque no sabría cómo integrar una aplicación binaria en OpenWrt. Y lo del kernel... todavía menos.

Bueno, ahí va el script. (No será muy elegante, pero funciona).

Código: [Seleccionar]
#!/bin/sh
# Noche de Reyes, 2015 :P raphik
# INSTRUCCIONES:
# nombre del fichero: nivel.sh
# - copia este fichero en la carpeta /root del router
# - conviértelo en ejecutable: chmod +x /root/nivel.sh
# - ejecuta el script desde una consola: /root/./nivel.sh
# - para detenerlo: Control+C
#
DSL="/sys/class/leds/AR-5387un:green:dsl/brightness"
ROJ="/sys/class/leds/AR-5387un:red:inet/brightness"
VER="/sys/class/leds/AR-5387un:green:inet/brightness"
echo 0 > $DSL ; echo 0 > $ROJ ; echo 0 > $VER
while true ; do
  X=$(cat /proc/net/wireless |  sed '3q;d' | cut -d \  -f 6 | sed 's/.$//')
  DECENAS=$(( $X / 10 ))
  UNIDADES=$(( $X - $DECENAS * 10 ))
  echo "$X: $DECENAS parpadeos rojos y $UNIDADES verdes"
  sleep 3
  echo 1 > $DSL ; echo 1 > $VER ; sleep 2
  echo 0 > $DSL ; echo 0 > $VER ; sleep 1
  CONTADOR=0
  while [ $CONTADOR -lt $DECENAS ] ; do
    echo 1 > $ROJ ; sleep 1
    echo 0 > $ROJ ; sleep 1
    CONTADOR=$(( $CONTADOR + 1 ))
  done
  CONTADOR=0
  while [ $CONTADOR -lt $UNIDADES ] ; do
    echo 1 > $VER ; sleep 1
    echo 0 > $VER ; sleep 1
    CONTADOR=$(( $CONTADOR + 1 ))
  done
done
exit

El valor que se visualiza es el de la columna "Quality link" del fichero /proc/net/wireless:

Código: [Seleccionar]
root@OpenWrt:~# cat /proc/net/wireless
Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
 face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
 wlan0: 0000   43.  -67.  -256        0      0      0      0     10        0

La secuencia de funcionamiento es la siguiente:
Marca de inicio: Leds DSL e Internet lucen de color verde durante dos segundos.
Decenas: Led Internet parpadea en rojo.
Unidades: Led Internet parpadea en verde.
Marca de parada: Leds DSL e Internet permanecen apagados durante tres segundos.

Ejemplo: Quality link=43. --> cuatro parpadeos rojos y tres verdes:
(http://i.imgur.com/pPXJQlG.gif)

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: Tki2000 en 06-01-2015, 17:27 (Martes)
Muy bueno raphik.
Para utilizar un solo led, yo pondría un parpadeo de 500ms para las decenas, y un parpadeo de 1s para las unidades. De esa forma se podría hacer genérico para cualquier led monocolor, y la cantidad más relevante (las decenas) se vería más rápidamente.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 06-01-2015, 20:31 (Martes)
Para los que han jugado un poco con los scripts combinando con leds, se habrán dado cuenta que es difícil manejar intervalos de menos de 1 segundo porque:

- sleep en openwrt solo acepta 1 segundo como valor más bajo, para solucionarlo habría que compilar con usleep en el busybox. En todo caso bajar de 1 segundo y en tiempos cortos no sería totalmente preciso dependiendo de la complejidad del script y el uso de la CPU

- los triggers del kernel no están pensados para un número determinado de ejecuciones. Se resolvería el problema de intervalos cortos y no precisos, pero aquí tendremos fuera de control el número de parpadeos. Tal vez usando el trigger oneshot diese buenos resultados, pero no viene incluido por defecto en Openwrt.

Yo por mi parte he adaptado el script ejemplo que había del foro de OpenWRT, para que sea algo genérico:

Código: [Seleccionar]
#!/bin/sh


AVLEDS=`ls /sys/class/leds`
ELED=`ls /sys/class/leds|grep -w "$1"`
 
if [ "$#" -ne 1 ] || [ "$ELED" != "$1" ]; then
    printf "\nUSAGE:
    ledwsignal.sh <led name>
    \navailable leds:\n$AVLEDS
    \n\nERROR\n"
    exit 255
fi
 

OLDVAL=0

echo timer > /sys/class/leds/$1/trigger

while [ 1 ]; do

#Getting our signal level from the desired inteface...
REZ=`cat /proc/net/wireless | awk 'NR==3 {print $4}' | sed 's/\-//;s/\.//'`

echo "Signal Level is: $REZ"

MSDELAY=`expr $REZ \* 12`
# Now we HAVE to know it gets better or worse?

if [ $OLDVAL -gt $REZ ]
then
# The signal goes down
echo "Down"
MSDELAY=`expr $MSDELAY - 90`
echo $MSDELAY > /sys/class/leds/$1/delay_on
echo $MSDELAY > /sys/class/leds/$1/delay_off

else if [ $OLDVAL -ne $REZ ]
then
# The signal gets even better
MSDELAY=`expr $MSDELAY + 90`
echo $MSDELAY > /sys/class/leds/$1/delay_on
echo $MSDELAY > /sys/class/leds/$1/delay_off
echo "Up"
else
# We have the same signal as before, we do nothing.
echo "Static"
fi
fi


OLDVAL=$REZ

sleep 3

done

A primera vista este script no parece muy útil, seguro que se puede adaptar mejor... pero seguramente acabaremos encontrándonos con el problema que he descrito antes.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: neodark en 06-01-2015, 23:42 (Martes)
PERFECTOO!! Está perfecto, ahora lo que si "falla" es que el led de power se queda parpadeando en bucle... imagino porque el script sigue funcionando indefinidamente...

Otra idea buena sería usar algún gpio para "puentearlo a negativo" y que comience la función de estado de señal y cuando se quite el "puente" deje de ejecutar el script y así poder quedarse el led de power fijo una vez cargado todo el sistema operativo. Pero es perfecto... ahora no hace falta un pc para orientar "en plan basto" el punto de acceso... Para ajustes muy finos si sería necesario el pc... pero para la función que quiero, es PERFECTO.

Muchas gracias raphik

P.D.: El script de danitool lo he probado y no hace nada.

Un saludo!!
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: Tki2000 en 06-01-2015, 23:52 (Martes)
- sleep en openwrt solo acepta 1 segundo como valor más bajo, para solucionarlo habría que compilar con usleep en el busybox. En todo caso bajar de 1 segundo y en tiempos cortos no sería totalmente preciso dependiendo de la complejidad del script y el uso de la CPU

coreutils-sleep acepta pausas de menos de un segundo. Sólo hay que instalar el paquete y llamar a sleep con /usr/bin/sleep, para que no se llame al sleep de busybox, por defecto.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: Tki2000 en 07-01-2015, 00:01 (Miércoles)
P.D.: El script de danitool lo he probado y no hace nada.

Un saludo!!

El script de danitool mide si la señal mejora o empeora. Si la señal es estática, no hace nada.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: seny en 07-01-2015, 00:50 (Miércoles)
Muy buena idea, otra forma de hacerlo teniendo 2 colores en ciclos de 2 segundos, es que un led se ponga rojo 2 segundos por omisión de señal, conforme sube el nivel esos 2 segundos se acortan para volverse verde proporcionalme, hasta el máximo de señal en que estaria siempre verde.  ;)
saludos
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 07-01-2015, 12:22 (Miércoles)
A primera vista este script no parece muy útil, seguro que se puede adaptar mejor...

El script hace variar la frecuencia de parpadeo del LED cuando la intensidad de la señal cambia, pero la verdad es que mirando el led no percibo esas variaciones. Igual es mi vista, pero echando números... tenemos que para un nivel de señal inicial de -56 dBm, el LED parpadea una vez cada 56*12*2=1344 milisegundos. Si el nivel de señal sube (da igual cuánto), el LED parpadea algo más rápido. Exactamente una vez cada (56*12-90)*2=1164 milisegundos. Es decir, los parpadeos son tan sólo 180 milisegundos más cortos. Me gustaría suponer que se trata de una variación inapreciable para el ojo humano.

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: seny en 07-01-2015, 12:42 (Miércoles)
Para eso el ojo umano necesita un punto de comparación, usando los 2 colores como he propuesto, en tan solo 2 segundos se podran comprobar esas pequeñas variaciones, al procrsador no le suponfria un trabajo tan continuo y el código se simplifica mucho.
saludos

Edito, el punto de comparación lo necesita el cerebro, para procesar esa variación sublime que le llega del ojo :)
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: seny en 07-01-2015, 12:44 (Miércoles)
Para eso el ojo humano necesita un punto de comparación, usando los 2 colores como he propuesto, en tan solo 2 segundos se podran comprobar esas pequeñas variaciones, al procesador no le suponfria un trabajo tan continuo y el código se simplifica mucho.
saludos
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 07-01-2015, 21:32 (Miércoles)
Para eso el ojo umano necesita un punto de comparación, usando los 2 colores como he propuesto, en tan solo 2 segundos se podran comprobar esas pequeñas variaciones, al procrsador no le suponfria un trabajo tan continuo y el código se simplifica mucho.
saludos
Edito, el punto de comparación lo necesita el cerebro, para procesar esa variación sublime que le llega del ojo :)

Niveles de señal de -50 dBm, -56 dBm y -62 dBm.
(http://i.imgur.com/xFwa6pQ.gif)

Los parpadeos son de 1513-487, 1560-440 y 1607-393 (expresados en milisegundos. La primera cantidad para el LED rojo y la segunda para el verde). La diferencia de uno a otro es de tan sólo 47 ms. En la imagen se aprecia la pequeña diferencia que hay entre ellos porque se ven los tres al mismo tiempo.

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 08-01-2015, 11:49 (Jueves)
Retomo la idea original de neodark, en la que proponía 4 estados de visualización dependiendo del nivel de señal.

Los nanostation de ubiquiti creo que son los únicos que tienen implementada la idea de usar leds marcando el nivel de señal (o los primeros en ponerlo en práctica). También usan el concepto de usar cuatro estados de visualización, pero para ellos es sencillo porque usan cuatro leds dedicados.

Resulta que la calidad del enlace en los drivers wifi parece que también va representada por cuatro estados de 0 a 4, aunque 0 supongo que sería sin enlace y nos quedamos con 1, 2, 3, 4. Supongo que es algo extendido (véase móviles y otros aparatos que marcan la señal con cuatro ó cinco rayitas)

Así que he cogido el anterior script, usando este concepto de calidad de señal, transformándolo para intentar hacer diferencias apreciables entre esas 4 calidades de señal. Lo bueno es que sigo usando triggers de kernel, lo cual consigue parpadeos cortos y precisos.

Código: [Seleccionar]
#!/bin/sh


AVLEDS=`ls /sys/class/leds`
ELED=`ls /sys/class/leds|grep -wo -m1 "$1"`
 
if [ "$#" -ne 1 ] || [ "$ELED" != "$1" ]; then
    printf "\nUSAGE:
    ledwsignal.sh <led name>
    \navailable leds:\n$AVLEDS
    \n\nERROR\n"
    exit 255
fi
 

OLDVAL=0

echo timer > /sys/class/leds/$1/trigger

while [ 1 ]; do

  #Getting our signal level from the desired inteface...
  REZ=`cat /proc/net/wireless | awk 'NR==3 {print $3}'|sed 's/\.//'`
 
  echo "Link quality (0-4) is: $REZ"
 
  if [ $OLDVAL -ne $REZ ]; then
      case "$REZ" in
      4) #Best quality
echo 50 > /sys/class/leds/$1/delay_on
echo 50 > /sys/class/leds/$1/delay_off
;;

      3) #Good quality
echo 100 > /sys/class/leds/$1/delay_on
echo 100 > /sys/class/leds/$1/delay_off
;;

      2) #Fair quality
echo 150 > /sys/class/leds/$1/delay_on
echo 150 > /sys/class/leds/$1/delay_off
;;

      1) #Bad quality
echo 250 > /sys/class/leds/$1/delay_on
echo 250 > /sys/class/leds/$1/delay_off
;;

      0) #No link
echo 500 > /sys/class/leds/$1/delay_on
echo 700 > /sys/class/leds/$1/delay_off
;;
      esac
else
# We have the same signal as before, we do nothing.
echo "Static"
fi

OLDVAL=$REZ

sleep 3

done
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: seny en 08-01-2015, 13:34 (Jueves)
@raphik, Puestos así para comparar uno al lado del otro es como si generasen interferencias para apreciarlo, pero reconozco que esto no sirve para apreciar diferencias cercanas al 50% porque el intervalo de 2 segundos es muy largo, donde aprecia más es cuando la señal se acerca al máximo o al mínimo.

@danitool, Creo que es acertado disminuir la escala, encontrando el óptimo entre suficiente información a intervalos lo más cortos posible.

Otra idea, Para controlar variaciones pequeñas se podria comparar en cada ciclo la señal a la anterior para poner un led verde o rojo si sube o baja.
saludos
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 08-01-2015, 15:07 (Jueves)
La Wikipedia (http://es.wikipedia.org/wiki/Indicador_de_fuerza_de_la_señal_recibida), menciona varios índices de potencia según el nivel de la señal recibida (en dBm):
Superior a -40: Enlace perfecto. Se consiguen tasas de transferencias buenas y estables.
De -40 a -60: Enlace bueno. Con un ajuste del TX y Basic Rates se puede asegurar una conexión 80% estable.
De -60 a -70: Enlace normal-bajo. En ocasiones de lluvia y viento puede haber problemas.
De -70 a -80: Señal justa para establecer una conexión. Puede haber problemas de caidas del enlace.

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 08-01-2015, 23:45 (Jueves)
Cierto que el parámetro de calidad de link no sirve en el anterior script, ya que normalmente va de 0 a 70, no de 0 a 4 (que es lo que me indicaba el driver donde hago los tests).

Así que siguiendo tus indicaciones he hecho un nuevo script. Este script es genérico para cualquier router y solo usa un led como indicador:

Código: [Seleccionar]
#!/bin/sh

AVLEDS=`ls /sys/class/leds`
ELED=`ls /sys/class/leds|grep -wo -m1 "$1"`
 
if [ "$#" -ne 1 ] || [ "$ELED" != "$1" ]; then
    printf "\nUSAGE:
    ledwsignal.sh <led name>
    \navailable leds:\n$AVLEDS
    \n\nERROR\n"
    exit 255
fi
 

OLDVAL=0

echo timer > /sys/class/leds/$1/trigger

while [ 1 ]; do

  #Getting our signal level from the desired inteface...
  REZ=`cat /proc/net/wireless | awk 'NR==3 {print $4}' | sed 's/\.//'`
 
  echo "Link quality is: $REZ"

    if [ $REZ -ge -40 -a $REZ -lt 0 ]; then
      REZ=5
    elif [ $REZ -ge -60 -a $REZ -lt -40 ]; then
      REZ=4
    elif [ $REZ -ge -70 -a $REZ -lt -60 ]; then
      REZ=3
    elif [ $REZ -ge -80 -a $REZ -lt -70 ]; then
      REZ=2
    elif [ $REZ -lt -80 ]; then
      REZ=1
    else
      REZ=0
    fi

 
  if [ $OLDVAL -ne $REZ ]; then
      case "$REZ" in
      5) #Best quality
echo 50 > /sys/class/leds/$1/delay_on
echo 50 > /sys/class/leds/$1/delay_off
;;

      4) #Good quality
echo 100 > /sys/class/leds/$1/delay_on
echo 100 > /sys/class/leds/$1/delay_off
;;

      3) #Fair quality
echo 150 > /sys/class/leds/$1/delay_on
echo 150 > /sys/class/leds/$1/delay_off
;;

      2) #Bad quality
echo 250 > /sys/class/leds/$1/delay_on
echo 250 > /sys/class/leds/$1/delay_off
;;

      1) #No link
echo 500 > /sys/class/leds/$1/delay_on
echo 700 > /sys/class/leds/$1/delay_off
;;
      0) #error?
echo 800 > /sys/class/leds/$1/delay_on
echo 80 > /sys/class/leds/$1/delay_off
;;
      esac
  else
# We have the same signal as before, we do nothing.
echo "Static"
  fi

OLDVAL=$REZ

sleep 3

done

de porqué almaceno los intervalos de señal en valores únicos es para poder comparar si caigo de nuevo en el mismo intervalo, ya que si escribo el mismo valor en los triggers que anteriormente había, estos se deshabilitan y deja de parpadear el led

Seguro que habrá formas más elegantes de hacerlo, se aceptan sugerencias  >:D
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 09-01-2015, 00:47 (Viernes)
Yo también he preparado uno para el AR-5687un que hace prácticticamente lo mismo.

Código: [Seleccionar]
#!/bin/sh
#rssi.sh (Received Signal Strenght Indicator)
#2015 :P raphik

LED="/sys/class/leds/AR-5387un:green:dsl"
echo timer > $LED/trigger
RSSI_ANT=-1

while true ; do
  NIVEL=$(cat /proc/net/wireless |  sed '3q;d' | cut -d \  -f 8 | sed 's/.$//')
  #echo "Nivel de señal: $NIVEL"

  if [ $NIVEL -ge -40 ] ; then RSSI=4
  elif [ $NIVEL -ge -60 ] ; then RSSI=3
  elif [ $NIVEL -ge -70 ] ; then RSSI=2
  elif [ $NIVEL -ge -80 ] ; then RSSI=1
  else RSSI=0
  fi

  if [ $RSSI_ANT != $RSSI ] ; then
    case $RSSI in
      4)  echo 1960 > $LED/delay_on ; echo 40 > $LED/delay_off ;;
      3)  echo 960 > $LED/delay_on ; echo 40 > $LED/delay_off ;;
      2)  echo 500 > $LED/delay_on ; echo 500 > $LED/delay_off ;;
      1)  echo 40 > $LED/delay_on ; echo 960 > $LED/delay_off ;;
      0)  echo 40 > $LED/delay_on ; echo 1960 > $LED/delay_off ;;
    esac
    echo "RSSI: $RSSI"
  fi
  RSSI_ANT=$RSSI

  sleep 3
done
exit

Los intervalos de parpadeo son distintos del tuyo. Los he probado en el router y parece que se diferencian bien unos de otros.
(http://i.imgur.com/rXXg2lZ.gif)

Nivel 0: emite un breve destello cada 2s. Está casi apagado.
Nivel 1: emite un breve destello cada segundo.
Nivel 2: medio segundo encendido, medio segundo apagado
Nivel 3: emite un destello largo cada segundo.
Nivel 4: emite un destello largo cada 2s. Está casi encendido.

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: neodark en 09-01-2015, 11:40 (Viernes)
Hola, sois unos makinas!!, éste último de raphik está bastante mejor ya que ves al momento la señal (no hay que esperar y "contar" los tics y colores).

Ahora será un gustazo alinear los routers

Saludos!!
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 09-01-2015, 12:28 (Viernes)
Me gusta tu script raphik, resulta muy compacto, y el parpadeo de los leds resulta muy amigable a la vista.

Sin embargo hay varias cosas que quiero comentar:

Sobre los intervalos de señal RSSI, para gustos colores. Parece que según fabricante, Atheros, Ralink, Realtek, Broadcom, estos intervalos podrían significar cosas diferentes en cuestión de calidad de señal. Véase Realtek que típicamente con una fuerza de señal grande comparado con Atheros tenemos una calidad pobre.

Eché un ojo a lo que considera ubiquiti para sus leds de señal por defecto en sus routers. Me refiero concretamente a estos leds
(http://www.wirmax.it/images/prodotti_immagini/ubnt/Ubiquiti_NS_Led.gif)
Resulta que tenemos estos cuatro umbrales (configurables) que activan la señal, e indican el: malo, regular, bueno, excelente, que por defecto ellos ponen en.
Código: [Seleccionar]
LED1 LED2 LED3 LED4
- 94 - 80 - 73 - 65
Parecen valores bastante conservadores.



 
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 09-01-2015, 20:21 (Viernes)
Bien pues he reescrito de nuevo el script, con algunos cambios menores y esta vez usando los umbrales que usa Ubiquiti en sus dispositivos wifi. Supongo que Ubiquiti tendrá mejor criterio, ya que se dedican a estas cosas.

Código: [Seleccionar]
#!/bin/sh
#Filename: ledwsignal.sh
#Description: This script shows wifi signal strength by blinking one led.
#2015 raphik, danitool

AVLEDS=`ls /sys/class/leds`
ELED=`ls /sys/class/leds|grep -wo -m1 "$1"`
OLD_STRENGTH=-1

Led_On() {
 echo $2 > /sys/class/leds/$1/delay_on
}

Led_Off() {
 echo $2 > /sys/class/leds/$1/delay_off
}

#HELP
if [ "$#" -ne 1 ] || [ "$ELED" != "$1" ]; then
    printf "\nUSAGE:
    ledwsignal.sh <led name>
    \navailable leds:\n$AVLEDS
    \n\nERROR\n"
    exit 255
fi

echo timer > /sys/class/leds/$1/trigger

while true ; do
  RSSI=`cat /proc/net/wireless | awk 'NR==3 {print $4}' | sed 's/\.//'`
  #echo "RSSI: $RSSI"
  
  if [ -z $RSSI ] || [ $RSSI -ge 0 ]; then STRENGTH=0 #error
  elif [ $RSSI -ge -65 ] ; then STRENGTH=4 #excellent
  elif [ $RSSI -ge -73 ] ; then STRENGTH=3 #good
  elif [ $RSSI -ge -80 ] ; then STRENGTH=2 #fair
  elif [ $RSSI -ge -94 ] ; then STRENGTH=1 #bad
  else STRENGTH=0
  fi

  if [ $OLD_STRENGTH != $STRENGTH ] ; then
    case $STRENGTH in
      4)  Led_On $1 1960; Led_Off $1 40 ;;
      3)  Led_On $1 950;  Led_Off $1 50  ;;
      2)  Led_On $1 500;  Led_Off $1 500 ;;
      1)  Led_On $1 50;   Led_Off $1 950  ;;
      0)  Led_On $1 40;   Led_Off $1 1960 ;;
    esac
    echo "STRENGTH (0-4): $STRENGTH"
  fi

OLD_STRENGTH=$STRENGTH

sleep 3
done
exit

El script es genérico, para un solo led y debiera funcionar en cualquier router. Tal vez meta esto en la wiki.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 10-01-2015, 01:42 (Sábado)
Me gusta tu script raphik, resulta muy compacto, y el parpadeo de los leds resulta muy amigable a la vista.

Sin embargo hay varias cosas que quiero comentar:
  • la línea que devuelve la señal
    Citar
    cat /proc/net/wireless |  sed '3q;d' | cut -d \  -f 8 | sed 's/.$//'
    resulta posible que no devuleva nada en algunos casos, ya que cuenta por número de espacios la situación del nivel de señal, y no siempre es 8 (supongo que dependerá de las versiones wifi), en mi caso es 15 y no sale nada con esa línea, así que prefiero awk, ya que no importa el número de espacios y por tanto parece más genérico para cualquier dispositivo.
  • en caso de no haber conexión (sin señal), el script no lo tiene en cuenta, o que se devuelva un valor atípico por error (mayor o igual que ¿0?, improbable pero no imposible), aquí nos daría indicador excelente, cuando sabemos que es imposible tener valores iguales a 0 ó mayores


¡Gracias!

En relación al primer punto que comentas, es verdad, es mejor usar awk que la combinación sed|cut.

Y en relación al segundo, no he considerado que la lectura de /proc/net/wireless devuelva un valor fuera de rango. Pero, puestos en lo peor, ¿y si devolviera caracteres no numéricos?

Por otra parte, aunque no lo comentas, pensaba que rssi y nivel de señal (los famosos dBm) eran dos cosas distintas, cuando en realidad es justamente lo mismo. Ya lo tengo más claro.

Enhorabuena por tu script. Te ha quedado de lujo. En cuanto al ritmo de parpadeo de los LEDs, ¿no prefieres que delay_on + delay_off sea múltiplo de un segundo? En los casos 3 y 1, la suma sube a 1100 ms. Bastaría con ajustar un par de retardos a 950 ms. Ya sé que es una totería, pero me chifla este tipo de chorradas.

Saludos.
Título: Re:
Publicado por: jar229 en 10-01-2015, 11:49 (Sábado)
Pongo 'chincheta' al hilo.
Y en cuanto tenga un Pc a mano, lo añado, al Índice.

Enviado desde uno de mis 'cacharros' usando Tapatalk

Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 10-01-2015, 12:21 (Sábado)
Vale, pues para celebrar la chincheta, pongo un nuevo script.

Esta vez usa un concepto de visualización diferente. La idea es regular el "brillo" del led de forma que brille con más o menos intensidad. Para ello trato de hacer un PWM casero usando el timer en intervalos muy cortos.

Haciendo pruebas parece que el ojo humano (el mío), el encendido/apagado dentro  intervalos de 20 milisegundos es interpretado como disminución o aumento del brillo del led.

Así por tanto el script contempla 5 situaciones:
Señal excelente: brillo total (led permanentemente encendido)
Señal buena: brillo intermedio
Señal regular: brillo bajo
Señal mala: brillo mínimo (el menor que pude conseguir)
Error de señal: led parpadea


Código: [Seleccionar]
#!/bin/sh
#Filename: ledwsignal.sh
#Description: This script shows wifi signal strength by controlling one led brightness
#2015 raphik, danitool

AVLEDS=`ls /sys/class/leds`
ELED=`ls /sys/class/leds|grep -wo -m1 "$1"`
OLD_STRENGTH=-1

Led_On() {
 echo $2 > /sys/class/leds/$1/delay_on
}

Led_Off() {
 echo $2 > /sys/class/leds/$1/delay_off
}

#HELP
if [ "$#" -ne 1 ] || [ "$ELED" != "$1" ]; then
    printf "\nUSAGE:
    ledwsignal.sh <led name>
    \navailable leds:\n$AVLEDS
    \n\nERROR\n"
    exit 255
fi

echo timer > /sys/class/leds/$1/trigger

while true ; do
  RSSI=`cat /proc/net/wireless | awk 'NR==3 {print $4}' | sed 's/\.//'`
  #echo "RSSI: $RSSI"
  
  if [ -z $RSSI ] || [ $RSSI -ge 0 ]; then STRENGTH=0 #error
  elif [ $RSSI -ge -65 ] ; then STRENGTH=4 #excellent
  elif [ $RSSI -ge -73 ] ; then STRENGTH=3 #good
  elif [ $RSSI -ge -80 ] ; then STRENGTH=2 #fair
  elif [ $RSSI -ge -94 ] ; then STRENGTH=1 #bad
  else STRENGTH=0
  fi

  if [ $OLD_STRENGTH != $STRENGTH ] ; then
      if [ $OLD_STRENGTH = 4 ] ; then echo timer > /sys/class/leds/$1/trigger
      fi
      case $STRENGTH in
4)  echo default-on > /sys/class/leds/$1/trigger ;;
3)  Led_On $1 12;  Led_Off $1 8  ;;
2)  Led_On $1 6;  Led_Off $1 14 ;;
1)  Led_On $1 1;   Led_Off $1 19  ;;
0)  Led_On $1 500;   Led_Off $1 500 ;;
      esac
  echo "SIGNAL STRENGTH (0-4): $STRENGTH"
  fi



OLD_STRENGTH=$STRENGTH

sleep 3
done
exit


No sé como se verá el "brillo" en otros routers, ya que cada uno usa leds diferentes. Y como en algunos el brillo del led de por sí es penoso igual ahí el script no produzca diferencias apreciables. O bien cuando la luz del sol incide directamente los cambios de "brillo" también son difíciles de apreciar.

Así que recomiendo probar el script a oscuras  ;D
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 10-01-2015, 12:39 (Sábado)
Sobre los intervalos de señal RSSI, para gustos colores. Parece que según fabricante, Atheros, Ralink, Realtek, Broadcom, estos intervalos podrían significar cosas diferentes en cuestión de calidad de señal.

Los LEDs del Ubiquiti miden la potencia de la señal recibida, que no la calidad del enlace. Para el cálculo de la calidad hay que considerar también el factor ruido.

(http://i.imgur.com/1qr7ou3.jpg)

(http://i.imgur.com/3FOU3WJ.jpg)

En el ejemplo ilustrado por la imagen de arriba, CL1 recibe menos cantidad de señal que CL2. Sin embargo, debido a una fuente próxima de ruido (otros AP, teléfonos inalámbricos, hornos microondas), el enlace de CL1 podría ser de mejor calidad que el de CL2.

Seguro que ya sabes todo esto, pero lo menciono para dejar claro que estamos midiendo la potencia de la señal recibida y no la calidad del enlace.

Saludos.

Este enlace es interesante: http://e2e.ti.com/support/wireless_connectivity/w/design_notes/calculation-and-usage-of-lqi-and-rssi
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 10-01-2015, 13:02 (Sábado)
Está bien dejarlo claro. De hecho varias veces me pasó que con una señal muy grande el enlace ni siquiera conectaba.

Digamos que para disfrutar de una calidad buena de enlace es condición necesaria recibir una buena potencia de señal, pero no suficiente.

Sobre el RSSI, la verdad al comentarlo tú me surgieron dudas de si eso es lo que indica /proc/net/wireless. Y todavía no lo tengo claro, y como cada fabricante/driver hace cosas diferentes... seguiré sin tenerlo.

Quizás no debiera usar el nombre QUALITY en el script. O quizás habría que usar otro parámentro, por ejemplo el mismo que usa Luci en OpenWrt en su icono con rayitas, pero no sé así de forma inmediata que parámetro del kernel usa luci para poner más o menos rayitas.

Edito:  en los dos anteriors scripts reemplacé las cadenas QUALITY por STRENGTH, son los mismos scripts, simplemente con otra nomenclatura para que sea más correcto.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 10-01-2015, 13:29 (Sábado)
Supongo que para evaluar la calidad de un servicio de correos habría que tener en cuenta cuántas cartas llegan a su destino sobre el total de cartas que se envían.

En mi opinión, la calidad de un enlace no debería medirse por la potencia de la señal recibida, sino por la relación entre paquetes que salen de A y paquetes que llegan a B y vicevarsa.

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 10-01-2015, 13:48 (Sábado)
En teoría es tal como lo explicas raphik. Desafortuadamente en la práctica se suelen usar medidores más rudos. Los carteros por cierta experiencia con ellos muchas veces lo que quieren es librarse de la carta/paquete y la entregan de cualquier manera, de forma que disminuye la probabilidad que llegue realmente a su destino. En la oficina seguramente evaluarán que el mejor cartero  es aquél que más cartas despachó en un día sin tener en cuenta si esas cartas llegaron al destino.

Resumiendo el feedback es costoso  >:D.

Ya he editado los scripts para que no aparezca quality en ellos, lo cual es lo correcto.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 11-01-2015, 03:34 (Domingo)
Me parece que estamos mezclando churras con merinas. Es verdad que al orientar una antena conviene conocer el nivel de señal recibida, pero lo que interesa al usuario es saber si verá la Smart TV a trompicones o si navegará por la web con fluidez. Y para esto, tal vez, el indicador óptimo es la velocidad de transmisión.

(http://i.imgur.com/1d3wzWP.jpg)

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: danitool en 11-01-2015, 10:49 (Domingo)
Efectivamente lo que interesa al final de todo es el ancho de banda real conseguido, aunque tal vez más en la recepción de los clientes que en la transmisión, las cuales suelen ser velocidades diferentes.

A veces forzando la velocidad de transmisión a un valor más bajo en nuestro receptor wifi, conseguimos una recepción más alta. Con esto quiero decir que este será un parámetro difícil de evaluar.

También a veces lo que indica el adaptador wireless en cuestión de velocidad no es real. No sería la primera vez que marca 36 Mbit y luego la conectividad resulta que es una castaña (véase realtek), con contínuos cortes cuando intentamos transferir con tasas altas de datos.

La única forma certera en mi opinión para evaluar la calidad del enlace es un test real de descarga de un archivo de punto a punto. Me parece casi inviable en un  script.

En estos scripts simplemente tratamos de tener una referencia para saber si la cosa "pilla o no pilla algo". O bien un indicador que nos dirá si la señal está variando o pasa algo en el chisme wifi  >:D

Personalmente creo que si Ubiquiti usa la fuerza de señal recibida como indicador en sus leds, seguro que es porque no encontraron mejor forma ó más simple. No es que sea fan de una marca u otra, pero instalando un par de nanostations vi que realmente el indicador tiene gran utilidad aunque sea imprecisa en ciertas condiciones.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: seny en 11-01-2015, 18:45 (Domingo)
Se podria parametrizar la funcion para que señale la intensidad o el MCS que indica la velocidad, segun queramos.
O incluso otro parámetro que le diga el led que queremos usar.

El MCS en este router va de 0 a 15 pero en otros puede variar e ir de 0 a 31, ahi se deberia identificar el tipo de wifi y eso ya es mas complicado.
edito:
Pensandolo bien el valor máximo del MCS se podría indicar en el propio parámetro, si es 0 se mide la intensidad de señal y si tiene un valor superior a 0, se indica además de que se quiere medir el MCS,  del valor máximo al que puede llegar en ese router.
Se podria reducir la escala para igualarla a la de intensidad de señal y asi poder usar las mismas rutinas.
saludos
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: uniextra en 17-01-2015, 10:22 (Sábado)
podrias poner un link de descarga a firm asi lo podemos probar otros?
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 19-01-2015, 08:57 (Lunes)
podrias poner un link de descarga a firm asi lo podemos probar otros?
Para probarlo no hay que descargarse ningún firmware. Se trata de un simple script. Si lees el post detenidamente, verás las instrucciones para instalarlo.

Código: [Seleccionar]
# INSTRUCCIONES:
# nombre del fichero: nivel.sh
# - copia este fichero en la carpeta /root del router
# - conviértelo en ejecutable: chmod +x /root/nivel.sh
# - ejecuta el script desde una consola: /root/./nivel.sh
# - para detenerlo: Control+C
#

Saludos.
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: uniextra en 22-01-2015, 21:12 (Jueves)
si lo se, pero a mi este router me va muy mal la wifi por eso te pedia tambien la compilcion q estas usando

gracias
Título: Re: ar-5387un openwrt led de nivel de señal
Publicado por: raphik en 23-01-2015, 09:46 (Viernes)
si lo se, pero a mi este router me va muy mal la wifi por eso te pedia tambien la compilcion q estas usando

La compilación que estoy usando la puedes descargar aquí: download783.mediafire.com/2652wbyjfx0g/73mm22mlz12t4n6/openwrt-AR-5387un-squashfs-cfe.bin
 (http://download783.mediafire.com/2652wbyjfx0g/73mm22mlz12t4n6/openwrt-AR-5387un-squashfs-cfe.bin)
Es la misma que la de este post https://foro.seguridadwireless.net/openwrt/openwrt-en-comtrend-ar5387un/msg322879/#msg322879

Saludos.