Mündəricat:

AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli oğlan: 6 addım
AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli oğlan: 6 addım

Video: AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli oğlan: 6 addım

Video: AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli oğlan: 6 addım
Video: CS50 2015 – 10-я неделя 2024, Noyabr
Anonim
AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli Oğlan
AWS & ARDUINO ilə Bulud MONİTORU - Elektrikli Oğlan

Sadə bir layihədir - bir şey səhv olanda işığı yandırın … Bu günlərdə kompüterlərimizdə bir çox tablosuna malik olan bildirişlərə qarşı getdikcə həssas olmaq, həqiqətən də vacib olanları əldən verməməyimizə necə əmin ola bilərik. Cavab fiziki vəziyyət göstəricisidir. Və ya daha konkret olaraq, iş masanızda otura bilən Bulud Monitoru - hər zaman göz önündə. Adından da göründüyü kimi, monitor bulud xidmətlərinizin sağlamlığını izləməyə kömək edəcək (və ya başqa bir şey, səma həddidir, bəhanə üçün üzr istəyin). Hətta mənim kimi sən də bir şey düzəltməlisən? Olmasa da, gələcək IoT layihəniz üçün bir fikriniz ola bilər.

Yaxşı, hazırsan, başlayaq!

Addım 1: Komponentlər, Təchizat, Lazımi Alətlər, Tətbiqlər və Onlayn Xidmət

BİLEŞENLER VƏ QAYDALAR

_ Arduino Micro e Genuino Micro (1 ədəd)… və ya hər hansı bir kiçik Arduino uyğun - mənim vəziyyətimdə freetronics LeoStick (https://www.freetronics.com.au/collections/arduino/products/leostick)

_ ThingM BlinkM - I2C Nəzarətli RGB LED (1 ədəd)

_ Mini bulud işığı (1 ədəd)… və ya seçdiyiniz hər hansı digər şəffaf qab

_ USB-A-B Kabeli (1 ədəd)… və ya A tipli fişli hər hansı bir köhnə USB kabeli

Alətlərə ehtiyac var

_ Havya (ümumi)

Tətbiqlər və ONLINE XİDMƏT

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

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

Addım 2: Avadanlıq

Avadanlıq
Avadanlıq
Avadanlıq
Avadanlıq

Gecə işığı artıq quraşdırılmış bir LED ilə gəlir - mənim vəziyyətimdə soyuq ağ. Fərqli rəngləri fərqli statusu göstərməyin gözəl olacağını düşündüm. Buna görə də yalnız bulud formalı korpusu saxladım. Əməliyyatın beyinləri üçün əlimdə olan ən kiçik Arduino uyğunluğunu seçdim: Freetronics LeoStick illərdir mənim ən çox sevdiyim prototip platformasıdır və çoxlu ehtiyat hissələrim var. Yaxşı şeylərlə yüklənir: bir piezo dinamik, iki RGB LED (biri gücə, RX və TX -ə bağlıdır) və ən yaxşısı, sadəcə USB portuna qoşa bilərsiniz - xarici FTDI və ya kabel lazım deyil. Kiçik, lakin çörək taxtası ilə də uyğun gəlir.

Niyə ESP8266 seçmədim? Həqiqətən simsiz olmaq üçün elektrik kabelini də kəsə bilərsiniz - bu, batareyanı əlavə etmək və yenidən doldurmaqda çətinlik çəkmək üçün işləri bir az daha çətinləşdirir. Bulud monitoru kompüterimin yanında oturacağından USB gücünü istifadə etmək daha asandır. Arduino Micro və LeoStick, ATmega32u4-ə əsaslanaraq D2-də I2C məlumatlarının və D3-də saatın olması ilə bağlı qəribəlikləri bölüşürlər. Bu, BlinkM RGB LEDini bağlayarkən aktual olur. BlinkM qalxanını A2.. A5 başlıqlarına bağlaya biləcəyiniz ümumi Atmega328 lövhələrindən fərqli olaraq, bu burada işləməyəcək (yumşaq I2C kitabxanası ilə narahat olmadım).

BlinkM-də kişi başlıqları VCC və GND-ni sökərək, telli olanları uzada bilərəm və hər şeyi fişlə işləyə bilən kiçik bir paketdə saxlaya bilərəm. Arduino bağlantısı olmadan skriptli rəng nümunələrini oynayın. Demək olar ki, bir WS2812 (Adafruits NeoPixels əladır) mənə daha yaxşı xidmət edərdi - təəssüf ki, əlimdə heç bir şey yox idi. Avadanlıq bitini bitirmək üçün kişi tipli USB fişinin əks ucunu kəsdim, bulud işığının əsasının yaxınlığında əvvəlcədən qazılmış bir çuxurdan keçirdim və telləri LeoStickə lehimlədim (qırmızı: 5V, ağ: Məlumat-, yaşıl: Məlumat+, qara: Zəmin).

Addım 3: Həll Memarlığı

Həll Memarlığı
Həll Memarlığı
Həll Memarlığı
Həll Memarlığı

Özümə qoyduğum yeganə güclü tələb monitörün təhlükəsizlik duvarının arxasında işləməsidir. Əhəmiyyətli bir xüsusiyyət olsa da, bu hadisə dəyişiklikləri üçün veb kancalarını praktik olaraq dəyişdirdi. Bir səsvermə mexanizmi TCP trafiki baxımından baha başa gəlir və səsvermə tezliyindən asılı olaraq hadisələri gecikdirə bilər.

Çözüm, tam dupleks ünsiyyət təmin edən WebSockets-də tapılmışdır. Amazons IoT xidməti, WebSockets üzərindən MQTT -ni dəstəkləyən bir mesaj brokerini təmin edir. Göründüyü kimi, Şeyi, Kölgələri, Siyasətləri və ya Qaydaları konfiqurasiya etmədən xidmətə zəng etmək olar.

Arduino Yún üçün SDK cihazı mövcuddur və SDK -nı ESP8266 kimi digər platformalara daşımaq üçün bəzi səylər göstərilir. Ancaq monitor həmişə serial interfeysi ilə əlaqəli olacağından, müştəri API -ni tətbiq etmək və Arduino -dan yalnız rəng kodlarını almaq və göstərmək üçün bir NodeJS tətbiqinin (masa üstü kompüterdə işlədilməsi) erkən qərar verdim. Bu şəkildə JavaScript -də proqram təminatını yükləməklə narahatlıq keçirmədən asanlıqla dəyişikliklər edilə bilər. Bir az nümunə üçün infrastruktura ehtiyac var. Tutaq ki, bir veb server nümunəsində sağlamlıq yoxlamaları və CPU yükünə əsaslanan avtomatik miqyaslama siyasətlərini yerinə yetirən mövcudluq zonalarında aktivləşdirilmiş bir yük balanslaşdırıcımız var. Müvafiq CloudFormation şablonu ▶ ️ Dizaynerdə baxıla və ya ▶ ️ birbaşa konsoldan yaradıla bilər. Qeyd: Bu yığındakı bəzi xidmətlər ödənişli ola bilər.

Şablonu Lambda funksiyası və lazımlı icazələr üçün xüsusiyyətlərlə genişləndirdim. Daha sonra IoT REST API son nöqtəsinin parametr olaraq daxil edilməsini tələb edir. Bunu avtomatlaşdırmaq üçün ARN (> aws iot description-endpoint) tələb etmək üçün CLI istifadə edən və sonra in-line parametri ilə create-stack çağıran kiçik bir qabıq skript yazdım. Və ya hələ də əl ilə edə bilərsiniz:

// IoT REST API NÖVBƏSİNİ QAYTAR

aws iot təsvir-son nöqtə

// CREATE STACK> aws cloudformation create-stack --stack-name MiniCloudMonitor --template-body file: //cfn-template.json --parameters ParameterKey = IotRestApiEndpoint, ParameterValue = {IoT_REST_API_ENDPOINT}-qabiliyyət qabiliyyətləri

// Yığın sil> aws cloudformation delete-stack-yığın adı MiniCloudMonitor

İdeal olaraq, Lambda funksiyasını çağırmaq və bu şəkildə monitorun vəziyyətini yeniləmək üçün avtomatik miqyaslanmanı tetikleyen eyni siqnal eşiklərindən istifadə etməliyəm. Hal -hazırda bu yalnız SNS -ni ara vasitə kimi istifadə edərkən mümkündür. O zaman bu əlavə təbəqə artıq hiss olunurdu və Lambda -ya birbaşa zəng etmək üçün CloudWatch EC2 həyat dövrü qaydalarından istifadə etmək qərarına gəldim. Yenə də gələcəkdə SNS → Lambda seçimini araşdırmaq istəyirəm.

Addım 4: Proqram təminatı

Arduino eskizini yazmağa başladım. Əsas döngə (), serial əlaqəsindən Chars oxuyur və yeni bir sətir xarakteri alana qədər String qurur. Daha sonra bir hex rəng kodunun göndərildiyi və BlinkM LED -ə müvafiq I2C əmrinin yazıldığı güman edilir. Bu, səmərəlilikdən çox rahatlıq deyil. Bu Sketch və digər sənədlərin tam mənbələrini GitHub -da əldə etmək olar. Aşağıda bəzi uyğun kod parçaları verilmişdir:

boşluq döngəsi () {

while (Serial.available ()) {

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

əgər (inChar == '\ n') {

uzun sayı = strtol (inputString.c_str (), NULL, 16);

bayt r = sayı >> 16;

bayt g = sayı >> 8 & 0xFF;

bayt b = sayı & 0xFF;

BlinkM_fadeToRGB (blinkm_addr, r, g, b);

inputString = "";

} başqa {

inputString += inChar;

}

}

}

NodeJS Tətbiqi AWS və Arduino interfeyslərini tətbiq etməlidir. Daha sonra mükəmməl serialportpackage istifadə edərkən yalnız bir neçə kod sətrində edilə bilər:

var serialport = tələb edin ('serialport'); port = yeni serialport (PORT_COM_NAME, {

baudRate: SERIAL_BAUD_RATE

});

port.on ('açıq', funksiya () {

});

port.on ('səhv', funksiya (səhv) {

});

AWS IoT -a qoşulmaq da çox səy tələb etmir. 443 portu üzərində MQTT+WebSockets -dən istifadə etmək üçün Access Keys vasitəsi ilə autentifikasiya tələb olunduğunu bilmək yeganə çətinlikdir. SDK bunları ətraf mühit dəyişənlərindən oxuyacaq. AWS_ACCESS_KEY_ID və AWS_SECRET_ACCESS_KEY -ni açıq şəkildə ixrac etmək lazım ola bilər.

var awsiot = tələb ('aws-iot-device-sdk'); var cihaz = awsiot.device ({

clientId: 'MiniCloudMonitor-' + (Math.floor ((Math.random () * 100000) + 1)), bölgə: AWS_REGION, protokol: 'wss', liman: 443, ayıklama: doğrudur

});

device.on ('əlaqə', funksiya () {

device.subscribe (MQTT_TOPIC);

});

device.on ('mesaj', funksiya (mövzu, faydalı yük) {

əgər (liman && yükləmə && mövzu == MQTT_TOPIC) {

var mesajı = JSON.parse (yük);

əgər (message.hasOwnProperty (MQTT_JSON_KEY))

{qayıt;

}

}

});

Lambda funksiyası bir rəng kodunu giriş parametri olaraq qəbul edir - bu mərhələdə çox gözəl deyil, amma çox çevikdir. MQTT mövzusunda dərc edə bilmək üçün IoT REST API son nöqtəsini tələb edən bir IotData obyekti yaradır. CloudFormation şablonu, yığın yaradılarkən bununla maraqlandı.

var AWS = tələb ('aws-sdk'); var mqtt = yeni AWS. IotData ({

son nöqtə: process.env. MQTT_ENDPOINT});

export.handler = funksiya (hadisə, kontekst, geri zəng) {

var params = {

mövzu: process.env. MQTT_TOPIC, yük: '{ "color \": / "' + event.colour + '\"}', qos: 0

};

mqtt.publish (parametrlər, funksiya (səhv, məlumat) {

geri zəng (səhv);

});

};

Addım 5: Nəticə

Buludda "dünyaya gələn" bir virtual hadisəni fiziki dünyaya gətirməkdən çox zövq aldım. Kiçik ev heyvanı layihəm çox əyləncəli idi. Bunu növbəti səviyyəyə qaldırmaq üçün düşünərdim…

  • möhkəmlik və istisnaların idarə edilməsi üzrə təkmilləşdirmə
  • AWS bulud metriklərini birləşdirməyin daha yaxşı yollarını araşdırın
  • Ölçmə cihazları, çubuq qrafikləri kimi daha çox fiziki göstəricilərlə sınaq keçirin …
  • Azure, Google, Heroku və digər platformalara keçmək imkanı var …
  • Jenkins, GitHub, tətbiq üçün xüsusi hadisələri izləyin …

Ümid edirəm bu təlimatı oxumaqdan zövq aldınız və bəlkə də yol boyu yeni bir şey aldınız. Fərqli/daha yaxşı bir yol düşünsəniz, aşağıdakı şərhlərdə paylaşın. Əlbəttə ki, səhvlər görsəniz, başınızı qaldırmaq yüksək qiymətləndiriləcəkdir. Vaxt ayırdığınız üçün təşəkkürlər.

Tövsiyə: