INHOUDSOPGAWE:

WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie: 6 stappe
WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie: 6 stappe

Video: WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie: 6 stappe

Video: WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie: 6 stappe
Video: Monitor Cloud Applications with Amazon Cloudwatch Alarms 2024, November
Anonim
WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie
WOLKMONITOR Met AWS & ARDUINO - Elektriese seuntjie

Dit is 'n eenvoudige projek - steek 'n liggie aan as iets verkeerd loop … Word steeds meer gevoelloos teenoor kennisgewings met soveel dashboards op ons rekenaars, hoe kan ons seker maak dat ons nie die belangrikste nie misloop nie? Die antwoord is 'n fisiese statusaanwyser. Of meer spesifiek vir die taak, 'n wolkmonitor, wat op u lessenaar kan sit - altyd in die oog. Soos die naam aandui, sal die monitor help om die gesondheid van u wolkdienste dop te hou (… of enigiets anders, die lug is die limiet, verskoon die woordspeling). Selfs jy, soos ek, moet een maak? Selfs indien nie, het u moontlik 'n idee vir 'n toekomstige IoT -projek.

Wel, as u gereed is, laat ons begin!

Stap 1: Komponente, voorrade, benodigde gereedskap, programme en aanlyndiens

KOMPONENTE EN VOORSIENINGS

_ Arduino Micro e Genuino Micro (1 eenheid) … of enige klein Arduino -versoenbaar - in my geval 'n freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C -beheerde RGB LED (1 eenheid)

_ Mini wolklig (1 eenheid) … of enige ander deurskynende houer van u keuse

_ USB-A na B-kabel (1 eenheid) … of enige ou USB-kabel met 'n tipe A-prop

GEREEDSKAP NODIG

_ Soldeerbout (generies)

APPS & ONLINE DIENS

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

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

Stap 2: Hardeware

Hardeware
Hardeware
Hardeware
Hardeware

Die naglig het reeds 'n ingeboude LED - koudwit in my geval. Ek het gedink dit sal lekker wees om verskillende status deur verskillende kleure aan te dui. Ek het dus net die wolkvormige omhulsel gehou. Vir die brein van die operasie het ek die kleinste Arduino -versoenbare gekies wat ek beskikbaar gehad het: Die Freetronics LeoStick is al jare my gunsteling prototipe -platform en ek het baie onderdele. Dit bevat baie goed: 'n piëzo -luidspreker, twee RGB -LED's (een is aan die krag gekoppel, maar RX en TX) en die beste van alles is dat u dit eenvoudig kan aansluit op 'n USB -poort - geen eksterne FTDI of kabel nodig nie. Dit is ook klein, maar broodbordversoenbaar.

Waarom het ek nie 'n ESP8266 gekies nie? Om regtig draadloos te wees, kan u net sowel die netsnoer afsny - wat dit 'n bietjie ingewikkelder maak om 'n battery by te voeg en ongemaklik om te herlaai. Aangesien die wolkmonitor langs my rekenaar sit, is dit baie makliker om USB -krag te gebruik. Die opstel van die Wi-Fi-verbinding is nie altyd reguit nie. Op grond van die ATmega32u4 deel die Arduino Micro en LeoStick die eienaardigheid dat I2C-data op D2 en klok op D3 is. Dit word relevant by die aansluiting van die BlinkM RGB LED. Anders as die gewone Atmega328 -borde waar u die BlinkM -skild eenvoudig in die kop A2.. A5 kan aansluit, sal dit nie hier werk nie (ek het my nie aan die sagte I2C -biblioteek gesteur nie).

Deur die manlike kopstukke VCC en GND op die BlinkM te laat soldeer, kan ek dit met draad verleng en alles in 'n klein pakkie hou. Die BlinkM het sy eie mikrobeheerder aan boord en maak voorsiening vir gevorderde toepassings: bv. speel kleurpatrone in skrif sonder dat 'n Arduino gekoppel is. Ek voel amper dat 'n WS2812 (Adafruits NeoPixels wonderlik) my beter sou gedien het - helaas, ek het nie een beskikbaar nie. Om die hardeware te voltooi, sny ek die teenoorgestelde kant van die manlike tipe A-USB-prop, trek dit deur 'n voorafgeboorde gat naby die basis van die wolklig en soldeer die drade aan die LeoStick (rooi: 5V, wit: Data-, groen: Data+, swart: grond).

Stap 3: Oplossingsargitektuur

Oplossingsargitektuur
Oplossingsargitektuur
Oplossingsargitektuur
Oplossingsargitektuur

Die enigste sterk vereiste wat ek aan myself gestel het, was om die monitor agter 'n firewall te laat loop. Alhoewel dit 'n deurslaggewende kenmerk is, het dit webhake vir gebeurtenisveranderings onprakties gemaak. 'N Peilingsmeganisme is duur in terme van TCP -verkeer en kan gebeurtenisse vertraag, afhangende van die stembusfrekwensie.

Die oplossing word gevind in WebSockets wat volledige dupleks-kommunikasie bied. Amazons IoT -diens bied 'n boodskapmakelaar wat MQTT ondersteun oor WebSockets. Soos dit blyk, kan die diens gebel word sonder om dinge, skaduwees, beleide of reëls op te stel.

Daar is 'n apparaat -SDK beskikbaar vir die Arduino Yún en 'n paar pogings word aangewend om die SDK na ander platforms soos die ESP8266 oor te dra. Maar omdat die monitor altyd met 'n seriële koppelvlak verbind sal word, het ek vroeg besluit om 'n NodeJS -toepassing te gebruik (uitgevoer op die tafelrekenaar) om die API van die kliënt te implementeer en slegs die Arduino te gebruik om kleurkodes te ontvang en te vertoon. Op hierdie manier kan veranderinge maklik in JavaScript aangebring word, sonder om moeite te doen met die oplaai van firmware. Gestel ons het 'n laaibalansier in die beskikbaarheidsones, wat gesondheidstoetse op 'n webbedienerinstansie doen en outomatiese skaalbeleid gebaseer op CPU -laai. Die ooreenstemmende CloudFormation -sjabloon kan ▶ ️ in die ontwerper bekyk word of ▶ ️ direk vanaf die konsole geskep word. Let wel: sommige dienste in hierdie stapel kan koste inhou.

Ek het die sjabloon uitgebrei met eienskappe vir die Lambda -funksie en die nodige regte. Later moet die IoT REST API -eindpunt as 'n parameter ingevoeg word. Om dit te outomatiseer, het ek 'n klein dop-skrip geskryf wat die CLI gebruik om die ARN (> aws iot beskryf-eindpunt) aan te vra en dan 'create-stack' met die parameter in-line te noem. Of u kan dit nog steeds met die hand doen:

// HERSIEN IoT REST API ENDPOINT

beskryf 'n eindpunt

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

// STAPEL VAS> aws wolkformasie delete-stack --stack-naam MiniCloudMonitor

Ideaal gesproke moet ek dieselfde alarmdrempels gebruik wat die outomatiese skaal veroorsaak, om ook die Lambda -funksie te skakel en sodoende die status van die monitor op te dateer. Tans is dit slegs moontlik as u SNS as tussenproduk gebruik. Destyds het hierdie ekstra laag oorbodig gevoel en ek het besluit om CloudWatch EC2 lewensiklusreëls te gebruik om die Lambda direk te bel. Tog wil ek in die toekoms die opsie van SNS → Lambda ondersoek.

Stap 4: sagteware

Ek het begin deur die Arduino Sketch te skryf. Die hooflus () is die lees van karakters vanaf die seriële verbinding en die bou van 'n string totdat dit 'n nuwe lyn karakter ontvang. Daar word dan aanvaar dat 'n hex -kleurkode gestuur is en die toepaslike I2C -opdrag aan die BlinkM LED geskryf word. Dit gaan nie soseer oor doeltreffendheid as gemak nie. Die volledige bronne vir hierdie Sketch en ander lêers kan op GitHub verkry word. Hier volg 'n paar relevante kodebrokkies:

leemte -lus () {

terwyl (Serial.available ()) {

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

as (inChar == '\ n') {

lang getal = strtol (inputString.c_str (), NULL, 16);

greep r = getal >> 16;

greep g = getal >> 8 & 0xFF;

greep b = getal & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} anders {

inputString += inChar;

}

}

}

Die NodeJS -app moet koppelvlakke met AWS en Arduino implementeer. Later kan u slegs in 'n paar reëls kode dit bereik as u die uitstekende reekspakket gebruik:

var serialport = require ('serialport'); poort = nuwe reekspoort (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

port.on ('oop', funksie () {

});

port.on ('fout', funksie (err) {

});

Om aan AWS IoT te koppel, verg ook min moeite. Die enigste slaggat is om te weet dat die gebruik van MQTT+WebSockets oor poort 443 verifikasie deur toegangsleutels vereis. Die SDK sal dit uit die omgewingsveranderlikes lees. Dit mag nodig wees om AWS_ACCESS_KEY_ID en AWS_SECRET_ACCESS_KEY uitdruklik uit te voer.

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

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), streek: AWS_REGION, protokol: 'wss', hawe: 443, ontfouting: waar

});

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

device.subscribe (MQTT_TOPIC);

});

device.on ('boodskap', funksie (onderwerp, loonvrag) {

if (poort && loonvrag && topic == MQTT_TOPIC) {

var boodskap = JSON.parse (loonvrag);

as (message.hasOwnProperty (MQTT_JSON_KEY))

{terugkeer;

}

}

});

Die Lambda -funksie aanvaar 'n kleurkode as 'n invoerparameter - nie mooi nie, maar baie buigsaam in hierdie stadium. Om vir die MQTT -onderwerp te publiseer, installeer dit 'n IotData -voorwerp, wat wel die IoT REST API -eindpunt benodig. Die CloudFormation -sjabloon het daarvoor gesorg tydens die skep van die stapel.

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

eindpunt: proses.env. MQTT_ENDPOINT});

exports.handler = funksie (gebeurtenis, konteks, terugbel) {

var params = {

onderwerp: process.env. MQTT_TOPIC, lading: '{ "color \": / "' + event.colour + '\"}', kwos: 0

};

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

terugbel (fout);

});

};

Stap 5: Gevolgtrekking

Ek het dit baie geniet om 'n virtuele gebeurtenis in die wolk 'gebore' in die fisiese wêreld te bring. En as my klein troeteldierprojek was dit hope pret. Om dit na die volgende vlak te neem, sou ek dit oorweeg …

  • verbetering van robuustheid en uitsonderingshantering
  • ondersoek beter maniere om AWS -wolkmetrieke te integreer
  • eksperimenteer met meer fisiese aanwysers soos meters, staafgrafieke, …
  • het die opsie om na ander platforms soos Azure, Google, Heroku, …
  • monitor toepassingspesifieke gebeure vir Jenkins, GitHub, …

Ek hoop dat u dit geniet het om hierdie gids te lees en miskien selfs iets nuuts opgedaag het. As u kan dink aan 'n ander/beter manier om dinge te doen, deel dit dan in die kommentaar hieronder. En natuurlik, as u foute opgemerk het, word dit hoog op prys gestel. Dankie vir jou tyd.

Aanbeveel: