Tabla de Contenidos

Raspberry PI: Configuración para IOT

Si quieres hacer experimentos con IOT o simplemente quieres automatizar tu hogar o laboratorio esta es tu guía! En esta guía te explicaré como instalar de cero un sistema headless en tu Raspberry Pi, Mosquitto un broker MQTT y Node Red un auténtico pegamento de tecnologías. Empezamos!

Hardware necesario

Necesitarás una Raspberry Pi, da igual el modelo con tal de que tengas una manera de conectarlo a tu red.

Para que nuestro sistema sea lo más estable posible, lo vamos a conectar mediante cable ethernet. Si quieres conectarlo por wifi hay infinidad de tutoriales en internet.

Aunque orientaremos la guía a Raspberry puedes utilizar otro sistema embebido con pequeños cambios.


Instalación sistema operativo

Vamos a utilizar una versión lite (o reducida) de raspbian para este proyecto, ya que vamos a utilizar la raspi en modo headless, es decir sin utilizar monitor, ratón o demás periféricos.

Esta elección es debida a que la utilizaremos como un servidor, la conectaremos a nuestra red y siempre que trabajemos con ella lo haremos de manera remota desde otro ordenador conectado a la misma red.

  1. Descarga última imagen Lite de Raspbian: https://www.raspberrypi.org/downloads/raspbian/ Yo he utilizado para esta guía Raspbian Stretch Lite versión November 2018
  2. Carga de imagen en SD: podemos utilizar Etcher, es muy sencillo de utilizar, sólo hay que seleccionar cual es nuestra tarjeta sd y la imagen que queremos cargar.
  3. Activar ssh: una vez cargada la imagen, desconectamos la SD del ordenador y la volvemos a conectar. En los siguientes pasos necesitamos conectarnos a la raspi mediante ssh y las últimas versiones lite no lo tienen activado de serie. Para activarlo debemos crear un archivo en la partición boot de la SD, debe estar vacío y tener nombre “ssh” (sin extensión). <note tip>Esto solo activa ssh para el primer arranque! Si apagas la raspi en el proceso tendrás que volver a poner el archivo para poder volver a conectarte</note>
  4. Iniciar por primera vez la raspi: expulsamos la SD del ordenador y la introducimos en la raspi (apagada). La conectamos con cable de red a nuestro router y posteriormente la alimentamos. Una vez hecho esto no deberiamos necesitar volver a tocar físicamente la raspi ^_^

Conexión mediante ssh

A partir de ahora siempre nos comunicaremos con la raspi mediante ssh o posteriormente la interfaz de programación de NodeRed. Pero para poder conectarnos a ella primero debemos encontrarla en nuestra red!

Buscando nuestra raspi

Hay múltiples opciones para encontrar que IP le ha asignado nuestro router. Podemos conectarnos a nuestro router y buscar que dispositivos están conectados o hacer un escaneo de IPs en nuestra red. pero os voy a recomendar una fantástica herramienta open source de Adafruit. El Pi Finder te permite detectar raspis en tu red y hasta conectarte por ssh. Súper recomendable si no quieres complicarte.

Hablemos por ssh

Para conectarnos por ssh tenemos varias opciones.

La más sencilla es utilizar el Pi Finder del anterior apartado, utilizaremos el usuario “pi” y la contraseña por defecto “raspberry” y presionamos el botonaco “Terminal”

Si tu sistema operativo es windows puedes utilizar Putty

Si en cambio usas linux o macOS entra en la terminal y utiliza (sustituyendo las X por la IP de tu raspi):

ssh pi@XXX.XXX.XXX.XXX

Configuración SO

Una vez ya conseguimos estar dentro de la raspi, vamos a configurarla. Haremos los cambios necesarios para que todo funcione correctamente.

IP fija

Debido a que vamos a instalar un broker de MQTT y que posteriormente conectaremos nuestros dispositivos IOT a dicho broker vamos a configurar una ip fija a nuestra raspi. Mira en que rango de IPs tiene tu red, puede ser de la forma 192.168.0.XX. Elige una IP que esté libre en tu red y que te sea fácil de recordar (el rango suele ir de 0 a 255). Yo utilizaré por ejemplo la 192.168.0.210.

  1. Una vez conectados por ssh vamos a editar el archivo de configuración de dhcp:
    sudo nano /etc/dhcpcd.conf
  2. Vete al final del archivo y añade lo siguiente sustituyendo las XX por la IP que quieras que tenga la raspi si tu router no está en la ip 192.168.0.1 cámbialo también ;
    interface eth0
    static ip_address=XXX.XXX.XXX.XXX/24
    static routers=192.168.0.1
    static domain_name_servers=192.168.0.1 
  3. Presiona “Control + X” para salir y luego “Y” para guardar las modificaciones.
  4. Reinicia la raspi con
    sudo reboot
  5. La conexión ssh se cortará, espera un minuto a que se reinicie la raspi y prueba a hacer ssh a tu pi con la nueva ip
    ssh pi@192.168.0.XXX

Raspi-config

Ahora utilizaremos este comando para configurar varios aspectos de la raspi.

  1. Ejecutamos el comando
    sudo raspi-config
  2. Cambiar nombre de red: Nos movemos con los cursores del teclado y seleccionando con enter. No cambies por ahora el password, lo haremos en otro paso. Seleccionamos la opción “Network options” y luego “Hostname” esto es para cambiar el nombre de la raspi visible en la red, es recomendable por seguridad que no se vea claramente que es una raspi.
  3. Cambiar huso horario: seleccionamos “Localisation Options” y luego “Change Timezone” y selecciona tu área geográfica y una ciudad correspondiente a tu uso horario (para España, Madrid)
  4. Activar definitivamente SSH: con esto ya no necesitas meter más el archivo vacío “ssh”. Vamos a “Interfacing Options” y luego “SSH”
  5. Expandir partición: con esto expandimos la partición para que utilice toda la SD. Vamos a “Advanced Options” y luego “Expand Filesystem”
  6. Salimos dando a “Finish” y reiniciamos. Se cerrará la conexión ssh, espera un minuto y vuelve a conectarte

Actualización del sistema

Aunque descargamos la última versión de la web, habrá actualizaciones intermedias del sistema, vamos a asegurarnos que tenemos todo con la última versión.

  1. Actualizamos repositorios
    sudo apt-get update
  2. Actualizamos sistema
    sudo apt-get upgrade

Eliminar usuario pi y crear nuevo usuario

Por seguridad evitaremos utilizar el usuario pi por lo que crearemos un nuevo usuario con un nuevo password.

  1. Crear nuevas claves ssh y añadir usuario: utilizamos los siguientes comandos uno a uno (cambiando “USERNAME” por el nombre de usuario que quieras) nos pedirá una nueva contraseña de usuario de la raspi
    sudo rm /etc/ssh/ssh_host* 
    sudo ssh-keygen -A
    sudo adduser USERNAME
    sudo adduser USERNAME sudo
    sudo reboot
  2. Al reiniciar se nos cierra la conexión ssh, ahora nos volvemos a conectar por ssh, pero en vez de utilizar el usuario “pi” a partir de ahora utilizaremos siempre el nuevo usuario que hemos creado
    ssh USERNAME@192.168.0.XXX

<note tip>Como hemos cambiado las claves de ssh en el anterior paso, el ordenador lo detectará y a lo mejor tienes que eliminar la clave antigua en un fichero de tu sistema. En mac se soluciona poniendo en la terminal “nano /Users/TUUSUARIO/.ssh/known_hosts” y eliminando la linea de la ip de tu raspi</note>

  1. Eliminar usuario pi: una vez reconectados por ssh eliminaremos el usuario pi con el siguiente comando:
    sudo deluser --remove-home pi

Utilizar TMPFS

Las raspis hacen un uso intensivo de las memorias sd por lo que suele pasar que al poco tiempo se suelen estropear. Por ello utilizaremos el sistema TMPFS que utiliza la memoria ram para evitar este problema.

  1. Modificamos el archivo fstab:
    sudo nano /etc/fstab
  2. Añadimos al final del archivo:
    tmpfs    /tmp               tmpfs   defaults,noatime,nosuid,size=30m                    0 0
    tmpfs    /var/tmp           tmpfs   defaults,noatime,nosuid,size=30m                    0 0
    tmpfs    /var/log           tmpfs   defaults,noatime,nosuid,mode=0755,size=30m          0 0
    tmpfs    /var/spool/mqueue  tmpfs   defaults,noatime,nosuid,mode=0700,gid=1001,size=30m 0 0

Instalación de Mosquitto

MQTT es un protocolo de comunicación de mensajes entre máquinas muy adecuado para IOT. Funciona con un sistema de publicación/suscripción. De manera muy simplificada los dispositivos publican en la red su información y a los que les interese escuchar esa información se pueden suscribir para poder recibirla. Tiene características muy interesantes como el QoS o calidad de servicio o la posibilidad de que los dispositivos dejen un “testamento” que se activa cuando desaparecen de la red. No me lío más y vamos a instalar Mosquitto, un broker de MQTT que se encargará de este tipo de mensajes en nuestra red.

sudo apt-get install mosquitto mosquitto-clients

Securizando Mosquitto

Vamos a crear un usuario y password para Mosquitto.

  1. Nos vamos al directorio de Mosquitto
    cd /etc/mosquitto/
  2. Añadimos un usuario, nos pedirá primero el password del usuario de la raspi y luego que introduzcamos el password para el usuario de Mosquitto (sustituye USERNAME por el nombre de usuario que quieras)
    sudo mosquitto_passwd -c passwordfile USERNAME
  3. Si en un futuro quieres añadir otro usuario puedes usar:
    sudo mosquitto_passwd -b passwordfile USERNAME
  4. Si quisieras eliminar un usuario puedes usar:
    sudo mosquitto_passwd -D passwordfile USERNAME
  5. Sin salir del la carpera /etc/mosquitto modificaremos el archivo mosquitto.conf
    sudo nano mosquitto.conf
  6. Para obligar a usar un usuario y especificar donde está el archivo de password añadimos las siguientes líneas al final del archivo
    allow_anonymous false
    password_file /etc/mosquitto/passwordfile

Reinicio automático en caso de fallo

  1. Primero paramos el servicio y eliminamos lo que ya había
    sudo systemctl stop mosquitto
    sudo update-rc.d mosquitto remove
    sudo rm /etc/init.d/mosquitto
  2. Ahora modificamos el archivo mosquitto.service
    sudo nano /etc/systemd/system/mosquitto.service
  3. Y añadimos las siguientes líneas
    [Unit]
    Description=Mosquitto MQTT Broker daemon  
    ConditionPathExists=/etc/mosquitto/mosquitto.conf  
    AfteR=network.target
    Requires=network.target
    
    [Service]
    Type=simple  
    ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf   
    Restart=always
    
    [Install]
    WantedBy=multi-user.target 
  4. Y por último relanzamos todo
    sudo systemctl daemon-reload
    sudo systemctl enable mosquitto
    sudo systemctl start mosquitto.service

Instalación Node Red

Ahora instalaremos Node Red, con este auténtico pegamento de tecnologías podremos editar el comportamiento de nuestro sistema de una manera muy sencilla e intuitiva. La interfaz de Node Red es una página web que te servirá la raspi y desde donde puedes realizar toda la gestión y programación de tu sistema.

Realizar la instalación de Node Red y todas las aplicaciones que necesita para funcionar es muy sencillo gracias a un script que se encarga de todo, sólo hay que lanzar:

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Versión actualizada (marzo 2020):

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Securizando Node Red

Node red por defecto no necesita usuario y contraseña, pero es muy importante por seguridad, por lo que instalaremos un complemento para que sólo se pueda entrar después de autentificarse. Además utilizaremos https para que cuando trabajemos con nuestra interfaz de Node Red, toda la información viaje por nuestra red interna de manera cifrada.

  1. Nos vamos a la carpeta de Node Red
    cd ~/.node-red
  2. Ahora instalamos el complemento node-red-admin mediante npm
    sudo npm install -g node-red-admin

    <note tip>Puede que te salgan errores durante este paso, pero es normal y debería funcionar todo igual ^_^</note>

  3. Generamos un hash con nuestro password de node red ( ejecuta, pon el password que quieras para Node Red y cuando te lo dé cópialo para despues)
    node-red-admin hash-pw
  4. Ahora generaremos un certificado ssl local para nuestro https con los siguientes comandos (cuando te pida datos puedes poner lo que quieras ya que el certificado va a ser local. No pueden estar todos en blanco)
    cd ~/.node-red/
    openssl genrsa -out privatekey.pem 1024
    openssl req -new -key privatekey.pem -out private-csr.pem
    openssl x509 -req -days 365 -in private-csr.pem -signkey privatekey.pem -out certificate.pem
  5. Ejecutaremos Node Red para ver que funciona y generar el archivo settings.js
    node-red
  6. Una vez ponga algo como “[info] Server now running at http://127.0.0.1:1880/” pulsamos Control+C para parar la ejecución
  7. Ahora modificaremos el archivo de configuración de Node Red
    nano settings.js
  8. Busca y descomenta eliminando las dobles barras de:
    var fs = require("fs");
  9. Busca y descomenta la siguiente sección, y después coloca el nombre de usuario que quieras y el hash del password que copiaste antes
    adminAuth: {
        type: "credentials",
        users: [{
                 username: "user",
                 password: "COPIED HASH",
                 permissions: "*"
               }]
    },
  10. Busca, descomenta y modifica las siguientes líneas (sustituye USERNAME por el nombre de tu usuario de la raspi)
    https: {
    	        key: fs.readFileSync('/home/USERNAME/.node-red/privatekey.pem'),
    	        cert: fs.readFileSync('/home/USERNAME/.node-red/certificate.pem')
    	    },
  11. Ahora comprobaremos que todas las modificaciones que hemos hecho funcionan, inicia Node red
    node-red
  12. Cuando ponga algo como “[info] Server now running at http://127.0.0.1:1880/” nos vamos a nuestro navegador y entramos en la dirección “https://192.168.0.XXX:1880” sustituyendo para que apunte a la IP de nuestra raspi
  13. Qué pasada! si todo ha ido bien podrás ver la pantalla de login, pon tu usuario y contraseña de Node Red y si entras sin problemas reprime tus instintos de cacharreo, cierra la web y a continuación en tu terminal ssh pulsa Control+C para parar Node Red, aun no hemos terminado! Pero ya queda poco :)

Inicio automático de Node Red con PM2

Casi todos los tutoriales recomiendan utilizar systemctl para iniciar Node Red, pero yo he tenido bastantes problemas por lo que recomiendo probar con PM2. Sólo tienes que ejecutar los siguientes comandos

sudo systemctl disable nodered.service
sudo npm install -g pm2
pm2 start node-red
pm2 save
pm2 startup

Ya está! Ya puedes comenzar a cacharrear con Node Red y MQTT, hay muchos tutoriales por internet para hacer cosas chulísimas. En esta página podras encontrar tanto “Flows” o flujos como complementos que puedes instalar en tu Node Red, la visitarás muy a menudo! https://flows.nodered.org

Por último te puedo recomendar un chat de Telegram sobre Node Red en castellano : https://t.me/nodered

A disfrutarlo!