?>/script>'; } ?> Protocolo UART en Openwrt Widgets Magazine

Autor Tema: Protocolo UART en Openwrt  (Leído 3477 veces)

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

daskoud

  • Visitante
Protocolo UART en Openwrt
« en: 04-12-2016, 13:42 (Domingo) »
Hola buenas,

Quiero pedir algo de ayuda para poder entender lo básico para empezar a trabajar en esto.

Me gustaría saber si es posible hacer que el router mantenga un script activo durante todo el tiempo que este funcionando, a la escucha del puerto RX del puerto serial. Ya que tendré un arduino conectado a este mediante  un divisor de tensión para igualar el voltaje de los 2 puertos y mantener un voltaje de 3.3V.

Navegando por internet he visto mucha gente que crea la opción de hacer una web ubicada en un puerto secundario y en esta se encuentran los botones que hacen ejecutar este script.
En mi caso me gustaría que el propio arduino ejecute el script que necesite. Para ello la única idea que he encontrado es que el router se mantenga en escucha y en caso de haber datos por el puerto este cogerá todo los datos y lo guardara en una $variable (Esta contendrá un comando de script) , pero la pega esta en que el puerto se en modo escucha continuamente y la verdad no se como hacerlo  :(.


Si hay alguna idea por pequeña que sea que me pueda guiar lo agradezco.
« Última modificación: 04-12-2016, 13:45 (Domingo) por daskoud »

danitool

  • Visitante
Re: Protocolo UART en Openwrt
« Respuesta #1 en: 04-12-2016, 14:13 (Domingo) »
Bueno, yo poco experimenté con estas cosas. Puedo dar pequeñas ideas. El caso es que no soy capaz exactamente de lo que quieres lograr, más bien porque no sé como va la cosa del arduino.

Para "escuchar" lo que viene del puerto serie podrías usar cat

Código: [Seleccionar]
cat /dev/ttyS0
Si lo que quieres es que cuando reciba cierta palabra "mágica", se ejecute un script o comando en openwrt podrías combinarlo con awk tal que así

Código: [Seleccionar]
cat /dev/ttyS0 | awk '/magic_word/ { system(reboot)}'
En este caso cuando recibiese la cadena de caracteres magic_word por puerto serie, entonces reiniciaría el sistema.


daskoud

  • Visitante
Re: Protocolo UART en Openwrt
« Respuesta #2 en: 04-12-2016, 15:19 (Domingo) »
Mmm.. Con estos códigos
Código: [Seleccionar]
cat /dev/ttyS0
Código: [Seleccionar]
cat /dev/ttyS0 | awk '/magic_word/ { system(reboot)}'
Y modificando cosas,
Me hago una idea ,pero no estoy seguro si va a funcionar seria lo siguiente, Supongamos que como programador he definido 2 palabras que servirán para hacer trabajar el router:

Código: [Seleccionar]
While true do echo -e (cat /dev/ttyS0) > fichero.txt; if (fichero == magic_word_1) "ejecuta el siguiente comando"; if (fichero == magic_word_2)"ejecuta el siguiente comando"; done
Básicamente estoy metiendo el cat /dev/ttyS0 dentro de un bucle infinito y lo que este lea lo guarde en el fichero.txt auxiliar y depende lo que hay escrito dentro de l fichero, si coincide con algún if entra y ejecuta esta acción y vuelta a empezar.

El problema es saber si esto funcionara, ya que me están surgiendo dudas del comportamiento de los buffers de Tx y Rx del router. Es posible que el registro de rx del router solo contenga 8 bits , esto causaría que el comando cat /dev/ttyS0 pararía al recibir solo un carácter  y de allí saltaría al siguiente comando que seria  if (fichero == magic_word_1) "ejecuta el siguiente comando"; sin haber escrito toda la palabra entera.

Después de todo esto habría que averiguar como poder hacer que el router despierte (Que se encienda)con el script.
« Última modificación: 04-12-2016, 15:22 (Domingo) por daskoud »

danitool

  • Visitante
Re: Protocolo UART en Openwrt
« Respuesta #3 en: 04-12-2016, 16:02 (Domingo) »
bueno, el script que has montado no parece muy funcional.

Si lo que quieres es ejecutar varios comandos en función de las palabras mágicas recibidas todavía puedes usar awk, por ejemplo:

Código: [Seleccionar]
cat /dev/ttyS0 | awk '/magicword1/ { system(reboot)}
                                   /magicword2/ { system(/etc/scripts/enciende_leds}
                                   /magicword3/ { system(/etc/scripts/apaga_leds}'

y no necesitas hacer loop, awk se queda permanentemente buscando las palabras que le pasa cat. Si el gato no muere, awk tampoco.

daskoud

  • Visitante
Re: Protocolo UART en Openwrt
« Respuesta #4 en: 04-12-2016, 16:48 (Domingo) »
Entonces el cat se mantiene activo durante todo el tiempo?, pues no lo sabia XD.

Yo cuando hago cat a un fichero este acaba al terminar de leer todo el fichero, no pensaba que en el el caso de hacer cat /dev/ ttyS0 se mantiene activo todo el rato.


Por otro lado, conoces alguna forma de incrustar el script en el router de tal forma que se active nada mas encenderse?

danitool

  • Visitante
Re: Protocolo UART en Openwrt
« Respuesta #5 en: 04-12-2016, 17:13 (Domingo) »
Entonces el cat se mantiene activo durante todo el tiempo?, pues no lo sabia XD.

Yo cuando hago cat a un fichero este acaba al terminar de leer todo el fichero, no pensaba que en el el caso de hacer cat /dev/ ttyS0 se mantiene activo todo el rato.


Por otro lado, conoces alguna forma de incrustar el script en el router de tal forma que se active nada mas encenderse?
puedes poner el comando en /etc/rc.local, colocale un & al final de la línea para que se quede en segundo plano, Yo metería el comando en un archivo p.ej llamado /etc/scripts/uart-script.sh,
Código: [Seleccionar]
#!/bin/sh
cat /dev/ttyS0 | awk '/magicword1/ { system(reboot)}
                                   /magicword2/ { system(/etc/scripts/enciende_leds}
                                   /magicword3/ { system(/etc/scripts/apaga_leds}'  &>/dev/null &
Aquí he añadido lo de /dev/null para silenciar la salida a consola,  y el ampersand para el segundo plano. Y luego lo haría ejecutarse en rc.local, colocando la ruta del script allí

Código: [Seleccionar]
/etc/scripts/uart-script.sh
También existe la posibilidad de meterlo en /etc/init.d de forma apropiada para que se ejecute como un servicio más, sería la forma más correcta, pero más difícil