Taula de continguts:

CLOUD MONITOR With AWS & ARDUINO - Electric Boy: 6 Passos
CLOUD MONITOR With AWS & ARDUINO - Electric Boy: 6 Passos

Vídeo: CLOUD MONITOR With AWS & ARDUINO - Electric Boy: 6 Passos

Vídeo: CLOUD MONITOR With AWS & ARDUINO - Electric Boy: 6 Passos
Vídeo: Home Automation using AWS IOT & ESP32 | IoT Cloud that companies use for Home Automation 2024, De novembre
Anonim
CLOUD MONITOR amb AWS & ARDUINO - Electric Boy
CLOUD MONITOR amb AWS & ARDUINO - Electric Boy

És un projecte senzill: enceneu la llum quan alguna cosa no funciona … Cada cop ens adormiu cap a les notificacions amb tants taulers de control als nostres ordinadors, com podem assegurar-nos que no ens perdin els realment importants. La resposta és un indicador d’estat físic. O més específic de la tasca, un Cloud Monitor, que pot seure a l’escriptori, sempre a la vista. Com el seu nom indica, el monitor us ajudarà a vigilar la salut dels vostres serveis al núvol (… o qualsevol altra cosa realment, el cel és el límit, disculpeu el joc de paraules). Fins i tot vosaltres, com jo, heu de fer-ne un? Encara que no, és possible que tingueu una idea per al vostre futur projecte IoT.

Bé, si esteu preparats, comencem!

Pas 1: components, subministraments, eines necessàries, aplicacions i servei en línia

COMPONENTS I SUBMINISTRAMENTS

_ Arduino Micro i Genuino Micro (1 unitat) … o qualsevol petit Arduino compatible - en el meu cas un freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - LED RGB controlat I2C (1 unitat)

_ Mini llum de núvol (1 unitat) … o qualsevol altre vas translúcid que trieu

_ Cable USB-A a B (1 unitat) … o qualsevol cable USB antic amb endoll tipus A.

ES NECESSITEN EINES

_ Soldador (genèric)

APLICACIONS I SERVEI EN LÍNIA

_ Serveis web d'Amazon AWS Lambda (https://aws.amazon.com/it/lambda/)

_ Amazon Web Services AWS IoT (https://aws.amazon.com/it/iot/)

Pas 2: maquinari

Maquinari
Maquinari
Maquinari
Maquinari

La llum de la nit ja ve amb un LED incorporat - blanc fred en el meu cas. Vaig pensar que seria bo indicar un estat diferent per colors diferents. Així que només vaig mantenir la carcassa en forma de núvol. Per al cervell de l’operació, vaig triar el més petit Arduino compatible que tenia disponible: el Freetronics LeoStick ha estat la meva plataforma de prototipatge preferida durant anys i tinc molts recanvis. Ve carregat de coses bones: un altaveu piezoelèctric, dos LED RGB (un està lligat a l’energia, RX i TX, però) i el millor de tot és que només podeu connectar-lo a un port USB, no necessiteu cap cable ni FTDI extern. També és petit però compatible amb la taula de treball.

Per què no he triat un ESP8266? Per ser realment sense fil, és possible que tanqueu el cable d’alimentació, cosa que fa que les coses siguin una mica més complicades per afegir una bateria i incomodar la recàrrega. Com que el monitor de núvol es troba al costat de l'ordinador, és molt més fàcil utilitzar l'alimentació USB. La configuració de la connexió Wi-Fi no sempre és senzilla: basat en l’ATmega32u4, l’Arduino Micro i el LeoStick comparteixen la curiositat de tenir dades I2C a D2 i rellotge a D3. Això esdevé rellevant en connectar el LED RGB de BlinkM. A diferència de les plaques Atmega328 habituals, on només podeu connectar l'escut BlinkM a les capçaleres A2.. A5, això no funcionarà aquí (no em vaig molestar amb la suau biblioteca I2C).

En desoldar les capçaleres masculines VCC i GND al BlinkM, podria estendre les amb cable i guardar-ho tot en un petit paquet endollable. El BlinkM té el seu propi microcontrolador a bord i permet aplicacions avançades: per exemple, reprodueix patrons de color amb guions sense Arduino connectat. Gairebé sento que un WS2812 (els NeoPixels d’Adafruits són fantàstics) m’hauria servit millor, per desgràcia, no en tenia cap. Per acabar el bit de maquinari, vaig tallar l’extrem oposat del connector USB tipus A masculí, el vaig passar per un forat preforat prop de la base de la llum del núvol i vaig soldar els cables al LeoStick (vermell: 5V, blanc: Dades, verd: Dades +, negre: terra).

Pas 3: Arquitectura de solucions

Arquitectura de solucions
Arquitectura de solucions
Arquitectura de solucions
Arquitectura de solucions

L’únic requisit fort que m’imposava era fer funcionar el monitor darrere d’un tallafoc. Tot i que és una característica crucial, això va fer que els enllaços web per als canvis d’esdeveniments fossin poc pràctics. Un mecanisme de votació és car en termes de trànsit TCP i pot endarrerir els esdeveniments en funció de la freqüència de votació.

La solució es troba als WebSockets que proporcionen comunicació dúplex completa. El servei IoT d’Amazons proporciona un agent de missatges que admet MQTT a través de WebSockets. Resulta que es pot trucar al servei sense haver de configurar coses, ombres, polítiques o regles.

Hi ha un dispositiu SDK disponible per a l'Arduino Yún i es fan alguns esforços per portar l'SDK a altres plataformes com l'ESP8266. Però, com que el monitor sempre estarà connectat mitjançant una interfície en sèrie, al principi vaig decidir tenir una aplicació NodeJS (executada a l’ordinador de sobretaula) per implementar l’API client i utilitzar l’Arduino només per rebre i mostrar codis de color. D’aquesta manera es poden fer canvis fàcilment a JavaScript, sense haver de molestar-se amb les càrregues de microprogramari. Per provar es necessita un petit exemple d’infraestructura. Suposem que tenim un equilibrador de càrrega habilitat a totes les zones de disponibilitat que fa controls de salut en una instància de servidor web i polítiques d’escala automàtica basades en la càrrega de la CPU. La plantilla corresponent de CloudFormation es pot ▶ ️ visualitzar al dissenyador o ▶ ️ crear-la directament des de la consola. Nota: alguns dels serveis d'aquesta pila poden comportar càrrecs.

He ampliat la plantilla amb propietats per a la funció Lambda i els permisos necessaris. Més endavant, cal que s'insereixi el punt final de l'API REST de l'IoT com a paràmetre. Per automatitzar això, vaig escriure un petit script de shell que utilitza la CLI per sol·licitar l'ARN (> aws iot describe-endpoint) i després crida create-stack amb el paràmetre in-line. O encara podeu fer-ho a mà:

// 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

// ELIMINA PILA> aws cloudformation delete-stack --stack-name MiniCloudMonitor

Idealment hauria d’utilitzar els mateixos llindars d’alarma que activen l’escala automàtica, per trucar també a la funció Lambda i d’aquesta manera actualitzar l’estat del monitor. Actualment això només és possible quan s’utilitza SNS com a intermediari. En aquell moment, aquesta capa addicional es va sentir redundant i vaig decidir utilitzar les regles del cicle de vida de CloudWatch EC2 per trucar directament a la Lambda. Tot i així, vull explorar l'opció de SNS → Lambda en el futur.

Pas 4: programari

Vaig començar escrivint l'Arduino Sketch. El bucle principal () és llegir Chars des de la connexió serial i construir una cadena fins que rep un caràcter de línia nova. Aleshores, se suposa que s'ha enviat un codi de color hexadecimal i que s'escriu l'ordre I2C adequada al LED BlinkM. No es tracta tant d’eficiència com de comoditat. Les fonts completes d’aquest Sketch i altres fitxers es poden obtenir a GitHub. A continuació es mostren alguns fragments de codi rellevants:

bucle buit () {

while (Serial.available ()) {

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

if (inChar == '\ n') {

nombre llarg = strtol (inputString.c_str (), NULL, 16);

byte r = número >> 16;

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

byte b = nombre & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} més {

inputString + = inChar;

}

}

}

L'aplicació NodeJS ha d'implementar interfícies a AWS i Arduino. Més endavant es pot aconseguir en poques línies de codi quan s'utilitza l'excel·lent paquet serialport:

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

baudRate: SERIAL_BAUD_RATE

});

port.on ('obert', funció () {

});

port.on ('error', funció (err) {

});

La connexió a AWS IoT tampoc requereix gaire esforç. L’únic error és saber que l’ús de MQTT + WebSockets pel port 443 requereix autenticació mitjançant claus d’accés. L'SDK llegirà aquestes dades des de les variables d'entorn. Pot ser necessari exportar explícitament AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEY.

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

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), regió: AWS_REGION, protocol: 'wss', port: 443, depurar: cert

});

device.on ('connect', function () {

device.subscribe (MQTT_TOPIC);

});

device.on ('missatge', funció (tema, càrrega útil) {

if (port && càrrega útil && topic == MQTT_TOPIC) {

var missatge = JSON.parse (càrrega útil);

if (message.hasOwnProperty (MQTT_JSON_KEY))

{tornar;

}

}

});

La funció Lambda accepta un codi de color com a paràmetre d’entrada; no és bonic, però és molt flexible en aquesta etapa. Per poder publicar al tema MQTT, instancia un objecte IotData, que requereix el punt final de l'API IoT REST. La plantilla CloudFormation es va encarregar d'això durant la creació de la pila.

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

punt final: process.env. MQTT_ENDPOINT});

exportacions.handler = funció (esdeveniment, context, devolució de trucada) {

var params = {

topic: process.env. MQTT_TOPIC, càrrega útil: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (paràmetres, funció (err, dades) {

devolució de trucada (err);

});

};

Pas 5: Conclusió

Em va agradar molt portar un esdeveniment virtual "nascut" al núvol al món físic. I, com el meu projecte de petita mascota, va ser molt divertit. Per portar-ho al següent nivell, consideraria …

  • millora de la robustesa i el maneig de les excepcions
  • exploreu maneres millors d’integrar mètriques al núvol d’AWS
  • experimentar amb més indicadors físics com indicadors, gràfics de barres, …
  • tenen l'opció de moure's a altres plataformes com Azure, Google, Heroku, …
  • supervisar esdeveniments específics de l'aplicació per a Jenkins, GitHub, …

Espero que us hagi agradat llegir aquesta guia i que, fins i tot, pugueu recollir alguna cosa nova en el camí. Si se us acudeix una manera diferent / millor de fer les coses, compartiu-la als comentaris següents. I, per descomptat, si detecteu errors, el cap amunt seria molt apreciat. Gràcies pel teu temps.

Recomanat: