Archivo de la categoría: Práctica

Proyecto Final IoT con Node-RED

Descripción del Proyecto

Proyecto final full stack IoT con Node-RED aplicando los conceptos vistos.

Repositorio: https://github.com/jecrespo/proyecto-fundamentos-iot 

Material del Proyecto

M5stack: https://m5stack.com/collections/m5-core/products/basic-core-iot-development-kit 

M5Stick-C con sensor ENV:

Raspberry Pi Zero: Instalada en local con cámara y programada con Node-RED, usada como dispositivo remoto.

Raspberry Pi 3B+: Instalada en local con Node-RED, Mosquitto y BBDD, usada como servidor.

Wibeee instalado y publicando datos.

Wibeee ONE 2W

Si el alumno tiene algún HW con que quiera interactuar, puede presentarlo y lo integramos en las prácticas.

Esquema del Proyecto

Topología del proyecto IoT:

Datos Disponibles

Topic Map Nodo00 (Enrique):

  • educantabria/nodo00/wemos1/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo00/wemos1/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo00/wemos1/reset – publica mensaje cada reset o inicio
  • educantabria/nodo00/wemos1/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/wemos1/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo00/wemos1/rele – suscrito (1 relé ON, otro valor  relé OFF). Con firmware relé
  • educantabria/nodo00/wemos2/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo00/wemos2/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo00/wemos2/reset – publica mensaje cada reset o inicio
  • educantabria/nodo00/wemos2/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/wemos2/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo00/wemos2/temperatura – publica dato temperatura cada 10 segundos. Con firmware DS18B20
  • educantabria/nodo00/wibeee/# – datos eléctricos de Wibeee. Varios parámetros.
  • educantabria/nodo00/m5atom/aviso – suscrito (“alarma” – leds rojos, “aviso” – leds amarillos, “ok” – leds verdes, otro mensaje apaga)
  • educantabria/nodo00/m5atom/boton – al pulsar publica “press” o “longpress”
  • educantabria/nodo00/m5stack/boton/A – al pulsar botón A publica “press”
  • educantabria/nodo00/m5stack/boton/B – al pulsar botón B publica “press” 
  • educantabria/nodo00/m5stack/boton/C – al pulsar botón C publica “press”
  • educantabria/nodo00/m5stack/led – suscrito (1 dibuja en pantalla círculo rojo, otro valor  dibuja en pantalla círculo verde)
  • educantabria/nodo00/m5stack/text – suscrito, muestra por pantalla el texto
  • educantabria/nodo00/m5stick/temperatura – publica dato temperatura cada 1 segundo
  • educantabria/nodo00/m5stick/humedad – publica dato humedad cada 1 segundo
  • educantabria/nodo00/m5stick/presion – publica dato presión cada 1 segundo
  • educantabria/nodo00/m5stickplus/distancia – publica dato distancia cuando se activa
  • educantabria/nodo00/m5stickplus/button – al pulsar botón publica “press”
  • educantabria/nodo00/m5stickplus/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo00/m5stickplus/label  – suscrito (“red” – circulo rojo, “yellow” – circulo amarillo, “green” – circulo verde, “black” – círculo verde)
  • educantabria/nodo00/raspberry3/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo00/raspberry3/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo00/raspberry3/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo00/raspberry3/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo00/raspberry3/Datos/# – suscrito Node-RED para recibir cualquier dato externo
  • educantabria/nodo00/raspberry3TT/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo00/raspberry3TT/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo00/raspberry3TT/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo00/raspberry3TT/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo00/raspberry3TT/Datos/# – suscrito Node-RED para recibir cualquier dato externo
  • educantabria/nodo00/raspberryzero/tomafotomqtt – suscrito Node-RED un valor cualquiera enviado, toma una foto y publica en el topic educantabria/nodo00/raspberryzero/foto en baja resolución.
  • educantabria/nodo00/raspberryzero/foto – publica Node-RED una foto al mandar cualquier dato en el topic educantabria/nodo00/raspberryzero/tomafotomqtt 
  • educantabria/nodo00/raspberryzero/tomafotoweb suscrito Node-RED un valor cualquiera enviado, toma una foto y la actualiza en https://www.aprendiendoarduino.com/servicios/imagen.jpg en alta resolución

Topic Map Alumnos Nodoxx:

  • educantabria/nodo{xx}/wemos{y}/dato10s – publica mensaje numerado cada 10s
  • educantabria/nodo{xx}/wemos{y}/dato60s – publica mensaje numerado cada 60s
  • educantabria/nodo{xx}/wemos{y}/reset – publica mensaje cada reset o inicio
  • educantabria/nodo{xx}/wemos{y}/led – suscrito (1 led ON, otro valor  led OFF)
  • educantabria/nodo{xx}/wemos{y}/text – suscrito (muestra el mensaje por pantalla)
  • educantabria/nodo{xx}/wemos{y}/rele – suscrito (1 relé ON, otro valor  relé OFF). Con firmware relé
  • educantabria/nodo{xx}/wemos{y}/oled – suscrito (muestra el mensaje por pantalla oled). Con firmware oled
  • educantabria/nodo{xx}/wemos{y}/temperatura – publica dato temperatura cada 10 segundos. Con firmware DS18B20
  • educantabria/nodo{xx}/wemos{y}/matrix – suscrito (0 efecto y apaga, de 1 a 8 ilumina de 1 a 8 líneas de matriz). Con firmware matrix.
  • educantabria/nodo{xx}/raspberry{y}/CPU – publica Node-RED el datos de CPU 
  • educantabria/nodo{xx}/raspberry{y}/Temperatura – publica Node-RED el datos de temperatura procesador
  • educantabria/nodo{xx}/raspberry{y}/Memoria – publica Node-RED el datos de memoria libre
  • educantabria/nodo{xx}/raspberry{y}/Dashboard/# – publica Node-RED cualquier dato del Dasboard
  • educantabria/nodo{xx}/raspberry{y}/Datos/# – suscrito Node-RED para recibir cualquier dato externo

{xx} número de alumno

{y} número de sensor

AlumnoNº Nodo
SERGIO A.nodo01
Alberto B.nodo02
Pablo C.nodo03
Soraya C.nodo03
isaías C.nodo04
Mª del Mar E.nodo05
Santiago F.nodo06
José Ángel G.nodo07
Oscar G.nodo08
MARCOS G.nodo09
Jose Luis G.nodo10
Evelio H.nodo11
Roberto I.nodo12
RAMON L.nodo13
Eduardo P.nodo14
FRANCISCO JAVIER R.nodo15
Sara T.nodo16

Tareas del Proyecto

Fase 1 – Monitorización Local

Instalar nodo con todo el SW:

Instalar los sensores en la ubicación.

Fase 2 – Conectar a la Nube

Conectar sensores:

Fase 3 – Automatizar

Configurar y securizar Node-RED: 

Programar Node-RED y MQTT:

Fase 4 – Integración con Terceros

Integración de datos con terceros:

Material de Prácticas Fundamentos IoT para Formación Profesional

Para el curso on-line “Fundamentos IoT Open Source para Formación Profesional”, el material recomendado por parte de los alumnos para realizarlo es:

  • Nodo Edge/Gateway:
    • Una Raspberry Pi 3B+ (o superior) + tarjeta SD 8Gb (o superior) + alimentador conectada a Internet por alumno.
    • En caso de no tener Raspberry Pi virtualizar Raspberry Pi OS con Virtual Box. (No recomendado)
  • Plataformas IoT:
    • https://thingspeak.com/
    • enriquecrespo.com (S.O. CentOS 8, servidor público con 1 vCPU, 2 GB RAM, 20 GB SSD)
      • Node-RED
      • Mosquitto
      • Grafana
      • Base de Datos: influxDB, etc…
      • Otros servicios públicos
    • aprendiendoarduino.com
      • BBDD MySQL públicas
    • Opcionalmente podrán usarse otras que los alumnos usen o estén interesados como https://thingsboard.io/ 

Node-RED Público

La instancia de Node-RED en enriquecrespo.com es la que va a centralizar los datos de los Node-RED remotos, haciendo de plataforma IoT.

Si algún alumno necesita una instancia de Node-RED pública, se levantará en el servidor enriquecrespo.com

Broker MQTT Público

Se usará un broker común para comunicar todos los dispositivos en la dirección: mqtt://enriquecrespo.com:1883.

Los alumnos recibirán usuario y contraseña para acceder al broker con permisos de lectura y escritura en el topic educantabria/#

Servicios

Base de datos MySQL en https://qaej225.aprendiendoarduino.com/ donde los alumnos podrán usar para almacenar datos. Recibirán por correo las credenciales de acceso.

Grafana en https://enriquecrespo.com:3000/ para representar gráficamente los datos. Recibirán por correo las credenciales de acceso.

Opcionalmente se podrán usar otras bases de datos como influxDB.

Todo el software y documentación utilizado en el curso es libre con licencia creative commons o similar.

Práctica 6: Integración de Datos en Plataforma IoT

Ejercicio 01

Hacer un dashboard para controlar los wemos D1 Mini con el firmware instalado en el curso: https://aprendiendoarduino.wordpress.com/2021/02/20/mqtt-y-esp8266/

El Dashboard tendrá:

  • Un gauge y una gráfica indicando la temperatura de la sonda DS18B20
  • Un pulsador para encender y apagar el led del Wemos D1 Mini
  • Un pulsador para encender y apagar el relé
  • Un Input text o un formulario para mandar mensajes a la pantalla oled
  • Un slider para encender los 8 niveles de la matriz led.

Código: https://github.com/aprendiendonodered/ejercicio11 

Flujo:

Dashboard:

Vídeos solución:

Ejercicio 02

Almacenar en la Base de datos MySQL instalada en la Raspberry Pi en la práctica 1 https://aprendiendoarduino.wordpress.com/2021/02/13/practica-1-instalacion-y-configuracion-raspberry-pi-os/ los datos de temperatura del sensor con el firmware de la práctica 2: https://aprendiendoarduino.wordpress.com/2021/02/15/practica-2-sensorizacion-iot-con-esp8266/

Hacer la lógica para controlar el relé de forma cuando la temperatura sea inferior a 21 grados encienda el relé y lo pare cuando alcance los 23 grados. Cuando el relé se encienda o apague, mandar un correo.

Hacer un dashboard que muestra la temperatura del sensor DS18B20 con un gauge y el estado del relé con un texto.

Código: https://github.com/aprendiendonodered/ejercicio12 

Flujo:

Dashboard:

Vídeos solución:

Ejercicio 03

Capturar foto de Raspberry Pi Zero mediante un botón del dashboard y mostrar la foto en el dashboard.

Tomar foto:

  • publicar un valor cualquiera en el topic educantabria/tomafotomqtt. La foto se publica en el topic educantabria/foto en baja resolución.
  • publicar un valor cualquiera en el topic educantabria/tomafotoweb. La foto se actualiza en https://www.aprendiendoarduino.com/servicios/imagen.jpg en alta resolución.

Hacer dos grupos en el dashboard para los dos métodos de captura de datos.

Código: https://github.com/aprendiendonodered/ejercicio13 

Flujo:

Dashboard: 

Vídeos solución:

Ejercicio 04

Configurar un cliente FTP y un servidor FTP con Node-RED e interactuar entre ellos:

Capturar datos de MQTT publicados en enriquecrespo.com:8883 y guarda los datos en un fichero local usando el nodo file en formato csv usando el nodo csv https://cookbook.nodered.org/basic/generate-csv. Poner un botón en el dashboard y al pulsarlo, mandar los datos del fichero csv con el cliente ftp al servidor y borrar los datos del fichero (inicializarlo).

Para mandar los datos se puede usar el servidor público ftp en enriquecrespo.com: 7021 o un servidor propio con node red o de otro tipo.

Código: https://github.com/aprendiendonodered/ejercicio14 

Flujo:

Dashboard:

Vídeos solución:

Práctica 5: Programar Node-RED, MQTT y Dashboard

Ejercicio 01

Mostrar en el dashboard en un mismo grupo 3 widgets text donde cada segundo actualice el timestamp (epoch time), la fecha usando el nodo node-red-contrib-date y el día y hora en formato, usando el nodo moment para transformarlo.

Código: https://github.com/aprendiendonodered/ejercicio01 

Vídeo solución:

Ejercicio 02

Leer un dato de la temperatura publicado en MQTT y hacer que cuando la temperatura esté fuera de un rango entre 18 y 22 grados, ponga el estado de confort en un elemento del dashboard y mande un email.

Usar el nodo email y ver la información para usarlo: https://flows.nodered.org/node/node-red-node-email 

Código: https://github.com/aprendiendonodered/ejercicio02 

Vídeos solución:

Imágenes:

Ejercicio 03

Hacer un flujo para publicar datos de CPU, Memoria y temperatura de las Raspberry Pi de casa en MQTT en los topics:

  • educantabria/nodoxx/raspberrypi/CPU
  • educantabria/nodoxx/raspberrypi/Memoria
  • educantabria/nodoxx/raspberrypi/Temperatura

Luego hacer que la instancia de Node-RED que las recoja y muestre en el dashboard.

Para publicar los datos de casa, usar el broker MQTT del curso enriquecrespo.com:8883. Opcionalmente usar el broker instalado en la práctica 4: https://aprendiendoarduino.wordpress.com/2021/02/28/practica-4-instalar-configurar-y-securizar-mosquitto-y-node-red-en-raspberry-pi/.

Código Raspberry Pi:

Vídeo 1 con código Raspberry Pi:

Código Node-RED Dashboard:

Vídeo segunda parte:

Dashboard:

Código Total: https://github.com/aprendiendonodered/ejercicio03 

Anexo: Obtener Datos de Raspberry Pi

Código para obtener los datos de Raspberry Pi, usando en nodo exec: 

[{"id":"af22b399.12614","type":"exec","z":"8a81314e.a0f79","command":"vcgencmd measure_temp","addpay":false,"append":"","useSpawn":"","timer":"","name":"RPi Temp.","x":325.2221908569336,"y":46.33333683013916,"wires":[["14f0a295.59181d"],[],[]]},{"id":"408435c9.447fec","type":"exec","z":"8a81314e.a0f79","command":"top -d 0.5 -b -n2 | grep \"Cpu(s)\"|tail -n 1 | awk '{print $2 + $4}'","addpay":false,"append":"","useSpawn":"","timer":"","name":"CPU Load","x":325.2221908569336,"y":126.33333683013916,"wires":[["2c7475c7.6cc01a"],[],[]]},{"id":"8fbcbdf9.549b7","type":"exec","z":"8a81314e.a0f79","command":"free | grep Mem | awk '{print 100*($4+$6+$7)/$2}'","addpay":false,"append":"","useSpawn":"","timer":"","name":"Free Memory","x":325.2222099304199,"y":190.55557250976562,"wires":[["daf6433c.bad81"],[],[]]},{"id":"14f0a295.59181d","type":"function","z":"8a81314e.a0f79","name":"","func":"str = msg.payload\nmsg.payload = str.substring(5,9);\nreturn msg;","outputs":1,"noerr":0,"x":471.888858795166,"y":33.00000190734863,"wires":[["46daa272.4333ac","334a9ddd.345602"]]},{"id":"daf6433c.bad81","type":"function","z":"8a81314e.a0f79","name":"","func":"str = msg.payload\nmsg.payload = parseInt(str.substring(0,str.length - 1));\nreturn msg;","outputs":1,"noerr":0,"x":530,"y":180,"wires":[["1ba39571.ba75ab"]]}]

Código para obtener los datos Raspberry Pi y mandar a MQTT: https://github.com/jecrespo/Curso-Node-RED/blob/master/Monitor%20Raspberry%20Pi/monitor_raspberrypi.json 

Ejercicio 04

Hacer un dashboard para ver la temperatura de todas las Raspberry Pi o de otros elementos publicado en MQTT y sus gráficas. Usar MQTT Explorer para explorar qué datos están publicados.

Opcionalmente hacer varias tabs/pestañas para mostrar: temperaturas, CPU y memoria agrupadas en cada pestaña.

Código: https://github.com/aprendiendonodered/ejercicio04

Vídeos:

Flujo:

Dashboard Final:

Práctica 4: Instalar, Configurar y Securizar Mosquitto y Node-RED en Raspberry Pi

Esta práctica es un paso a paso para instalar, configurar y securizar Mosquitto y Node-RED en Raspberry Pi.

Un ejemplo de cómo usar esta instalación en Raspberry Pi una vez finalizada con Raspberry Pi.

Instalar Mosquitto

Comandos para instalar mosquitto:

  • wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key – Para usar el nuevo repositorio, primero se debe importar la clave de firma del paquete del repositorio
  • sudo apt-key add mosquitto-repo.gpg.key – añade la clave de firma
  • cd /etc/apt/sources.list.d/ – Hacer que el repositorio esté disponible para apt
  • sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list – añadir el nuevo repositorio
  • sudo apt-get update – Actualizar información de apt
  • sudo apt-cache mosquitto – Comprobar paquetes
  • sudo apt-get install mosquitto – Instalar
  • sudo systemctl enable mosquitto.service – Configurar arranque al inicio

Documentación: https://mosquitto.org/blog/2013/01/mosquitto-debian-repository/ 

Configurar Mosquitto

NOTA para mosquitto 2.x: https://mosquitto.org/blog/2020/12/version-2-0-0-released/ 

Mosquitto 2.x ahora es más seguro de forma predeterminada y requiere que los usuarios tomen una decisión activa sobre cómo configurar la seguridad en su broker, en lugar de posiblemente depender del comportamiento anterior muy permisivo, así como eliminar el acceso privilegiado más rápidamente. 

Cuando Mosquitto se ejecuta sin un archivo de configuración, o sin configurar ningún listener, ahora se vinculará a las interfaces de loopback 127.0.0.1 y / o :: 1. Esto significa que solo serán posibles las conexiones desde el host local. 

La ejecución del broker con un listener definido se vinculará de forma predeterminada a 0.0.0.0 / :: y, por lo tanto, será accesible desde cualquier interfaz. 

Todos los listener ahora tienen el valor predeterminado allow_anonymous false a menos que se establezca explícitamente como verdadero en el archivo de configuración. Esto significa que al configurar un listener, el usuario debe configurar un método de control de acceso y autenticación, o establecer allow_anonymous como true.

Documentación: https://mosquitto.org/documentation/migrating-to-2-0/

Para que mosquitto 2.x pueda escuchar en todas las IPs añadir, ejecutar sudo nano /etc/mosquitto/mosquitto.conf y añadir las líneas:

  • # Note that this will not allow anonymous access by default.
  • listener 1883

Para activar el log de mosquito, ejecutar sudo nano /etc/mosquitto/mosquitto.conf y añadir las líneas:

  • # Save all log in file
  • log_dest file /var/log/mosquitto/mosquitto.log
  • log_type all
  • log_timestamp true

Reiniciar mosquitto: sudo systemctl restart mosquitto

NOTA para mosquitto 2.x: hasta no configurar los usuarios, aun no es posible conectarse al Broker fuera del localhost

Autenticación en Mosquitto

Crear fichero de contraseñas con: sudo mosquitto_passwd -c /etc/mosquitto/passwd curso_iot y poner contraseña. Esto crea el usuario curso_iot

Para añadir más usuarios: mosquitto_passwd -b passwordfile curso_iot_2 password Esto crea el usuario curso_iot_2 con la contraseña password

Reiniciar mosquitto: sudo systemctl restart mosquitto

Ahora es posible acceder al broker y probar conexión usando un cliente MQTT como http://mqtt-explorer.com/ 

Autorización en Mosquitto

Los usuarios creados tienen acceso a todos los topics, para limitar los permisos de acceso hay que configurar las ACLs (Listas de acceso).

Crear fichero aclfile:

  • cd /etc/mosquitto
  • sudo nano aclfile 

Añadir este contenido:

# This only affects clients with username 
user curso_iot
topic readwrite #
topic read $SYS/#

user curso_iot_2
topic readwrite curso_iot/#
topic read sololectura/#

# This affects all clients.
pattern write $SYS/broker/connection/%c/state

El usuario curso_iot tiene acceso completo y el usuario curso_iot_2 tiene acceso a los topics curso_iot/# y solo puede leer en los topics sololectura/#

Luego activar el fichero de ACL en la configuración de mosquitto. Ejecutar sudo nano /etc/mosquitto/mosquitto.conf y añadir la línea:

  • acl_file /etc/mosquitto/aclfile

Reiniciar mosquitto: sudo systemctl restart mosquitto

Comprobar con los usuarios creados los permisos usando un cliente MQTT como MQTT Explorer.

Más información sobre la configuración: https://mosquitto.org/man/mosquitto-conf-5.html 

Comunicación Segura

Generar Certificado Autofirmado

Mosquitto proporciona soporte TLS para conexiones de red cifradas y autenticación.

Es muy fácil crear sus propios certificados SSL y claves de cifrado utilizando herramientas de software libre. Estas claves y certificados son tan seguros como los comerciales.

Utilizaremos openssl para crear nuestra propia autoridad de certificación (CA), claves de servidor y certificados.

Estos pasos nos permitirán una conexión encriptada entre el broker MQTT y el cliente MQTT al igual que la que existe entre un cliente del navegador web y un servidor web. En este caso sólo necesitamos un certificado de servidor de confianza en el Cliente.

El servidor/broker necesita: 

  • Certificado CA de la CA (autoridad de certificación) que ha firmado el certificado del servidor en el Broker Mosquitto (ca.crt)
  • Certificado del servidor certificado por la CA. (srv.crt)
  • Clave privada del servidor para el descifrado. (server.key)

Pasos:

  • sudo apt-get install openssl – instalar openssl
  • Crear un directorio llamado certificados en /home/pi con: mkdir certificados y entrar en el directorio para guardar los certificados y claves
  • openssl genrsa -des3 -out ca.key 2048 – Genera una RSA key privada para la CA. Pide contraseña (opción -des3)
  • openssl req -new -x509 -days 1826 -key ca.key -out ca.crt – Crear un certificado para la CA utilizando la clave de la CA que creamos en el paso anterior. Poner en CN el nombre o IP del servidor (p.e. raspberrypi.local o 192.168.1.10)
  • openssl genrsa -out server.key 2048 – Genera una RSA key privada para el servidor que será utilizada por el broker
  • openssl req -new -out server.csr -key server.key – crear una solicitud de certificado .csr. Al rellenar el formulario, el nombre común (CN) es importante y suele ser el nombre de dominio del servidor, el resto se pueden dejar vacíos. Debe utilizar el mismo nombre cuando configure la conexión del cliente. Como somos la CA, no es necesario mandar la solicitud a la CA.
  • openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360 – Utilizar la clave de la CA para verificar y firmar el certificado del servidor. Esto crea el archivo server.crt. Pide la contraseña usada para la ca.key

Con estos pasos hemos obtenido los siguientes ficheros:

  • ca.crt – Certificado de la CA
  • ca.key – Par de claves para la CA. Solo usar para crear un nuevo certificado
  • server.crt – Certificado del servidor firmado por la CA
  • server.csr – Solicitud de certificado. No es necesario.
  • server.key – Par de claves del servidor
  • ca.srl – Cada certificado emitido debe contener un número de serie único asignado por la CA. Debe ser único para cada certificado emitido por una determinada CA. OpenSSL guarda los números de serie utilizados en un archivo, por defecto tiene el mismo nombre que el archivo del certificado de la CA con la extensión sustituida por srl. Así que se crea un archivo llamado ca.srlc

NOTA: Tenga en cuenta que los certificados y las claves creadas pueden utilizarse en el broker/servidor de Mosquitto, y también en un servidor web, por lo que en el manual de Mosquitto se utiliza el término servidor y no broker.

Para ver el contenido de un certificado en texto, porque están codificados en base64, usar: openssl x509 -in server.crt -text -noout

Más información:

Configurar Mosquitto con MQTT sobre TLS

Para configurar el broker mosquitto MQTT para usar la seguridad TLS, seguir los pasos:

  • Copiar los archivos server.crt y server.key en la carpeta /etc/mosquitto/certs. sudo cp server.crt server.key /etc/mosquitto/certs/
  • Copiar el archivo ca.crt en la carpeta /etc/mosquitto/ca_certificates. sudo cp ca.crt /etc/mosquitto/ca_certificates/

Dar permiso a mosquitto para ver el fichero (clave privada) server.key: sudo chown mosquitto:mosquitto server.key (Esto es necesario a partir de la versión 2.0 de Mosquitto)

Configurar fichero configuración mosquitto con sudo nano /etc/mosquitto/mosquitto.conf añadiendo estas líneas en la zona de extra listeners (para mantener acceso simultáneo al puerto 1883 no cifrado y al puerto 8883 cifrado):

listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

Reiniciar el servidor: sudo systemctl restart mosquitto

Por último probar la conexión mediante puerto seguro 8883 desde MQTT Explorer y Node-RED, deshabilitando la opción de verificar certificado.

El fichero final de configuración de mosquitto mosquitto.conf queda:

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /run/mosquitto/mosquitto.pid

listener 1883

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log
log_type all
log_timestamp true

include_dir /etc/mosquitto/conf.d

acl_file /etc/mosquitto/aclfile

listener 8883
cafile /etc/mosquitto/ca_certificates/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

Instalar Node-RED

La instalación recomendada para tener la última version de Node-RED en Raspberry Pi: https://nodered.org/docs/getting-started/raspberrypi

Ejecutar el script (le cuesta unos minutos ejecutarse por completo): 

Iniciar el servicio de Node-RED con: sudo systemctl start nodered.service 

Para ejecutar Node-RED como servicio y que se inicie en el boot de Raspberry PI ejecutar:

  • sudo systemctl enable nodered.service

Para comprobar que funciona abrir un navegador y enterar en: http://{your_pi_ip-address}:1880 

Configurar Node-RED

Para configurar Node-RED ver: https://nodered.org/docs/user-guide/runtime/configuration

El fichero de configuración se encuentra normalmente en $HOME/.node-red/settings.js

Vamos a dejar la configuración por defecto y no vamos cambiar nada, pero es posible añadir las mejoras:

  • logging en un lugar externo fuera de la consola
  • activar proyectos en Node-RED
  • activar almacenamiento persistente de las variables de contexto

Autenticación y Autorización en Node-RED

Por defecto, el editor Node-RED no está protegido: cualquier persona que pueda acceder a su dirección IP puede acceder al editor e implementar cambios.

Para securizar Node-RED a nivel de atenticación y autorización seguir: https://nodered.org/docs/user-guide/runtime/securing-node-red para añadir usuario y password, así como otras configuraciones de seguridad

Instalar node-red-admin (Una herramienta de línea de comandos para administrar remotamente Node-RED):

sudo npm install -g --unsafe-perm node-red-admin

Para habilitar la autenticación basada en usuario y password, descomentar la propiedad adminAuth del fichero de configuración. Editar el fichero settings.js con nano /home/pi/.node-red/settings.js y descomentar estas líneas:

adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4OlKj7wCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        }]
    },

Para calcular la contraseña se usa: node-red-admin hash-pw y una vez cifrada la contraseña pegar en password.

Reiniciar el servicio Node-RED:  sudo systemctl restart nodered.service 

Entrar en Node-RED de nuevo en http://{your_pi_ip-address}:1880 y comprobar que pide contraseña.

Si se quiere añadir un usuario de solo lectura configurar settings.js como:

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "curso_iot",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.YKo98uy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

Reiniciar el servicio Node-RED:  sudo systemctl restart nodered.service

Comprobar que el usuario de solo lectura no puede hacer deploy.

Autenticación UI (Dashboard y Páginas Dinámicas)

Manual: https://nodered.org/docs/user-guide/runtime/securing-node-red#http-node-security

Para proteger las rutas HTTP expuestas por los nodos y el dashboard se puede usar una autenticación básica.

La propiedad httpNodeAuth en su archivo settings.js se puede usar para definir un nombre de usuario y contraseña únicos que podrán acceder a las rutas.

Editar el fichero settings.js con nano /home/pi/.node-red/settings.js y descomentar estas líneas y poner el usuario deseado:

  • httpNodeAuth: {user:»usuario«,pass:»$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.»},

La propiedad pass, usa el mismo formato que adminAuth utilizando el algoritmo bcrypt y la contraseña se puede generar con el comando node-red-admin hash-pw. Para calcular la contraseña se usa: node-red-admin hash-pw y una vez cifrada la contraseña pegar en password.

Reiniciar el servicio Node-RED:  sudo systemctl restart nodered.service 

Entrar en Node-RED de nuevo en http://{your_pi_ip-address}:1880/ui y comprobar que pide contraseña.

Comunicaciones Cifradas TLS Node-RED

Node-RED proporciona soporte TLS para conexiones de red cifradas y autenticación.

No es necesario generar el certificado autofirmado del servidor, porque ya lo hemos hecho para mosquitto y se usa el mismo.

Editar el fichero settings.js con nano /home/pi/.node-red/settings.js y descomentar estas líneas y poner los datos de los certificados:

var fs=require("fs")

https: {
        key: fs.readFileSync('/home/pi/certificados/server.key'),
        cert: fs.readFileSync('/home/pi/certificados/server.crt')
    },
requireHttps: true,

Reiniciar el servicio Node-RED: sudo systemctl restart nodered.service

Entrar en Node-RED de nuevo en https://{your_pi_ip-address}:1880 y comprobar que no funciona http://{your_pi_ip-address}:1880

La web aparecerá como no segura en el navegador, pero se puede añadir el fichero ca.crt como certificado raíz confiable en el ordenador y ya aparecerá como una web segura.