?>/script>'; } ?> ar-5387un openwrt led de nivel de señal Widgets Magazine

Autor Tema: ar-5387un openwrt led de nivel de señal  (Leído 19705 veces)

0 Usuarios y 1 Visitante están viendo este tema.

neodark

  • Visitante
ar-5387un openwrt led de nivel de señal
« 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!!
« Última modificación: 05-01-2015, 00:38 (Lunes) por neodark »

danitool

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #1 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.

neodark

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #2 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!!

raphik

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #3 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:


Saludos.
« Última modificación: 06-01-2015, 15:41 (Martes) por raphik »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #4 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.

danitool

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #5 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.

neodark

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #6 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!!

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #7 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.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #8 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.

seny

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #9 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
« Última modificación: 07-01-2015, 00:53 (Miércoles) por seny »

raphik

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #10 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.

seny

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #11 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 :)
« Última modificación: 07-01-2015, 12:49 (Miércoles) por seny »

seny

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #12 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

raphik

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #13 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.


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.
« Última modificación: 08-01-2015, 09:12 (Jueves) por raphik »

danitool

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #14 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

seny

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #15 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

raphik

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #16 en: 08-01-2015, 15:07 (Jueves) »
La Wikipedia, 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.
« Última modificación: 08-01-2015, 21:36 (Jueves) por raphik »

danitool

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #17 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

raphik

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #18 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.


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.
« Última modificación: 09-01-2015, 08:29 (Viernes) por raphik »

neodark

  • Visitante
Re: ar-5387un openwrt led de nivel de señal
« Respuesta #19 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!!