El Arduino Yún es un dispositivo con múltiples ventajas asociadas principalmente a su distribución de Linux integrada. No obstante, es fácil de encontrarse con problemas con la configuración de las redes WiFi. El Yún posee scripts integrados en el Linux side of things para resetear la conexión a WIFI. Está programado para volver al estado Access Point si no encuentra una red inalámbrica previamente configurada en menos de 60 segundos. Lo mismo sucederá si se pierde conexión con la red previamente configurada y no se restablece el enlace en menos de un minuto.
Esto supone varios problemas de estabilidad a largo plazo. En la mayoría de los lugares donde se piensa instalar un Yún no es posible asegurar la conexión a una red WiFi todo el tiempo. Si disponemos de una red inalámbrica, necesitaremos configurar los parámetros de la nueva conexión para poder tener acceso a Internet.
El siguiente artículo representa nuestra solución particular a este problema, donde configuramos una red inalámbrica tipo Access Point y establecemos una conexión por WiFi a una red WAN de forma simultánea.
Modo de funcionamiento del Arduino Yún
En el post Arduino Yún: Configuración Inicial y Primeros Pasos explicamos que inicialmente, el Arduino Yún posee una red inalámbrica denominada ArduinoYún-XXXXXXXXXXX, donde las «X» representan la MAC adress del Arduino. Cuando podemos visualizar esta red entre las redes inalámbricas disponibles se dice que el Arduino está configurado en modo Access Point.
En el modo Access Point podemos conectarnos con el Arduino directamente a través de WiFi, lo cual supone una gran ventaja. Arduino no tendrá acceso a Internet (al menos no desde WiFi), por lo que tendremos que conectarnos a un router inalámbrico que sí posea conexión con Internet.
Una vez conectamos el Arduino a una red inalámbrica, la configuración del Yún cambia al Modo Cliente. En Modo Cliente, la red ArduinoYún-XXXXXXXXXXX desaparece y no es posible comunicarnos con el Arduino de forma directa. Ahora es necesario conectar nuestra computadora a la misma red en la que se encuentra conectado el Arudino. El acceso se dará a través de la IP que se haya asignado al Yún en dicha red.
El siguiente diagrama representa los modos de funcionamiento del Arduino Yún (Access Point y Cliente):
Este comportamiento supone una serie de desventajas:
- Necesitamos conocer la IP del dispositivo, lo cual no siempre es posible dentro de una red inalámbrica. Peor aún si se trata de una red pública.
- El Arduino Yún está configurado para restablecer su configuración y regresar al Modo AP si no es capaz de establecer conexión con la red pre configurada en un periodo menor a un minuto.
- Si el Arduino establece conexión con una red inalámbrica y esta por algún motivo se cae, luego de un minuto perderemos la configuración que habíamos establecido.
- Otra desventaja es la movilidad. Si nos desplazamos de un lugar a otro, para conectar nuestro Arduino a una nueva red WAN tendremos que esperar que pase un minuto o mantener el botón de RST presionado durante más de 7 segundos. Esto es un proceso tedioso que generalmente representa pérdida de tiempo al usuario.
Planteamiento de la solución
Lo ideal sería que una vez que conectemos nuestro Arduino Yún a una red WWAN (Wireless WAN) podamos conservar la capacidad de conectarnos de forma directa al dispositivo a través de WiFi. En Panama Hitek trabajamos mucho con el Arduino Yún, por lo cual nos hemos dispuesto a proponer una solución a esta situación. El siguiente diagrama muestra una ilustración de lo que queremos lograr:
Lo que queremos es estar conectados a un router de forma inalámbrica sin perder la capacidad de conectarnos al Yún directamente como un AP. Antes de proceder con las instrucciones recomendamos visitar el post Arduino Yún: Comunicación inalámbrica por medio de SSH.
El script encargado de restablecer la configuración del WiFi en el Arduino Yún se denomina wifi-live-or-reset. El primer paso para solucionar nuestros problemas es este script. Para esto necesitamos ingresar a la terminal de nuestro Yún y accesamos al archivo rc.local (debemos tener nano instalado) :
1 |
nano /etc/rc.local |
Le agregamos un ‘#’ a la línea ‘wifi-live-or-reset‘. Debemos tener algo parecido a esto:
Esto crea un nuevo problema: ¿Qué pasa si me muevo de oficina y la red WiFi cambia? Nuevamente no se desea tener que restaurar la configuración de la red inalámbrica (presionando el botón WLAN-RST por más de 5s y menos de 30s) para volver a tener el punto de acceso que nos permite configurar una nueva red, ya que esto supone reiniciar el Yún (alrededor de 1 min.).
Para solucionar este nuevo problema crearemos dos redes: una que funcione siempre como punto de acceso y nos permita configurar nuestro Arduino; y otra que sirva de cliente en las redes WiFi que deseemos utilizar.
Configurar red WiFi cliente
Para esto abriremos LUCI y nos dirijiremos a Network>Wifi. Luego clickearemos en ‘Scan‘. De ahí seleccionaremos la red WiFi que deseamos accesar como cliente.
Luego tenemos que ingresar la información de seguridad de la red. Además de eso le daremos el nombre de la nueva interfaz ‘miRedWifi‘ . Puedes darle el nombre que desees, no es de suma importancia.
Al guardar esto se nos presentará otra página en donde veremos estos cambios sin realizar. Solo debemos hacer click en Save & Apply (parte inferior derecha). Con esto tendremos nuestra primera red cliente configurada. Debemos reiniciar nuestro Arduino Yún; esto lo podemos realizar presionando el boton YUN RST.
Luego de esperar que el Arduino Yún inicie, debería de conectarse a la red configurada anteriormente. Nos conectamos a esa red y abrimos nuevamente LUCI. Ahora debemos de crear una nueva red WiFi que funcione como punto de acceso.
Crear red WiFi adicional
Nos vamos nuevamente a Network>Wifi>Add.
Ahora debemos de ingresar datos de la red que deseamos crear. En ESSID pondremos el nombre que veremos cuando nos intentemos conectar a esta red; y seleccionaremos la interfaz lan en Network
Luego hacemos click en la pestaña Wireless Security e ingresamos los datos pertenecientes a la seguridad de nuestra red. En este caso elegí la encriptación WPA2-PSK como se puede apreciar en la siguiente imagen.
Solo tenemos que guardar nuestros cambios. Le damos click a Save & Apply y esperamos un par de segundos a que los cambios se efectúen.
Si todo ha salido bien entonces debería de aparecer una nueva red Wi-Fi con el nombre que le ingresamos anteriormente. Si nos conectamos a esa red e ingresamos a LUCI deberíamos tener algo como esto:
Editar red cliente
Debemos tener en cuenta que si deseamos cambiar la red que utilizamos como cliente, no podemos eliminar o agregar una nueva ya que todo el proceso que hicimos anteriormente se perdería. Para cambiar de red debemos de editar la red cliente que tenemos configurada actualmente. Nos vamos a Network>Wifi>Scan y anotamos los valores que necesitamos: ESSID (nombre de la red) ,BSSID y encriptación.
Luego vamos a Network>Wifi y editamos la red que tenemos configurada como cliente actualmente. Editamos los valores que se han resaltado en las imagenes posteriores: ESSID,BSSID,Encryptation y Key.
Colocaremos los datos de la siguiente forma:
- ESSID: Nombre de la red a la que deseamos conectarnos
- BSSID: El BSSID de la red que deseamos conectarnos. Lo podemos conseguir, como se explicó anteriormente, en la ventana Network>Wifi>Scan.
- Encryptation: También lo podemos encontrar en la ventana de Scan.
- Key: La contraseña de la red a la que deseamos conectarnos.
Luego solo guardamos los cambios (Save & Apply) y el Yún tardará alrededor de 15s en realizar los cambios pertinentes.
Ahora creamos un nuevo problema. Cada vez que el Yun no detecte la red Wi-Fi configurada como cliente entrará en un modo de deshabilitado. Esto se puede prevenir con ciertos comandos UCI, pero tener que hacerlo manualmente derrota las intenciones de este post. Lo que queremos es tener por lo menos una red Wi-Fi siempre habilitada, que sea donde podamos configurar nuestro Yun; y una segunda (que puede estar deshabilitada) para accesar a Internet.
Las ventajas de tener una red conocida a disposición es la posibilidad de configurar nuestro Yun a tráves de LUCI sin tener que encontrar la IP que esta utilizando dentro de la red configurada como cliente (y ya que a veces no podemos entrar con linino.local en algunas redes).
Script en python
El siguiente script ha sido diseñado para permitirnos implementar la solución propuesta. Luego de descargarlo, vamos a editar ciertos archivos. Accesamos a nuestro Yun a tráves de SSH y editamos el archivo rc.local nuevamente:
1 |
nano /etc/rc.local |
Agregamos las siguientes lineas antes de exit 0
1 2 |
rm -f /usr/python-scripts/data.txt /usr/bin/python /usr/python-scripts/checkConnection.py |
Posterior a esto tendremos que crear esta carpeta y mover el script a esta.
1 |
mkdir /usr/python-scripts |
Copiamos el archivo checkConnection.py a la carpeta python-scripts. El script tiene varios parámetros configurables:
1 2 3 |
filename = "/usr/python-scripts/data.txt" => Es el archivo que usaremos para guardar los estados site = "www.google.com" => Sitio que utilizaremos para probar si tenemos conexión a internet reset_network = 5 => Número de veces que se intentara conectar a internet. Luego de esto se deshabilitará la red cliente. |
Opcional: Utilizar los siguientes comandos para descargar el archivo
1 2 |
cd /usr/python-scripts/ && opkg update && opkg install wget && wget -O checkConnection.py https://raw.githubusercontent.com/PanamaHitek/ArduinoYun/master/python-scripts/checkConnection.py chmod 755 checkConnection.py |
Para que nuestro script funcione correctamente debemos crear un trabajo cronometrado (cron job). Para esto utilizaremos nuestro editor de texto favorito (por defecto es vi); en mi caso me gusta utilizar nano . Para habilitar nano como el editor por defecto del archivo de crontab utilizaremos los siguientes comandos:
1 2 |
export EDITOR=nano export TERM=xterm-color |
Luego editaremos la lista de trabajos:
1 |
crontab -e |
Introduciremos la siguiente linea y guardaremos el archivo:
1 |
*/1 * * * * /usr/bin/python /usr/python-scripts/checkConnection.py |
Con esto tendríamos casi todo listo para probar nuestro script. Solo nos falta habilitar cron y hacer que se ejecute cada vez que se inicia el sistema operativo:
1 2 |
/etc/init.d/cron start /etc/init.d/cron enable |
Conclusión
Ahora siempre tendremos una red WiFi a la cual nos podemos conectar. Si falla la conexión a internet en la red cliente intentara re-conectarse dependiendo de la configuración del archivo checkConnection.py. Si no obtenemos conexión a Internet, entonces se deshabilitará la red cliente y el usuario podrá conectarse a la red principal. No se pierden los datos de la red cliente (si se desea volver a intentar conectarse a esa red solo basta con reiniciar el Yun y empezará el conteo nuevamente).
Para configurar otra red debemos de editar la red cliente actual y asignarle los parámetros de BSSID,SSID,Encryption y la clave secreta. Probablemente sea necesario habilitar la radio nuevamente (dándole Enable a tu red en la pestaña Network>Wifi).
Cualquiera duda o consulta, no dude en escribir un comentario! Saludos.