Tabla de contenido:

MONITOR DE NUBE con AWS y ARDUINO - Electric Boy: 6 pasos
MONITOR DE NUBE con AWS y ARDUINO - Electric Boy: 6 pasos

Video: MONITOR DE NUBE con AWS y ARDUINO - Electric Boy: 6 pasos

Video: MONITOR DE NUBE con AWS y ARDUINO - Electric Boy: 6 pasos
Video: AWS IoT Workshop: Empezando con IoT y AWS (ESP32) 2024, Noviembre
Anonim
MONITOR DE NUBE con AWS y ARDUINO - Electric Boy
MONITOR DE NUBE con AWS y ARDUINO - Electric Boy

Es un proyecto simple: enciende una luz cuando algo sale mal … Cada vez más insensibles a las notificaciones con tantos paneles en nuestras computadoras, ¿cómo podemos asegurarnos de no perdernos los realmente importantes? La respuesta es un indicador de estado físico. O más específico para la tarea, un monitor en la nube, que puede colocarse en su escritorio, siempre a la vista. Como sugiere el nombre, el monitor te ayudará a vigilar la salud de tus servicios en la nube (… o cualquier otra cosa en realidad, el cielo es el límite, perdona el juego de palabras). ¿Incluso tú, como yo, necesitas hacer uno? Incluso si no es así, es posible que tenga una idea para su futuro proyecto de IoT.

Bueno, si estás listo, ¡comencemos!

Paso 1: componentes, suministros, herramientas necesarias, aplicaciones y servicio en línea

COMPONENTES Y SUMINISTROS

_ Arduino Micro e Genuino Micro (1 unidad) … o cualquier pequeño compatible con Arduino - en mi caso, un LeoStick freetronics (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - LED RGB controlado por I2C (1 unidad)

_ Mini luz de nube (1 unidad) … o cualquier otro recipiente translúcido de su elección

_ Cable USB-A a B (1 unidad) … o cualquier cable USB antiguo con un enchufe tipo A

HERRAMIENTAS NECESARIAS

_ Soldador (genérico)

APLICACIONES Y SERVICIO ONLINE

_ Amazon Web Services AWS Lambda (https://aws.amazon.com/it/lambda/)

_ Servicios web de Amazon AWS IoT (https://aws.amazon.com/it/iot/)

Paso 2: hardware

Hardware
Hardware
Hardware
Hardware

La luz nocturna ya viene con un LED incorporado, blanco frío en mi caso. Pensé que sería bueno indicar diferentes estados con diferentes colores. Así que solo conservé la carcasa en forma de nube. Para el cerebro de la operación, elegí el compatible con Arduino más pequeño que tenía disponible: Freetronics LeoStick ha sido mi plataforma de creación de prototipos preferida durante años y tengo muchos repuestos. Viene cargado con cosas buenas: un altavoz piezoeléctrico, dos LED RGB (uno está conectado a la alimentación, aunque RX y TX) y lo mejor de todo es que simplemente puede conectarlo a un puerto USB, sin necesidad de FTDI externo o cable. También es pequeño pero compatible con la placa de pruebas.

¿Por qué no elegí un ESP8266? Para ser verdaderamente inalámbrico, también puede cortar el cable de alimentación, lo que hace que las cosas sean un poco más complicadas para agregar una batería y los inconvenientes de recargar. Dado que el monitor en la nube se ubicará junto a mi computadora, es mucho más fácil usar la alimentación USB. Además, configurar la conexión Wi-Fi no siempre es sencillo. Basado en el ATmega32u4, Arduino Micro y LeoStick comparten la rareza de tener datos I2C en D2 y reloj en D3. Esto se vuelve relevante al conectar el LED BlinkM RGB. A diferencia de las placas Atmega328 comunes, en las que simplemente puede conectar el escudo BlinkM en los encabezados A2.. A5, esto no funcionará aquí (no me molesté con la biblioteca I2C suave).

Al desoldar los conectores macho VCC y GND en el BlinkM, pude extenderlos con cable y mantener todo en un pequeño paquete conectable. El BlinkM tiene su propio microcontrolador a bordo y permite aplicaciones avanzadas: p. Ej. reproducir patrones de color con secuencias de comandos sin un Arduino conectado. Casi siento que un WS2812 (Adafruits NeoPixels son geniales) me habría servido mejor, por desgracia, no tenía ninguno disponible. Para terminar el bit de hardware, corté el extremo opuesto del conector USB macho tipo A, lo enrosqué a través de un orificio pretaladrado cerca de la base de la luz de la nube y soldé los cables al LeoStick (rojo: 5V, blanco: Datos-, verde: Datos +, negro: Tierra).

Paso 3: Arquitectura de la solución

Arquitectura de soluciones
Arquitectura de soluciones
Arquitectura de soluciones
Arquitectura de soluciones

El único requisito fuerte que me impuse fue que el monitor se ejecutara detrás de un firewall. Aunque era una característica crucial, esto hacía que los web hooks para cambios de eventos fueran poco prácticos. Un mecanismo de sondeo es costoso en términos de tráfico TCP y puede retrasar los eventos dependiendo de la frecuencia del sondeo.

La solución se encuentra en WebSockets que proporcionan comunicación full-duplex. El servicio Amazons IoT proporciona un agente de mensajes que admite MQTT a través de WebSockets. Resulta que se puede llamar al servicio sin tener que configurar Cosas, Sombras, Políticas o Reglas.

Hay un SDK de dispositivo disponible para Arduino Yún y se están haciendo algunos esfuerzos para portar el SDK a otras plataformas como el ESP8266. Pero debido a que el monitor siempre estará conectado mediante una interfaz en serie, decidí desde el principio tener una aplicación NodeJS (ejecutada en la computadora de escritorio) para implementar la API del cliente y usar Arduino solo para recibir y mostrar códigos de color. De esa manera, los cambios se pueden realizar fácilmente en JavaScript, sin tener que preocuparse por las cargas de firmware. Para probar se necesita una pequeña infraestructura de ejemplo. Supongamos que tenemos un equilibrador de carga habilitado en las zonas de disponibilidad que realiza comprobaciones de estado en una instancia de servidor web y políticas de escalado automático basadas en la carga de la CPU. La plantilla correspondiente de CloudFormation se puede ▶ ️ ver en Designer o ▶ ️ crearse directamente desde la consola. Nota: algunos de los servicios de esta pila pueden incurrir en cargos.

Amplié la plantilla con propiedades para la función Lambda y los permisos necesarios. Posteriormente, requiera que el punto final de la API REST de IoT se inserte como parámetro. Para automatizar esto, escribí un pequeño script de shell que usa la CLI para solicitar el ARN (> aws iot describe-endpoint) y luego llama a create-stack con el parámetro en línea. O aún puedes hacerlo a mano:

// RETRIVE IoT REST API ENDPOINT

aws iot describe-endpoint

// CREATE STACK> aws cloudformation create-stack --stack-name MiniCloudMonitor --template-body file: //cfn-template.json --parameters ParameterKey = IotRestApiEndpoint, ParameterValue = {IoT_REST_API_ENDPOINT} --capabilities CAPABILITY_NAMED_IAM

// ELIMINAR LA PILA> aws cloudformation delete-stack --stack-name MiniCloudMonitor

Idealmente debería usar los mismos umbrales de alarma que disparan el autoescalado, para llamar también a la función Lambda y así actualizar el estado del monitor. Actualmente, esto solo es posible cuando se usa SNS como intermedio. En ese momento, esta capa adicional se sintió redundante y decidí usar las reglas del ciclo de vida de CloudWatch EC2 para llamar a Lambda directamente. Aún así, quiero explorar la opción de SNS → Lambda en el futuro.

Paso 4: software

Empecé escribiendo el Arduino Sketch. El bucle principal () lee los caracteres de la conexión en serie y crea una cadena hasta que recibe un carácter de nueva línea. Luego se asume que se envió un código de color hexadecimal y se escribe el comando I2C apropiado en el LED BlinkM. No se trata tanto de eficiencia como de conveniencia. Las fuentes completas de este Sketch y otros archivos se pueden obtener en GitHub. A continuación, se muestran algunos fragmentos de código relevantes:

bucle vacío () {

while (Serial.available ()) {

char inChar = (char) Serial.read ();

if (inChar == '\ n') {

número largo = strtol (inputString.c_str (), NULL, 16);

byte r = número >> 16;

byte g = número >> 8 & 0xFF;

byte b = número & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} demás {

inputString + = inChar;

}

}

}

La aplicación NodeJS tiene que implementar interfaces para AWS y Arduino. Posteriormente se puede lograr en solo unas pocas líneas de código cuando se usa el excelente paquete de puerto serie:

var serialport = require ('serialport'); port = new serialport (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

port.on ('abrir', función () {

});

port.on ('error', function (err) {

});

La conexión a AWS IoT tampoco exige mucho esfuerzo. El único problema es saber que el uso de MQTT + WebSockets en el puerto 443 requiere autenticación a través de claves de acceso. El SDK los leerá de las variables de entorno. Puede ser necesario exportar explícitamente AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY.

var awsiot = require ('aws-iot-device-sdk'); var dispositivo = awsiot.device ({

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), región: AWS_REGION, protocolo: 'wss', puerto: 443, debug: verdadero

});

device.on ('conectar', función () {

device.subscribe (MQTT_TOPIC);

});

device.on ('mensaje', función (tema, carga útil) {

if (puerto && carga útil && tema == MQTT_TOPIC) {

var mensaje = JSON.parse (carga útil);

si (mensaje.hasOwnProperty (MQTT_JSON_KEY))

{ regreso;

}

}

});

La función Lambda acepta un código de color como parámetro de entrada; no es bonito, pero es muy flexible en esta etapa. Para poder publicar en el tema MQTT, crea una instancia de un objeto IotData, que requiere el punto final de la API REST de IoT. La plantilla de CloudFormation se encargó de eso durante la creación de la pila.

var AWS = require ('aws-sdk'); var mqtt = new AWS. IotData ({

punto final: process.env. MQTT_ENDPOINT});

export.handler = función (evento, contexto, devolución de llamada) {

var params = {

tema: process.env. MQTT_TOPIC, payload: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (params, function (err, data) {

devolución de llamada (err);

});

};

Paso 5: Conclusión

Realmente disfruté traer un evento virtual "nacido" en la nube al mundo físico. Y como mi pequeño proyecto de mascota fue muy divertido. Para llevar esto al siguiente nivel, consideraría …

  • mejorar la robustez y el manejo de excepciones
  • explorar mejores formas de integrar las métricas de la nube de AWS
  • Experimente con indicadores más físicos como medidores, gráficos de barras, …
  • tiene la opción de mudarse a otras plataformas como Azure, Google, Heroku,…
  • monitorear eventos específicos de la aplicación para Jenkins, GitHub,…

Espero que haya disfrutado de la lectura de esta guía y tal vez incluso haya aprendido algo nuevo en el camino. Si puede pensar en una forma diferente / mejor de hacer las cosas, compártala en los comentarios a continuación. Y, por supuesto, si detecta algún error, le agradeceríamos mucho un aviso. Gracias por tu tiempo.

Recomendado: