Inhoudsopgave:

CLOUD MONITOR met AWS & ARDUINO - Electric Boy - Ajarnpa
CLOUD MONITOR met AWS & ARDUINO - Electric Boy - Ajarnpa

Video: CLOUD MONITOR met AWS & ARDUINO - Electric Boy - Ajarnpa

Video: CLOUD MONITOR met AWS & ARDUINO - Electric Boy - Ajarnpa
Video: AWS Maker Studio - Season 1 | Episode 4: Controlling Your Cloud-Connected Robot 2024, November
Anonim
CLOUDMONITOR Met AWS & ARDUINO - Electric Boy
CLOUDMONITOR Met AWS & ARDUINO - Electric Boy

Het is een eenvoudig project - doe een lampje aan als er iets misgaat… Omdat we tegenwoordig steeds meer gevoelloos worden voor meldingen met zoveel dashboards op onze computers, hoe kunnen we ervoor zorgen dat we de echt belangrijke niet missen. Het antwoord is een fysieke statusindicator. Of specifieker voor de taak, een Cloud Monitor, die op je bureau kan staan - altijd in het zicht. Zoals de naam al doet vermoeden, helpt de monitor om de gezondheid van uw cloudservices in de gaten te houden (… of iets anders eigenlijk, the sky is the limit, excuseer de woordspeling). Zelfs jij, zoals ik, moet er een maken? Zelfs als dat niet het geval is, heeft u misschien een idee voor een toekomstig IoT-project.

Nou, als je er klaar voor bent, laten we beginnen!

Stap 1: Componenten, benodigdheden, benodigde tools, apps en online service

COMPONENTEN EN TOEDIENINGEN

_ Arduino Micro e Genuino Micro (1 eenheid) … of een kleine Arduino-compatibel - in mijn geval een freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C gestuurde RGB LED (1 stuk)

_ Mini cloud light (1 unit) …of een ander doorschijnend vat naar keuze

_ USB-A naar B-kabel (1 stuk) … of een oude USB-kabel met een type-A-stekker

GEREEDSCHAP NODIG

_ Soldeerbout (generiek)

APPS & ONLINE-SERVICE

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

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

Stap 2: Hardware

Hardware
Hardware
Hardware
Hardware

Het nachtlampje wordt al geleverd met een ingebouwde LED - koud wit in mijn geval. Ik dacht dat het leuk zou zijn om verschillende statussen aan te geven met verschillende kleuren. Dus ik heb alleen de wolkvormige behuizing gehouden. Voor het brein van de operatie koos ik de kleinste Arduino-compatibele die ik beschikbaar had: de Freetronics LeoStick is al jaren mijn favoriete prototypeplatform en ik heb genoeg reserveonderdelen. Het zit boordevol goede dingen: een piëzo-luidspreker, twee RGB-LED's (een is echter verbonden met voeding, RX en TX) en het beste van alles is dat je hem eenvoudig op een USB-poort kunt aansluiten - geen externe FTDI of kabel nodig. Het is ook klein maar compatibel met breadboard.

Waarom heb ik geen ESP8266 gekozen? Om echt draadloos te zijn, kun je net zo goed het netsnoer doorknippen - wat het een beetje ingewikkelder maakt voor het toevoegen van een batterij en het ongemak van het opladen. Omdat de cloudmonitor naast mijn computer zal zitten, is het veel gemakkelijker om USB-stroom te gebruiken. Ook het opzetten van de Wi-Fi-verbinding is niet altijd eenvoudig. Op basis van de ATmega32u4 delen de Arduino Micro en LeoStick de eigenaardigheid van het hebben van I2C-gegevens op D2 en klok op D3. Dit wordt relevant bij het aansluiten van de BlinkM RGB LED. In tegenstelling tot de gewone Atmega328-borden waar je eenvoudig het BlinkM-schild in de headers A2.. A5 kunt steken, werkt dit hier niet (ik heb me niet beziggehouden met de zachte I2C-bibliotheek).

Door de mannelijke headers VCC en GND op de BlinkM te desolderen, kon ik die met draad verlengen en alles in een plug-able klein pakket houden. De BlinkM heeft een eigen microcontroller aan boord en maakt geavanceerde toepassingen mogelijk: b.v. speel gescripte kleurpatronen zonder een Arduino aangesloten. Ik heb bijna het gevoel dat een WS2812 (Adafruits NeoPixels zijn geweldig) me beter van dienst zou zijn geweest - helaas had ik er geen beschikbaar. Om het hardwarebit af te werken, heb ik het andere uiteinde van de mannelijke type-A USB-stekker doorgesneden, deze door een voorgeboord gat in de buurt van de basis van het wolkenlicht gestoken en de draden aan de LeoStick gesoldeerd (rood: 5V, wit: Data-, groen:Data+, zwart:Grond).

Stap 3: Oplossingsarchitectuur

Oplossingsarchitectuur
Oplossingsarchitectuur
Oplossingsarchitectuur
Oplossingsarchitectuur

De enige sterke eis die ik mezelf oplegde, was om de monitor achter een firewall te laten draaien. Hoewel dit een cruciale functie was, maakte dit webhaken voor evenementveranderingen onpraktisch. Een pollingmechanisme is kostbaar in termen van TCP-verkeer en kan gebeurtenissen vertragen, afhankelijk van de pollingfrequentie.

De oplossing is te vinden in WebSockets die full-duplex communicatie bieden. Amazons IoT-service biedt een berichtenmakelaar die MQTT via WebSockets ondersteunt. Het blijkt dat de service kan worden aangeroepen zonder dat u Things, Shadows, Policies of Rules hoeft te configureren.

Er is een SDK voor het apparaat beschikbaar voor de Arduino Yún en er worden enkele pogingen gedaan om de SDK over te zetten naar andere platforms zoals de ESP8266. Maar omdat de monitor altijd via een seriële interface zal worden aangesloten, heb ik al vroeg besloten om een NodeJS-toepassing (op de desktopcomputer) te hebben om de client-API te implementeren en de Arduino alleen te gebruiken om kleurcodes te ontvangen en weer te geven. Op die manier kunnen eenvoudig wijzigingen worden aangebracht in JavaScript, zonder dat u zich bezig hoeft te houden met firmware-uploads. Voor het testen van een klein voorbeeld is infrastructuur nodig. Laten we zeggen dat we een load balancer hebben ingeschakeld voor alle beschikbaarheidszones die statuscontroles uitvoert op een webserverinstantie en automatisch schalingsbeleid uitvoert op basis van CPU-belasting. De bijbehorende CloudFormation-sjabloon kan ▶️ worden bekeken in de Designer of ▶️ rechtstreeks vanuit de console worden gemaakt. Opmerking: voor sommige services in deze stack kunnen kosten in rekening worden gebracht.

Ik heb de sjabloon uitgebreid met eigenschappen voor de Lambda-functie en de benodigde machtigingen. Later moet het IoT REST API-eindpunt als parameter worden ingevoegd. Om dit te automatiseren, heb ik een klein shellscript geschreven dat de CLI gebruikt om de ARN op te vragen (> aws iot description-endpoint) en vervolgens create-stack aanroept met de parameter in-line. Of je kunt het nog steeds met de hand doen:

// RETRIVE IoT REST API-ENDPOINT

aws iot beschrijf-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_NAMED_IAM

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

Idealiter zou ik dezelfde alarmdrempels moeten gebruiken die de automatische schaling activeren, om ook de Lambda-functie aan te roepen en op die manier de status van de monitor bij te werken. Momenteel is dit alleen mogelijk bij gebruik van SNS als tussenproduct. Op dat moment voelde deze extra laag overbodig en besloot ik CloudWatch EC2 lifecycle Rules te gebruiken om de Lambda rechtstreeks aan te roepen. Toch wil ik in de toekomst de mogelijkheid van SNS → Lambda verkennen.

Stap 4: Software

Ik begon met het schrijven van de Arduino Sketch. De hoofdlus() leest Chars uit de seriële verbinding en bouwt een String op totdat deze een teken voor een nieuwe regel ontvangt. Er wordt dan aangenomen dat er een hexadecimale kleurcode is verzonden en het juiste I2C-commando wordt naar de BlinkM LED geschreven. Het gaat niet zozeer om efficiëntie als wel om gemak. De volledige bronnen voor deze Sketch en andere bestanden zijn te vinden op GitHub. Hieronder volgen enkele relevante codefragmenten:

lege lus() {

while (Serial.available()) {

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

if (inChar == '\n') {

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

byte r = getal >> 16;

byte g = getal >> 8 & 0xFF;

byte b = getal & 0xFF;

BlinkM_fadeToRGB(blinkm_addr, r, g, b);

invoerString = "";

} anders {

inputString += inChar;

}

}

}

De NodeJS-app moet interfaces naar AWS en Arduino implementeren. Later kan worden bereikt in slechts een paar regels code bij gebruik van het uitstekende serialport-pakket:

var seriële poort = vereisen('seriële poort');poort = nieuwe seriële poort(PORT_COM_NAME, {

baudrate: SERIAL_BAUD_RATE

});

poort.on('open', functie() {

});

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

});

Ook het verbinden met AWS IoT kost weinig moeite. De enige valkuil is om te weten dat het gebruik van MQTT+WebSockets via poort 443 authenticatie via toegangssleutels vereist. De SDK leest deze uit de omgevingsvariabelen. Het kan nodig zijn om AWS_ACCESS_KEY_ID en AWS_SECRET_ACCESS_KEY expliciet te exporteren.

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

clientId: 'MiniCloudMonitor-' + (Math.floor((Math.random() * 100000) + 1)), regio: AWS_REGION, protocol: 'wss', poort: 443, debug: waar

});

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

apparaat.subscribe (MQTT_TOPIC);

});

device.on('message', function(topic, payload) {

if (poort && payload && onderwerp == MQTT_TOPIC) {

var bericht = JSON.parse(payload);

if (bericht.hasOwnProperty(MQTT_JSON_KEY))

{ opbrengst;

}

}

});

De Lambda-functie accepteert een kleurcode als invoerparameter - niet mooi, maar in dit stadium erg flexibel. Om te kunnen publiceren naar het MQTT-onderwerp, wordt een IotData-object geïnstantieerd, waarvoor het IoT REST API-eindpunt vereist is. De CloudFormation-sjabloon zorgde daarvoor tijdens het maken van de stapel.

var AWS = vereisen('aws-sdk');var mqtt = nieuwe AWS. IotData({

eindpunt: process.env. MQTT_ENDPOINT});

exports.handler = function(event, context, callback) {

var parameters = {

onderwerp: proces.env. MQTT_TOPIC, laadvermogen: '{"color\":\"' + event.colour + '\"}', qos: 0

};

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

terugbellen (fout);

});

};

Stap 5: Conclusie

Ik heb er echt van genoten om een virtueel evenement 'geboren' in de cloud naar de fysieke wereld te brengen. En als mijn kleine huisdierenproject was het enorm leuk. Om dit naar een hoger niveau te tillen, zou ik overwegen…

  • verbetering van robuustheid en afhandeling van uitzonderingen
  • verken betere manieren om AWS-cloudstatistieken te integreren
  • experimenteer met meer fysieke indicatoren zoals meters, staafdiagrammen, …
  • hebben de mogelijkheid om te verhuizen naar andere platformen zoals Azure, Google, Heroku, …
  • monitor applicatie-specifieke gebeurtenissen voor Jenkins, GitHub, …

Ik hoop dat je deze gids met plezier hebt gelezen en misschien zelfs iets nieuws hebt opgepikt. Als je een andere/betere manier kunt bedenken om dingen te doen, deel deze dan in de reacties hieronder. En natuurlijk, als u fouten ontdekt, wordt een waarschuwing zeer op prijs gesteld. Bedankt voor uw tijd.

Aanbevolen: