Enviar mensajes a Azure IoT Hub desde Raspberry usando Node.js y Docker (parte I – instalación)
Hola de nuevo, hoy les traigo una serie de guías de como configurar todo el ambiente necesario para desarrollar y crear contenedores de Docker dentro de una Raspberry y luego mandar mensajes a Azure IoT Hub en sus diferentes modalidades:
- Device-to-cloud
- Cloud-to-device
Una vez que tengamos todo correctamente configurado, vamos a enviar mensajes “device-to-cloud” a Azure IoT Hub desde un contenedor y luego crearemos otro contenedor para recibir los mensajes que estamos enviando, esto con el fin de demostrar como podemos aprovechar las ventajas de Docker.
¿Por que Azure IoT Hub?
- Azure IoT Hub nos facilita la comunicación bidireccional entre nuestro dispositivo y la nube (device-to-cloud y cloud-to-device).
- Funciona con protocolos como HTTP, AMQP (Advanced Message Queuing Protocol) y transporte de telemetría MQ (MQTT, MQ Telemetry Transport).
- Administración de dispositivos.
- Permite comunicaciones seguras mediante credenciales de seguridad por dispositivo y control de acceso.
- Extensión con otros componentes de Azure.
- Mensajería a gran escala.
Pasos a realizar en esta guía
- Instalación de Docker
- Creación de aplicación de Nodejs
- Automatización de compilación de Docker con Dockerfile
- Compilar aplicación en Docker
- Ejecutar contenedor de Docker
- Probar aplicación en contenedor de Docker
Pre Requisitos
- Raspberry Pi2+
- Raspbian OS
- Conexión a Internet
curl -sSL https://get.docker.com | sh
$ sudo mkdir projects
$ cd projects
$ sudo mkdir azure-iothub-demo
$ cd azure-iothub-demo
{
"name": "rpi-nodejs-azure-iothub",
"version": "1.0.0",
"description": "rpi-nodejs-azure-iothub-demo",
"author": "<your user or email>",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.13.3"
}
}
App.js
'use strict'; const express = require('express'); // Constants const PORT = 8080; // App const app = express(); app.get('/', function (req, res) { res.send('Hello world\n'); }); app.listen(PORT); console.log('Running on http://localhost:' + PORT);
Crear Dockerfile para aplicación de Node.js compatible con ARM
Para automatizar la compilación de nuestro contenedor y pasar los archivos de la app al contenedor, vamos a crear un archivo Dockerfile.
Nota: Raspberry utiliza arquitectura ARM, por lo tanto necesitamos un contenedor especial de Node.js para ARM y Linux.
Dockerfile
FROM robotany/raspberrypi-nodejs
# Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app
# Install app dependencies COPY package.json /usr/src/app/ RUN npm install
# Bundle app source COPY . /usr/src/app
EXPOSE 8080 CMD [ "npm", "start" ]
El contenedor que me funcionó sin ningún problema fue: robotany/raspberrypi-nodejs, lo puedes buscar en: https://hub.docker.com
Creamos archivo .dockerignore en la misma ruta que nuestro Dockerfile para descartar las librerías de Node.js y los logs:
.dockerignore
Compilar contenedor de Docker
Para crear nuestro contenedor de Docker con la aplicación de Node.js, vamos a escribir el siguiente comando:
$ sudo docker build -t yourUser/rpi-nodejs-azure-iothub .
Al ejecutar el comando, se iniciará la tarea de compilación de nuestro contenedor.
Una vez que termine de compilar, vamos a comprobar que el contenedor fue creado correctamente:
$ sudo docker images
Ejecutar contenedor de Docker
Para ejecutar nuestro contenedor de Docker con la aplicación de Node.js, vamos a escribir el siguiente comando, haciendo “forwarding” del puerto de Node.js (8080 –> 49160):
$ sudo docker run -p 49160:8080 -d yourUser/rpi-nodejs-azure-iothub
Al ejecutar el comando, se iniciará la tarea de ejecución de nuestro contenedor exponiendo el puerto 49160.
Una vez que termine de ejecutar, vamos a comprobar que el contenedor corre correctamente
$ sudo docker ps
Probar contenedor de Docker
Como ultimo paso vamos a probar que el contenedor funcione correctamente, recordemos que ahora nuestra aplicación se encuentra aislada en un contenedor y ahora responde al puerto 49160. Solo por demostración, vamos hacer una petición al puerto 8080 y veremos que no responde.
Abrimos el navegador y hacemos una petición a localhost:
Muchas felicidades!! lograste instalar Docker y correr Node.js en una Raspberry. Con esto hemos concluido la primera parte de esta serie de artículos (instalación de Docker con Node.js en Raspberry).
Como siguiente paso, vamos a mandar mensajes (device-to-cloud) desde nuestro contenedor Docker a Azure IoT Hub usando la librería para Node.js de Azure IoT Hub.
Siguientes pasos:
- Enviar mensajes device-to-cloud a Azure IoT Hub desde Raspberry usando Node.js y Docker (parte II – envío de mensajes)
- Enviar mensajes cloud-to-device a Raspberry con Docker, .NET Core y Web App On Linux (parte III - Azure IoT Hub cloud-to-device API)
Saludos!
Comments
Post a Comment