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:
- 1x Raspberry Pi (Preferiblemente 2 o la 3)
- 1x Memoria MicroSD preparada con una versión reciente de Raspbian
- Radio AT86RF233 de Openlabs.co o Tarjeta de expansión para el ATZB-RF-233-1-C
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.txtDeberí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/modulesDeberí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-commonImportante: 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
- 6LoWPAN (Inglés)
- Agregando soporte para IEEE 802.15.4 y 6LoWPAN en Linux (Inglés)
- Radio 802.15.4 de OpenLabs.co
Comentarios