Archivo de la etiqueta: wifi

Añadir conexión Wifi a nuestro Arduino

El Internet de la cosas (IoT) a puesto de moda el conectar cualquier cosa a internet. Y nuestros proyectos con arduino no iban a ser menos.

esp8266En el mercado, hay multitud de shield que nos dan la posibilidad de añadir conexión wifi a nuestro arduino, pero estas placas tienen un precio demasiado alto, la mayoría de ellos ha un precio elevado. Estos precios de los sistemas wifi contrastan con el precio habitual que suelen tener los demás accesorios para arduino.

Modulo wifi ESP8266

Pero además de los shield tenemos otros método de poder añadir conectividad wifi a nuestro proyectos de arduino. Este es el modulo Wifi ESP8266 nos ofrece conexión wifi de una manera sencilla y barata.

Ademas de la conexión wifi, este modulo permite una configuración muy fácil mediante el uso de comandos AT, dispone a su vez de un pequeño servidor web, que nos facilitara la conexión a él mediante el uso de un simple navegador.

Conectar el modulo wifi ESP8266 con arduino

La conexión del modulo ESP8266 con arduino es muy simple, solo tendremos que conectar los pines RX y TX del modulo, a los pines RC y TX de muestro arduino, si lo preferimos, como es mi caso, los podemos conectar a cualquier otros pines y utilizar la librería de emulación de comunicaciones serie.

Luego tendremos que conectar el pin marcado como RST a la alimentación de 3.3v de muestro arduino. La alimentación del modulo la tendremos que realizar utilizando un fuente de 3.3 v externa.

La salida de voltaje del arduino solo ofrece una alimentación de 50 mAmp, el modulo wifi ESP8266, en el arranque consume un poco más. Para pruebas podemos conectarlo a la salida de 3.3 v del arduino, pero si tienes la posibilidad de contar con una fuente externa, es mejor que lo conectes a ella. Solo queda conectar el pin GND a la fuente externa o a uno de los pines GND del arduino.

Alimentación mediante arduino del modulo wifi ESP8266
Alimentación a través de Arduino del modulo ESP8266

Circuito con alimentación exterior del modulo wifi.

Conexión modulo wifi ESP8266 con fuente externa
Alimentación del modulo ESP8266 mediante fuente externa

Configuración del modulo wifi ESP8266

La configuración de este modulo es muy parecida a la configuración de los módulos de bluetooth HC-06 o HC-05. Incluso podemos utilizar parte del código que se ha utilizado para conectarse con estos módulos para conectarse con el wifi ESP8266.

Código para leer los datos desde el puesto serie del módulo ESP8266 y escribirlos al puerto serie de la consola, y viceversa.

#include <SoftwareSerial.h>
// Creamos un puerto serie virtual para la conexión con el modulo Wifi
SoftwareSerial Wifi(3, 2); // Pin RX, Pin TX

void setup()
{  
    // Creamos la conexion serie para el control desde la consola
    Serial.begin(9600);
    // Creamos la conexión con el modulo Wifi
    Wifi.begin(115200);
}

void loop()
{
    // Si hay datos desde el modulo Wifi
    if (Wifi.available())
    {
        // Leemos un caracter
        char c = BT1.read() ;
        // Y lo escribimos en el puerto de la consola
        Serial.print(c);
    }
    // Si Hay datos disponibles desde la consola
    if (Serial.available())
    {
        // Leemos un caracter
        char c = Serial.read();
        // Y lo escribimos en el modulo Wifi
        Wifi.print(c);
     }
}

Es simple código nos va ha permitir comprobar el estado de nuestro modulo ESP8266 y realizar las configuraciones básicas.

Comprobar el funcionamiento del modulo Wifi ESP8266

Al arrancar el modulo, este nos tiene que devolver un mensaje de “Ready”

[Vendedor:www.ai-thinker.com Version:0.9.2.4]

ready

Para verificar que tenemos conexión con el modulo, desde la ventana de consola, escribimos AT, si todo es correcto y tenemos conexión con el modulo. Este nos devolverá un “OK”

[Vendedor:www.ai-thinker.com Version:0.9.2.4]

ready AT OK

Este modulo permite 3 modos de funcionamiento:

  • Modo 1: Modo estandar, en este modo de funcionamiento, el módulo se comporta como si fuera un router. Modo servidor.
  • Modo 2: Modo dispositivo / AP, en cambio en este modo, es módulo se comporta como si fuera un dispositivo que se va ha conectar con un router. Modo cliente.
  • Modo 3: Esta forma de funcionamiento, es la mezcla de los dos anteriores. Funciona lo mismo de cliente como de servidor.

Para ver en que modo esta funcionando nuestro ESP8266, le enviamos el siguiente comando AT.

AT+CWMODE?

+CWMODE:3

OK

En este caso, nos indica que esta funcionando en el modo 3. Si no sabemos muy bien como queremos que funcione nuestro modulo ESP8266, lo podemos dejar en este modo para asegurarnos su correcto funcionamiento.

Para cambiar el modo de funcionamiento, le tendremos que enviar el siguiente comando AT.

AT+CWMODE=3

no change

En este caso, como ya estaba en este modo de funcionamiento, no indica que no se ja producido ninguna cambio. Si el modo de funcionamiento no fuese el ya establecido, no devolvería un “OK”.

Conexión con la red wifi con el ESP8266

Mediante otro comando AT, podemos obtener la lista de conexiones wifi al alcance del modulo.

AT+CWLAP
+CWLAP:(1, "MOVISTAR_ASWD", -34, "AA:BB:CC:DD:EE:FF",3)
+CWLAP:(2, "Mi_Conexion", -54, "AA:BB:CC:DD:EE:FF",5)

La información que nos aparece es, posición en la lista, el SSID de la conexión wifi, potencia de la señal, y la MAC del router.

Para conectar el modulo ESP8266, a nuestra red wifi, utilizaremos otro comando AT. En este caso,  el comando AT+CWJAP=”SSID_nuestra_conexión”, “contraseña”

AT+CWJAP="SSID_nuestra_conexión", "contraseña"

OK

Si la conexión se ha realizado con existo, nos devolverá como siempre un “OK”.

Obtener información de nuestra conexión con ESP8266

Al establecer conexión, con nuestro router o el servidor de DHCP que tengamos instalado en nuestra, este le tiene que asignar una dirección IP a nuestro modulo. Para conocer la ip asignado a nuestro modulo wifi utilizaremos el siguiente comando AT.

AT*CIFSR
192.168.1.1
192.168.1.201

OK

Este comando AT nos devolverá, en una primera linea, la dirección ip del router, y en una segunda, la dirección ip que se le ha asignado al modulo.

Activar servidor TCP en el modulo wifi ESP8266

Con esto, ya podríamos conectarnos al ESP8266, pero para poder interactuar con el debemos activar el servidor disponible en modulo. Para activar este servidor volvemos a tirar de comando AT.

AT+CIPSERVER=1, 80

OK

Esto activara el servidor TCP en el puerto 80.

Para desactivar el servidor solo tendremos que repetir el mismo comando cambiado el 1 por un 0.

AT+CIPSERVER=0, 512

OK

Una vez que tengamos el servidor TCP activado en el modulo, podremos interactuar con el estableciendo una conexión en la dirección ip asignada y mediante el puerto activado.

Tabla con los comandos AT disponibles en el modulo wifi ESP8266

Comandos Descripción Tipo Configuración / Ejecución Estado Prueba Parámetros y ejemplos
AT general test basic
AT+RST restart the module basic
AT+GMR check firmware version basic
AT+CWMODE wifi mode wifi AT+CWMODE=<mode> AT+CWMODE? AT+CWMODE=? 1= Sta, 2= AP, 3=both, Sta is the default mode of router, AP is a normal mode for devices
AT+CWJAP join the AP wifi AT+ CWJAP =<ssid>,< pwd > AT+ CWJAP? ssid = ssid, pwd = wifi password
AT+CWLAP list the AP wifi AT+CWLAP
AT+CWQAP quit the AP wifi AT+CWQAP AT+CWQAP=?
AT+ CWSAP set the parameters of AP wifi AT+ CWSAP= <ssid>,<pwd>,<chl>, <ecn> AT+ CWSAP? ssid, pwd, chl = channel, ecn = encryption; eg. Connect to your router: AT+CWJAP=”www.electrodragon.com”,”helloworld”; and check if connected: AT+CWJAP?
AT+CWLIF check join devices’ IP wifi AT+CWLIF
AT+ CIPSTATUS get the connection status TCP/IP AT+ CIPSTATUS <id>,<type>,<addr>,<port>,<tetype>= client or server mode
AT+CIPSTART set up TCP or UDP connection TCP/IP 1)single connection (+CIPMUX=0) AT+CIPSTART= <type>,<addr>,<port>; 2) multiple connection (+CIPMUX=1) AT+CIPSTART= <id><type>,<addr>, <port> AT+CIPSTART=? id = 0-4, type = TCP/UDP, addr = IP address, port= port; eg. Connect to another TCP server, set multiple connection first: AT+CIPMUX=1; connect: AT+CIPSTART=4,”TCP”,”X1.X2.X3.X4″,9999
AT+CIPMODE set data transmission mode TCP/IP AT+CIPMODE=<mode> AT+CIPSEND? 0 not data mode, 1 data mode; return “Link is builded”
AT+CIPSEND send data TCP/IP 1)single connection(+CIPMUX=0) AT+CIPSEND=<length>; 2) multiple connection (+CIPMUX=1) AT+CIPSEND= <id>,<length> AT+CIPSEND=? eg. send data: AT+CIPSEND=4,15 and then enter the data.
AT+CIPCLOSE close TCP or UDP connection TCP/IP AT+CIPCLOSE=<id> or AT+CIPCLOSE AT+CIPCLOSE=?
AT+CIFSR Get IP address TCP/IP AT+CIFSR AT+ CIFSR=?
AT+ CIPMUX set mutiple connection TCP/IP AT+ CIPMUX=<mode> AT+ CIPMUX? 0 for single connection 1 for multiple connection
AT+ CIPSERVER set as server TCP/IP AT+ CIPSERVER= <mode>[,<port> ] mode 0 to close server mode, mode 1 to open; port = port; eg. turn on as a TCP server: AT+CIPSERVER=1,8888, check the self server IP address: AT+CIFSR=?
AT+ CIPSTO Set the server timeout AT+CIPSTO=<time> AT+CIPSTO? <time>0~28800 in second
+IPD received data For Single Connection mode(CIPMUX=0): + IPD, <len>:
For Multi Connection mode(CIPMUX=1): + IPD, <id>, <len>: <data>

Más información sobre el modulo wifi ESP8266: https://www.itead.cc/wiki/ESP8266_Serial_WIFI_Module

Con esto ya tendríamos nuestro arduino conectado a nuestra red wifi, accesible desde cualquier lugar.

Si tienes cualquier sugerencia o duda no tengas ningún reparo en dejarnos tu comentario.

Problema con Aircrack-ng y el fixed channel mon0: -1

Wifi-logoHaciendo pruebas con una nueva tarjeta wifi (TP-LINK TL-WN722N – Adaptador de red USB (3 años de garantía, WPS, alta sensibilidad)), estuve probando si valía para auditorías de redes wifi. Para hacer esto lo habitual es usar el software de Aircrack-ng. Hace mucho que no hacia algo de esto pero con el nuevo chisme me entro el gusanillo.

Problema con Aircrack-ng y el fixed channel mon0: -1

Pero al final del proceso me encontré con una problema con Aircrack-ng, cuando se tiene que enlazar el adaptador al AP para inyectar trafico, me da un error diciendo que el adaptador esta escuchado en el canal -1 y no puede enlazar con el AP (fixed channel mon0: -1).

Pero lo primero voy ha explicar como lo hago, ya que el problema con Aircrack-ng es un problema heredado de todos los pasos, por lo menos en mi caso.

Lo primero que se tiene que hacer es poner el adaptador en modo monitor, esto se puede hacer con el siguiente comando de la suite.

sudo airmon-ng start wlanx

Donde wlanx es el nombre de nuestro dispositivo. Esto nos crea un nuevo interfaces que suele ser mon0 (el 0 puede cambiar si este estuviera ocupado, pasado a 1, 2 3, etc. según el que este libre). Si no sabemos como se llama el adaptador, podemos obtener una lista de todos nuestros adaptadores de red con el siguiente comando.

ifconfig

Este nos devolverá una lista parecida a esta.

lo        Link encap:Bucle local  
          Direc. inet:127.0.0.1  Másc:255.0.0.0
          Dirección inet6: ::1/128 Alcance:Anfitrión
          ACTIVO BUCLE FUNCIONANDO  MTU:65536  Métrica:1
          Paquetes RX:46159 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:46159 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:0 
          Bytes RX:3906175 (3.9 MB)  TX bytes:3906175 (3.9 MB)

wlan2     Link encap:Ethernet  direcciónHW XX:XX:XX:XX:XX:XX  
          Dirección inet6: xxxx::xxxx:xxxx:xxxx:xxxx/64 Alcance:Enlace
          ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:5 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:42 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000 
          Bytes RX:1048 (1.0 KB)  TX bytes:10774 (10.7 KB)

En mi caso el dispositivo es el WLan2.

El siguiente paso seria ver que redes tenemos a nuestro alcance, comando airodump-ng.

sudo airodump-ng mon0

Nos mostrara la lista de redes que tenemos a nuestro alcance.

Una vez que sabemos que red vamos a testear, ejecutamos el comando airodump-ng para que empiece a capturar el trafico de esa red y guardar el trafico en un fichero.

sudo airodump-ng -w fichero_donde_guardamos_el_trafico --bssid (MAC del AP a probrar) -c (Canal del AP) mon0

Y nos mostrara una cabecera parecida a esto.

CH  9 ][ Elapsed: 4 s ][ 2014-12-06 23:04 ][ fixed channel mon0: -1

Y aquí se muestra si vamos ha tener el problema o no. Ya que airodump-ng esta fijando el canal de escucha al -1.

Después de esto solo tendríamos que utilizar aireplay para inyectar trafico para acelerar la recogida de datos (hay varios métodos, dependiendo de la protección de la wifi), la mas básica seria de la siguiente manera.

sudo aireplay-ng -1 10 -e Nombre_del_AP -a (MAC del AP) -h (MAC de nuestro adaptador) mon0

Y hay dependiendo el tipo de adaptador nos puede devolver el siguiente problema.

Waiting for beacon frame (BSSID: XX:XX:XX:XX:XX:XX) on channel -1

En el propio mensaje también nos dice como podemos ignorar este problema.

Couldn't determine current channel for mon0, you should either force the operation with --ignore-negative-one or apply a kernel patch

Quedando el comando de la siguiente forma.

sudo aireplay-ng -1 10 -e Nombre_del_AP -a (MAC del AP) -h (MAC de nuestro adaptador) mon0 --ignore-negative-one

Pero esto a veces no funciona, (como me a pasado) no nos deja enlazarnos al AP. En alguno sitios, explican que hay que instalar unos parches para el núcleo, otros que parchear el driver del adaptador, y no se que mas historias complicadas.

Para mi adaptador TL-WN722N (se junta podo en este adaptador, bueno, bonito y barato). La solución fue mucho más fácil que todo eso.

En vez de poner en modo monitor nuestro adaptador utilizando el comando de aircrack-ng (airmon-ng), solo es necesario ponerlo con los siguientes comandos.

sudo ifconfig wlanx down
sudo iwconfig wlanx mode monitor
sudo ifconfig wlanx up

Lo que hacemos con estos es lo siguiente:

ifconfig wlanx down: Desactivamos nuestro adaptador.

iwconfig wlanx mode monitor: activamos el modo monitor en nuestro adaptador (no me he equivocado es con “W” IWCONFIG)

ifconfig wlanx up: volvemos a activar nuestro adaptador, pero esta vez en modo monitor.

Ahora solo tenemos que poner los siguientes comandos para evitar problema con Aircrack-ng, pero en vez de poner mon0, tendremos que poner el nombre de nuestro adaptador (wlanx).

Y con esto ya tenemos resuelto el problema de “fixed channel mon0: -1”.

No se si esto solo soluciona el problema con mi adaptador en concreto, si tu tienes otro y te ha funciona, o por el contrario no te funciona, puedes dejar un comentario con tu experiencia.

Activar la radio frecuencia de las tarjetas wifi en Linux

Activar la radio frecuencia
Peligro WiFi publicas

Para activar la radio frecuencia de nuestras tarjetas wifi (TP-LINK TL-WN722N – Adaptador de red USB (3 años de garantía, WPS, alta sensibilidad)) solo tenemos que saber:

  1.  como se llama nuestro dispositivo. Para  obtener esta información solo tenemos que escribir en un terminal
    iwconfig

    Este comando nos mostrara todo las tarjetas de red wireless, mostrando algo como esto.

    usuario@equipo:~$ iwconfig 
    eth0      no wireless extensions.
    
    wlan2     IEEE 802.11bg  ESSID:off/any  
              Mode:Managed  Access Point: Not-Associated   Tx-Power=off   
              Retry short limit:7   RTS thr:off   Fragment thr:off
              Power Management:on
              
    lo        no wireless extensions.
  2.  Con la información que nos ofrece en comando sabremos si la radio frecuencia de nuestra tarjeta esta o activada. Para saber el estado de la tarjeta nos tenemos que fijar el la opción “Tx-Power”, si esta indica que es igual a “off”, nuestra tarjeta tiene la radio frecuencia desactivada, de lo contrario nos indicara la potencia de la señal en “dBm”.
  3. Para activar la señal de una determinada tarjeta ejecutaremos el comando anterior con los siguientes parámetros y con privilegio de “root”.
    sudo iwconfig <tarjeta> txpower on

    Donde “tarjeta” escribiremos el nombre que nos ha dado el comando anteriormente, en mi caso quedaría así

    sudo iwconfig wlan2 txpower on
  4.  Si volvemos a ejecutar de nuevo el comando, sin ningún parámetro, nos tendría que devolver algo como esto.
    usuario@equipo:~$ iwconfig 
    eth0      no wireless extensions.
    
    wlan2     IEEE 802.11bg  ESSID:off/any  
              Mode:Managed  Access Point: Not-Associated   Tx-Power=27 dBm   
              Retry short limit:7   RTS thr:off   Fragment thr:off
              Power Management:on
              
    lo        no wireless extensions.
  5.  Para desactivarlo solo tendremos que volver a repetir el mismo comando con los parámetros, pero esta vez, en vez de poner “txpower on” tendríamos que escribir “txpower off”.
    sudo iwconfig wlan2 txpower off

Si lo que queremos es poner nuestro equipo en modo “avión”, es decir, desactivar todos los componentes que tengamos que emitan radio frecuencias (bluetooth, wifi, gprs, etc). Podemos ejecutar el siguiente comando.

rfkill block all

Este, desactivara todos los dispositivos que tengamos funcionando en nuestro ordenador que emitan una radio frecuencia.

Si solo queremos bloquear, por ejemplo, son los dispositivos wifi, los tendremos que  ejecutar el siguiente comando.

rfkill block wifi

Para desbloquear, cambiaremos el parámetro “block” por “unblock”

rfkill unblock wifi

Y esto son una de las opciones que tenemos para activar la radio frecuencia de nuestros dispositivos.

Si este comando no estuviera instalado en nuestro equipo lo podemos instalar de la siguiente forma.

sudo apt-get install rfkill

Si sabes de algún otro método no dudes en compartirlo y deja un comentario.