Cuprins:

MONITOR CLOUD cu AWS & ARDUINO - Electric Boy: 6 pași
MONITOR CLOUD cu AWS & ARDUINO - Electric Boy: 6 pași

Video: MONITOR CLOUD cu AWS & ARDUINO - Electric Boy: 6 pași

Video: MONITOR CLOUD cu AWS & ARDUINO - Electric Boy: 6 pași
Video: CS50 2015 - Week 10 2024, Noiembrie
Anonim
MONITOR CLOUD cu AWS & ARDUINO - Electric Boy
MONITOR CLOUD cu AWS & ARDUINO - Electric Boy

Este un proiect simplu - aprindeți lumina când ceva nu merge bine … Devenind din ce în ce mai amorțit față de notificări cu atâtea tablouri de bord pe computerele noastre în zilele noastre, cum ne putem asigura că nu ne lipsesc cele cu adevărat importante. Răspunsul este un indicator de stare fizică. Sau mai specific sarcinii, un Cloud Monitor, care poate sta pe birou - întotdeauna la vedere. După cum sugerează și numele, monitorul vă va ajuta să urmăriți starea de sănătate a serviciilor dvs. cloud (… sau orice altceva, cerul este limita, scuzați jocul de cuvinte). Chiar și tu, ca și mine, trebuie să faci una? Chiar dacă nu, s-ar putea să ai o idee pentru viitorul tău proiect IoT.

Ei bine, dacă sunteți gata, să începem!

Pasul 1: Componente, consumabile, instrumente necesare, aplicații și servicii online

COMPONENTE ȘI SUPLIMENTARE

_ Arduino Micro e Genuino Micro (1 unitate)… sau orice mic Arduino compatibil - în cazul meu un freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

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

_ Mini lumină de nor (1 unitate) … sau orice alt vas translucid la alegere

_ Cablu USB-A la B (1 unitate)… sau orice cablu USB vechi cu o fișă tip A

INSTRUMENTE NECESARE

_ Fier de lipit (generic)

APLICAȚII ȘI SERVICIU ONLINE

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

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

Pasul 2: Hardware

Hardware
Hardware
Hardware
Hardware

Lumina de noapte vine deja cu un LED încorporat - alb rece în cazul meu. M-am gândit că ar fi frumos să indic statutul diferit prin culori diferite. Așa că am păstrat doar carcasa în formă de nor. Pentru creierul operației, am ales cel mai mic compatibil Arduino pe care îl aveam la dispoziție: Freetronics LeoStick a fost de ani buni platforma mea de prototipuri preferată și am multe piese de schimb. Vine încărcat cu lucruri bune: un difuzor piezo, două LED-uri RGB (unul este conectat la alimentare, RX și TX totuși) și, cel mai bine, îl puteți conecta pur și simplu la un port USB - nu este necesar FTDI extern sau cablu. De asemenea, este mic, dar compatibil.

De ce nu am ales un ESP8266? Pentru a fi cu adevărat wireless, ar putea la fel de bine să tăiați cablul de alimentare - ceea ce face lucrurile puțin mai complicate pentru adăugarea unei baterii și inconvenientul reîncărcării. Deoarece monitorul cloud va sta lângă computerul meu, este mult mai ușor să utilizați alimentarea USB. De asemenea, configurarea conexiunii Wi-Fi nu este întotdeauna simplă. Pe baza ATmega32u4, Arduino Micro și LeoStick împărtășesc ciudățenia de a avea date I2C pe D2 și ceas pe D3. Acest lucru devine relevant atunci când conectați LED-ul BlinkM RGB. Spre deosebire de plăcile obișnuite Atmega328 în care puteți conecta pur și simplu scutul BlinkM la antetele A2.. A5, acest lucru nu va funcționa aici (nu m-am deranjat cu biblioteca I2C soft).

Desoldând anteturile masculine VCC și GND de pe BlinkM, aș putea apoi să le extind pe cele cu fir și să păstrez totul într-un pachet mic care se poate conecta. BlinkM are propriul său controler micro la bord și permite aplicații avansate: de ex. redați modele de culoare cu scripturi fără un Arduino conectat. Aproape că simt că un WS2812 (Adafruits NeoPixels sunt grozavi) m-ar fi servit mai bine - din păcate nu aveam niciunul disponibil. Pentru a termina bitul hardware, am tăiat capătul opus al mufei USB de tip A masculin, l-am infiletat printr-o gaură pre-găurită lângă baza luminii cloud și am lipit firele la LeoStick (roșu: 5V, alb: Date, verde: Data +, negru: la sol).

Pasul 3: Arhitectura soluției

Arhitectura soluției
Arhitectura soluției
Arhitectura soluției
Arhitectura soluției

Singura cerință puternică pe care mi-am impus-o, a fost ca monitorul să ruleze în spatele unui firewall. Deși este o caracteristică crucială, acest lucru a făcut ca cârligele web pentru schimbările de evenimente să nu fie practice. Un mecanism de interogare este costisitor în ceea ce privește traficul TCP și poate întârzia evenimentele în funcție de frecvența de interogare.

Soluția se găsește în WebSockets care oferă comunicații full-duplex. Serviciul IoT Amazons oferă un broker de mesaje care acceptă MQTT prin WebSockets. După cum se dovedește, serviciul poate fi apelat fără a fi nevoie să configurați lucruri, umbre, politici sau reguli.

Există un dispozitiv SDK disponibil pentru Arduino Yún și se fac eforturi de portare a SDK-ului pe alte platforme, cum ar fi ESP8266. Dar, deoarece monitorul va fi întotdeauna conectat prin interfață serială, am decis din timp să am o aplicație NodeJS (rulată pe computerul desktop) pentru a implementa API-ul clientului și a utiliza Arduino doar pentru a primi și afișa coduri color. În acest fel, modificările pot fi făcute cu ușurință în JavaScript, fără a fi nevoie să vă deranjați cu încărcarea firmware-ului. Pentru testare este necesar un mic exemplu de infrastructură. Să presupunem că avem un echilibru de încărcare activat în zonele de disponibilitate care efectuează verificări de sănătate pe o instanță de server web și politici de scalare automată bazate pe încărcarea procesorului. Șablonul corespunzător CloudFormation poate fi vizualizat ▶ ️ în Designer sau ▶ ️ creat direct din consolă. Notă: unele dintre serviciile din această stivă pot suporta taxe.

Am extins șablonul cu proprietăți pentru funcția Lambda și permisiunile necesare. Ulterior, este necesar ca punctul final API IoT REST să fie inserat ca parametru. Pentru a automatiza acest lucru, am scris un mic script shell care folosește CLI pentru a solicita ARN (> aws iot describe-endpoint) și apoi apelează create-stack cu parametrul în linie. Sau încă o poți face manual:

// 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} --capacities CAPABILITY_NAMED_IAM

// DELETE STACK> aws cloudformation delete-stack --stack-name MiniCloudMonitor

În mod ideal ar trebui să folosesc aceleași praguri de alarmă care declanșează scalarea automată, pentru a apela și funcția Lambda și pentru a actualiza starea monitorului. În prezent, acest lucru este posibil numai atunci când se utilizează SNS ca intermediar. La acel moment, acest strat suplimentar s-a simțit redundant și am decis să folosesc regulile ciclului de viață CloudWatch EC2 pentru a apela direct Lambda. Totuși, vreau să explorez opțiunea SNS → Lambda în viitor.

Pasul 4: Software

Am început scriind Arduino Sketch. Bucla principală () citeste caractere din conexiunea serială și construiește un șir până când primește un caracter de linie nouă. Se presupune că a fost trimis un cod de culoare hexagonală și comanda I2C corespunzătoare este scrisă pe LED-ul BlinkM. Nu este vorba atât de eficiență cât de comoditate. Sursele complete pentru acest Sketch și alte fișiere pot fi obținute pe GitHub. Următoarele sunt câteva fragmente de cod relevante:

bucla nulă () {

while (Serial.available ()) {

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

if (inChar == '\ n') {

număr lung = strtol (inputString.c_str (), NULL, 16);

octet r = număr >> 16;

octet g = număr >> 8 & 0xFF;

octet b = număr & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} altceva {

inputString + = inChar;

}

}

}

Aplicația NodeJS trebuie să implementeze interfețe pentru AWS și Arduino. Mai târziu poate fi realizat în doar câteva linii de cod atunci când utilizați pachetul serialport excelent:

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

baudRate: SERIAL_BAUD_RATE

});

port.on ('deschis', funcție () {

});

port.on ('eroare', funcție (eroare) {

});

Conectarea la AWS IoT nu necesită niciun efort. Singura capcană este să știți că utilizarea MQTT + WebSockets peste portul 443 necesită autentificare prin chei de acces. SDK le va citi din variabilele de mediu. Poate fi necesar să exportați în mod explicit 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)), regiune: AWS_REGION, protocol: „wss”, port: 443, depanare: adevărat

});

device.on ('conectare', funcție () {

device.subscribe (MQTT_TOPIC);

});

device.on („mesaj”, funcție (subiect, sarcină utilă) {

if (port && sarcină utilă && topic == MQTT_TOPIC) {

var mesaj = JSON.parse (sarcină utilă);

if (message.hasOwnProperty (MQTT_JSON_KEY))

{ întoarcere;

}

}

});

Funcția Lambda acceptă un cod de culoare ca parametru de intrare - nu destul, dar foarte flexibil în această etapă. Pentru a putea publica pe subiectul MQTT, acesta creează un obiect IotData, care necesită punctul final API IoT REST. Șablonul CloudFormation a avut grijă de asta în timpul creării stivei.

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

punct final: process.env. MQTT_ENDPOINT});

exporturi.handler = funcție (eveniment, context, apel invers) {

var params = {

topic: process.env. MQTT_TOPIC, sarcină utilă: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (parametri, funcție (eroare, date) {

callback (eroare);

});

};

Pasul 5: Concluzie

Mi-a plăcut cu adevărat să aduc un eveniment virtual „născut” în cloud în lumea fizică. Și ca proiect micul meu animal de companie, a fost o grămadă de distracție. Pentru a duce acest lucru la nivelul următor aș considera …

  • îmbunătățind robustețea și manevrarea excepțiilor
  • explorați modalități mai bune de integrare a valorilor cloud AWS
  • experimentați cu mai mulți indicatori fizici precum indicatori, grafice cu bare, …
  • au opțiunea de a vă muta pe alte platforme precum Azure, Google, Heroku, …
  • monitorizați evenimentele specifice aplicației pentru Jenkins, GitHub, …

Sper că v-a plăcut să citiți acest ghid și poate chiar ați luat ceva nou pe parcurs. Dacă vă puteți gândi la un mod diferit / mai bun de a face lucrurile, vă rugăm să îl împărtășiți în comentariile de mai jos. Și, bineînțeles, dacă ați observat greșeli, un cap în sus ar fi foarte apreciat. Mulțumesc pentru timpul acordat.

Recomandat: