Construyendo un Gateway IoT 6LoWPAN con Raspberry Pi

Como tal vez habrán notado en el Hackerspace San Salvador llevamos varios días trabajando proyectos de IoT con el estándar de comunicaciones inalambricas 802.15.4.

Hasta ahora mucho de nuestro trabajo se ha enfocado a proyectos comerciales que utilizan el sistema operativo Contiki y a varios proyectos educativos en los cuales hemos hecho utilización de los pequeños radios AT86RF233.

Sin embargo, como se imaginarán, conectar directamente dispositivos a internet requiere de un "gateway" que permita agregar conexiones IP entre los pequeños dispositivos y la gran red de Internet.

Actualmente estamos utilizando un Gateway que nos ha provisto uno de nuestros clientes. Sin embargo queríamos tener un Gateway 100% open source, así que en esta entrada vamos a hablar de lo que necesitas para montar tu propio Gateway IoT 802.15.4 con soporte de 6LoWPAN con una Raspberry Pi.

¡Así que Comencemos!



Preparando la Raspberry Pi

Para permitir a tu Raspberry Pi conectarse a redes 802.15.4 debes de contar con los siguientes componentes:

Conectando el Radio a nuestra Raspberry Pi


Si tienes el radio de Openlabs.co conéctalo al puerto GPIO de la Raspberry Pi como se muestra en la siguiente foto (El pin 1 del módulo va en el pin 15 de la Raspberry Pi):



Si tienes la tarjeta de expansión del ATZB-RF-233-1-C del Hackerspace San Salvador conecta los pines de la siguiente manera:

Módulo -> Raspberry Pi
PIN  1 -> PIN 17 (3.3V)
PIN  2 -> PIN 18 (GPIO 24)
PIN  3 -> PIN 24 (GPIO 08)
PIN  4 -> PIN 23 (GPIO 11)
PIN  5 -> PIN 21 (GPIO 09)
PIN  6 -> PIN 19 (GPIO 10)
PIN  7 -> PIN 16 (GPIO 23)
PIN  8 -> PIN 15 (GPIO 22)
PIN  9 -> PIN 03 (GPIO 02)
PIN 10 -> PIN 22 (GPIO 25)
PIN 11 -> PIN 05 (GPIO 03)
PIN 12 -> PIN 25 (Ground)

Importante: De aquí en adelante asumimos que estás familiarizado con utilizar la consola de comandos de tu Raspberry Pi.

Actualizando al software más reciente


Es necesario que cuentes con las últimas versiones del software en tu Raspberry Pi, para ello debes de correr los siguientes comandos:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
Ya que nos encontramos en la consola, debemos instalar las herramientas de desarrollo. Casi todo el software que requerimos se encuentra disponible el repositorio de paquetes de raspbian, pero las herramientas para administración para Wireless-Pan (wpan-tools) no están disponibles (aún) en los repositorios oficiales.

Para instalar el software requerido ejecutamos los siguientes comandos:
sudo apt-get install git autoconf automake libtool
sudo apt-get install libnl-3-dev libnl-genl-3-dev
sudo apt-get install lowpan-tools lowpan-test-tools

Luego clonamos el repositorio con las herramientas wpan:
git clone https://github.com/linux-wpan/wpan-tools

Y corremos los siguientes comandos para configurar e instalar las herramientas:
cd wpan-tools
autoreconf -vif
./configure CFLAGS='-g -O0' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib
make
sudo make install

Con esto deberíamos tener todo el software necesario instalado en nuestra Raspberry Pi.

Habilitando el soporte de radio 802.15.4 en Raspbian


Para habilitar el soporte para el AT86RF233 debemos de asegurarnos de que el kernel de Linux cargue los módulos necesarios esto incluye el soporte para SPI (obligatorio) e I2C (opcional) como los necesarios para hacer funcionar el radio.

Primero editamos el archivo "/boot/config.txt" y nos aseguramos de agregar las siguientes líneas (si no estuvieran agregadas):
sudo nano /boot/config.txt
Debería contener:
dtparam=spi=on
dtparam=i2c1=on
dtparam=i2c_arm=on
dtoverlay=at86rf233

El segundo archivo que debemos editar está en "/etc/modules", nos aseguramos de tener los siguientes módulos habilitados:
sudo nano /etc/modules
Debería contener:
i2c-dev
i2c-bcm2708
spi-bcm2835
at86rf230

Importante: También hemos habilitado el módulo I2C, esto es porque luego esperamos agregar soporte para la dirección MAC incluída con el ATZB-RF-233-1-C.

Llegados a este punto reiniciamos nuestra Raspberry Pi y al arrancar nuevamente ejecutamos el siguiente comando:

lsmod | grep at86

Si todo funcionó bien nos deberá de mostrar algo como lo siguiente:

at86rf230              23648  0 
mac802154              61371  1 at86rf230

En este punto nuestra Raspberry Pi ya posee soporte para conectarse a redes 802.15.4 con 6LoWPAN.

Configurando la interfaz de red para soportar 6LoWPAN


6LoWPAN es un protocolo de red que "abrevia" las direcciones IPv6 para que puedan ser enviadas sobre redes que envían paquetes de datos de tamaño muy pequeño. Esto permite que podamos tener conectividad "IP" estándar en redes que de otra manera requerirían de protocolos propietarios.

Para habilitar nuestra "red" 802.15.4 ejecutamos lo siguiente:

Primero deshabilitamos cualquier interfaz wpan que pueda estar habilitada:
sudo ip link set lowpan0 down
sudo ip link set wpan0 down

Luego configuramos nuestra Personal Area Network (PAN) estableciendo un ID de PAN (Para este ejemplo 0xabcd) y elegimos un canal para comunicarnos (Para este ejemplo el canal 26). Por el momento los drivers disponibles en linux no soportan selección automática de canal, pero podemos cambiar de canal ejecutando el comando nuevamente si fuera necesario.

sudo iwpan dev wpan0 set pan_id 0xabcd
sudo iwpan phy phy0 set channel 0 26
sudo ip link add link wpan0 name lowpan0 type lowpan

Por último levantamos nuestras interfaces de red con el siguiente comando:
sudo ip link set wpan0 up
sudo ip link set lowpan0 up

Podemos utilizar el comando "ifconfig" para ver la configuración de las nuevas interfaces de la siguiente manera:
ifconfig
lowpan0   Link encap:UNSPEC  HWaddr 56-9A-FF-0C-A4-D6-85-F1-00-00-00-00-00-00-00-00  
          inet6 addr: fe80::549a:ff0c:a4d6:85f1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1280  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:3525 (3.4 KiB)

wpan0     Link encap:UNSPEC  HWaddr 56-9A-FF-0C-A4-D6-85-F1-00-00-00-00-00-00-00-00  
          UP BROADCAST RUNNING NOARP  MTU:123  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:300 
          RX bytes:0 (0.0 B)  TX bytes:3350 (3.2 KiB)
¿Por qué dos interfaces de red? Como les comentaba arriba, lo que sucede es que realmente el protocolo IPv6 es "muy grande" para pequeños radios de paquetes como el AT86RF233, así que configuramos otra interfaz "lowpan0" con lo que nos aseguramos que las provisiones de red del kernel de linux se encarguen de hacer la traducción de las direcciones IP de nuestra PAN de manera automática.

Monitoreando la RED


¡Ahora tenemos soporte para IPv6 con 6LoWPAN en nuestra red local IoT! Pero puede ser (como en nuestro caso) que tengamos algunos dispositivos que no son capaces de hablar este protocolo.

Afortunadamente tenemos una forma de colocar nuestro radio en modo "promiscuo" de tal manera que nos permite escuchar todo el tráfico de red.

Esto lo podemos lograr ejecutando los siguientes comandos:
sudo iwpan dev wpan0 del
sudo iwpan phy phy0 interface add monitor%d type monitor
iwpan phy phy0 set channel 0 26
ip link set monitor0 up

Para ver los datos que llegan al radio podemos utilizar WireShark on para este caso tshark (una versión de línea de comandos).

Instalamos tshark y las bibliotecas de soporte de WireShark:

sudo apt-get install tshark wireshark-common
Importante: Al instalar nos preguntrará si queremos habilitar el soporte de monitoreo de paquetes para usuarios dentro del grupo "wireshark" debemos seleccionar "Yes". Esto evitará que tengamos que ejecutar tshark como el usuario root.

Luego debemos de agregar nuestro usuario al grupo wireshark:
sudo usermod -a -G wireshark pi

Importante: Es necesario cerrar la sesión y volver a iniciar para que los cambios se apliquen.

Para visualizar los paquetes que están llegando a nuestra Raspberry Pi y su contenido ejecutamos el siguiente comando:

tshark -xi monitor0

Aquí podemos ver algunos paquetes que estamos recibiendo de otro proyecto que estamos trabajando:


tshark y la interfaz en modo promíscuo nos servirá también para verificar que estamos recibiendo paquetes en nuestra red.

Conclusiones

Ahora que ya tenemos soporte para IEEE 802.15.4 será muchísimo más fácil (y barato) hacer despliegues de redes de IoT sin necesidad de depender de un hardware cerrado y privativo de terceros.

El siguiente paso es trabajar del lado de los nodos IoT y sobre cómo crear pequeñas redes de sensores con soporte para IP utilizando este gateway.

6LoWPAN es una de las tecnologías que más difusión tiene y es la base de muchísimos proyectos comerciales, así que esperamos que esta pequeña entrada pueda facilitar el desarrollo de soluciones para todos los que estén interesados en esta tecnología.

Sin más que agregar a este artículo por ahora: ¡Hasta la Próxima!

Más información y artículos de referencia


Comentarios

Entradas populares de este blog

Reactivando el Blog

Emulando el Raspberry Pi OS con QEMU en Linux

Escribiendo Mensajes al Blockchain de Bitcoin