Ikona strzałka
Powrót do bloga

ABC domowego IoT w chmurze: dziś o AWS

Karol Przybylak
Karol Przybylak
24/11/2020

Witaj w drugiej części naszej serii artykułów o domowym IoT w chmurze. Dzisiaj na tapet bierzemy kolejną chmurę na „A”. Tym razem będzie to AWS. Cel jest prosty: wysłać informacje o temperaturze panującej w naszym domu do chmury.  

Jako termometr posłuży nam ten sam zestaw Bosch BME280 + ESP320, który stworzyliśmy w pierwszym artykule. (Jeśli go nie czytałeś, zapraszam do lektury.)  

Repozytorium z kodem i innymi potrzebnymi rzeczami znajdziesz tutaj: https://github.com/kajoj2/AWS-IotCore-Esp32-Article.

Kilka słów o AWS IoT Core

Zacznijmy od połączenia urządzenia z chmurą. Do tego idealnie nadaje się platforma AWS IoT Core. Można ją porównać do IoT Hub w Azure.

Iot Core obsługuje protokoły HTTP, MQTT i WebSocket i odpowiada za trzy główne kwestie:

  • Zarządzanie urządzeniami. Z poziomu IoT Core jesteśmy w stanie dodać urządzenie i zarządzać nim, a także tworzyć grupy, zarządzać certyfikatami dostępowymi i uprawnieniami urządzeń (tak, tu też są polityki).
  • Dostarczanie wiadomości. Funkcja Message Brokera – gdy jedno urządzenie wyśle wiadomość na wybrany temat (topic), inne może zasubskrybować ten temat, by otrzymywać wiadomości. Umożliwia to komunikację pomiędzy urządzeniami.
  • Redagowanie i przekazywanie wiadomości. Z poziomu IoT Core możemy wysłać wiadomość na dany temat do innych serwisów AWS. Odbiorcami wiadomości może być kolejka, baza danych, lambda lub inna dostępna usługa. Można przekazywać wszystkie wiadomości lub tylko określone (na podstawie wybranych parametrów).  

Z poziomu IoT Core możemy również zasubskrybować wybrany temat, żeby podejrzeć, jakie wiadomości przepływają.

Plan podłączenia krok po kroku

Przejdźmy do połącznia. Oto, co musimy zrobić:

  1. Stworzyć urządzenie w IoT Core  i wygenerować certyfikat potrzebny do uwierzytelnienia.
  2. Stworzyć politykę umożliwiającą publikowanie wiadomości przez urządzenie.
  3. Podpiąć politykę pod certyfikat i aktywować certyfikat.
  4. Napisać kod (w tym wypadku już jest gotowy – wystarczy standardowe „kopiuj-wklej” i z drobnymi zmianami zadziała).
  5. W kodzie dodać certyfikat i parametry połączenia.
  6. Wgrać kod i podejrzeć wiadomości.

Wydaje się skomplikowane? Spokojnie, zrobimy to razem!

Ale zanim przejdziemy do konsoli AWS, musimy przygotować środowisko, dzięki któremu wgramy nasz program do EPS32. Następnie będziemy musieli połączyć ze sobą kilka kabelków.

Cały ten proces także opisałem w pierwszym artykule w sekcji „Stroimy sprzęt”. Znajdziesz tam instrukcję krok po kroku, jak wszystko przygotować i połączyć.

Sprzęt gotowy? No to przechodzimy do konsoli!

Tworzymy sprzęt („rzecz”) w konsoli AWS

*Na początek pamiętaj o wybraniu regionu.

  • Przejdź do sekcji  All Services i znajdź sekcję Internet of Things. Znajdziesz w niej wszystkie usługi stworzone specjalnie do zastosowań Internetu rzeczy. A na samej górze będzie IoT Core. Przejdź do niej.
Internet of Things AWS IoT Core
  • Czas na utworzenie „rzeczy” (thing). „Rzeczą” będzie nasz sensor. Przypiszemy do niego certyfikat, dostaniemy punkt krańcowy i będziemy mogli z nim podziałać. By dodać sensor, po lewej stronie panelu usługi rozwiń zakładkę Manage i przejdź do  sekcji Things.
AWS IoT Core Things
  • Następnie wybierz opcję Register a thing. Chcemy utworzyć tylko jeden sensor, więc kliknij Create a single thing.
  • W następnym kroku musisz wpisać nazwę urządzenia i stworzyć jego typ (przycisk [Create a type]). Do tego potrzebujesz tylko zdefiniować nazwę typu. Gdy to zrobisz, wybierz stworzony typ.
Create thing type
  • Kliknij [Next], by przejść dalej.
  • Na tym etapie wybieramy certyfikat. Wybierz rekomendowaną pierwszą opcję [Create certificate]
Create certificate
  • Właśnie wygenerowaliśmy certyfikat i dwa klucze: publiczny i prywatny. Pobierz je wszystkie.
  • Dodatkowo będziemy potrzebować root CA – jest on dostępny pod tym linkiem.
  • Aktywuj certyfikat przyciskiem [Activate] i zakończ tworzenie, klikając [Done].
Certificate creation

Definiujemy politykę

Mamy już utworzoną naszą „rzecz”, czas stworzyć i przypiąć politykę, dzięki której urządzenie będzie miało uprawniania do wysyłania i odbierania wiadomości.

  • W zakładce Secure przejdź do Polices.
AWS IoT Policies
  • Kliknij [Create].
  • W oknie Create a policy wpisz nazwę polityki oraz zmień tryb Basic mode na Advanced mode. Następnie wklej politykę, którą zdefiniowałem w repozytorium na GitHubie (plik IoTCore_Policy.json).
Create a policy AWS
  • Zakończ tworzenie, klikając [Create].

Polityka jest dość otwarta, co zawsze ma pewien wpływ na bezpieczeństwo, ale czyni ją to też uniwersalną. Dzięki tak zdefiniowanej polityce będziesz mógł wysyłać wiadomości oraz połączyć się z brokerem (IoT Core) i zasubskrybować wybrany temat, by odbierać wiadomości.

Podpinamy certyfikat

Stworzyliśmy politykę, ale nie podpinamy jej bezpośrednio pod „rzecz”, tylko pod certyfikat skojarzony z daną „rzeczą”. Zobaczmy, jak to zrobić.

  1. Przejdź do sekcji Secure i wybierz zakładkę Certificates (nad Policies). Powinien widnieć w niej tylko jeden certyfikat o dość enigmatycznej (i losowej) nazwie. Kliknij w niego. 
  2. Następnie kliknij menu Actions po prawej stronie okna i wybierz z niego Attach policy.
Attach policy
  • Wybierz odpowiednią politykę i kliknij [Attach]. Gotowe!

*Możesz jeszcze wrócić do okna certyfikatu, by upewnić się, czy certyfikat na pewno jest aktywny.

Bosko! Udało nam się przygotować urządzenie w usłudze IoT core i mamy certyfikaty potrzebne do połączenia się z AWS przez nasz sensor. Byliśmy w chmurach, a teraz czas zejść niżej – do poziomu hardware. 

Przechodzimy do sprzętu – Arduino IDE

W repo znajdziesz folder embedded, w którym są dwie biblioteki (pliki .zip) oraz folder o nazwie code. To w tym folderze znajduje się kod do Arduino.

Po otwarciu kodu musisz dodać do niego biblioteki i zmienić niektóre parametry, takie jak dane do Wi-Fi i certyfikaty.  Zaraz pokażę, jak to zrobić.

  • Żeby dodać biblioteki w Arduino IDE, przejdź do Szkic -> Dołącz bibliotekę -> Dodaj bibliotekę ZIP.
Arduino biblioteka
  • Teraz musisz wpisać odpowiednie dane w polach:
    • WIFI_SSID
    • WIFI_PASSWORD
    • AWS_IOT_ENDPOINT
  • Oraz uzupełnić certyfikaty:
    • AWS_CERT_CA już powinien być uzupełniony
    • AWS_CERT_CRT i AWS_CERT_PRIVATE trzeba dodać
  • Otwórz w edytorze tekstu certyfikaty, które wygenerowałeś w poprzednich krokach. Skopiuj je i wklej w odpowiednie pola kodu Arduino.
  • Teraz możesz wgrać kod na płytkę Arduino – wiadomości powinny zacząć wysyłać się do chmury. Sprawdźmy, czy tak jest!

Sprawdzamy konfigurację wiadomości

Jak już wspomniałem, AWS IoT Core daje nam możliwość zasubskrybowania tematu,  żeby podejrzeć związane z nim wiadomości.

Jak to zrobić?

W IoT Core w menu po lewej stronie na dole jest opcja Test.  Dzięki niej możesz wysyłać lub odbierać wiadomość.  Żeby podejrzeć wiadomości, musisz wybrać temat, jaki chcesz zasubskrybować.

W naszym przypadku za temat odpowiada zmienna AWS_IOT_PUBLISH_TOPIC w Arduino. A co, jeśli nie znasz konkretnego tematu?

  • Wówczas możesz użyć znaku # – dzięki niemu zasubskrybujesz wszystkie tematy.
  • Jeśli znasz tylko część tematu, także możesz użyć #. Na przykład wpisując „dom/parter/#”, dostaniesz  wszystkie wiadomości wysłane na tematy zaczynające się od  „dom/parter/”.
  • Dodatkowo możesz użyć znaku +. Stosując go w taki sposób: „dom/+/temperatura”, otrzymasz wiadomości wysłane na tematy „dom/pater/temperatura”, „dom/piwnica/temperatura” , czy „dom/cokolwiek/temperatura.

Wpisz temat w polu Subcription topic (użyjmy #) i kliknij [Subscribe to topic].

Subscription topic

Jeżeli widzisz pojawiające się wiadomości, oznacza to, że wszystko działa:

Messages #

Udało się! Nasze wiadomości są już w chmurze. Jak widać, dość ciepło mam dzisiaj w pokoju ?

Jak zapisać dane z sensorów?

Jest jeden problem, niestety wiadomości nie są nigdzie zapisywane. Pojawiają się i znikają niewykorzystane. Na szczęście możemy temu zaradzić.

Kwestia przetwarzania wiadomości nadaje się nie na kolejny artykuł, ale na całą serię długich wpisów, bo temat jest przepastny. Istnieje cała masa usług, które mogą nam w tym pomóc.

Ale szkoda by było zostawić dane o temperaturze niezapisane. Dlatego wyślemy je na jedną z najpopularniejszych usług w AWS – Amazon S3.

Wysyłamy dane do Amazon S3

By zapisać nasze wiadomości w Amazon S3, potrzebujemy wykonać kilka kroków:

  • Stworzyć bucket S3 (być może już jakiś posiadasz).
  • Stworzyć rolę, która umożliwi usłudze IoT Core zapisywanie do bucketu S3.
  • Stworzyc routing wiadomości z tematu do Amazon S3.

Z ostatnim zadaniem pomoże nam Rules Engine wbudowany do IoT core. Dzięki niemu możemy przesyłać dane z IoT Core do innych usług AWS i nie tylko.

Myślę, że ze stworzeniem zbioru danych (bucket) poradzisz sobie bez problemu (więcej na ten temat dowiesz się z wpisu Przemka o Amazon S3). Pamiętaj tylko, żeby znajdował się w tym samym regionie, co IoT Core.

Tworzymy rolę dla wiadomości

Co do roli, możemy stworzyć ją automatycznie z konsoli IoT Core.

  1. Przejdźmy znowu do usługi IoT Core. Tym razem w zakładce Act przejdź do Rules i kliknij [Create a rule] .
  2. W oknie do tworzenia reguł wpisz nazwę reguły, a w polu Rule query statement wpisz SELECT * FROM ‘#’. Wtedy każda wiadomość będzie uwzględniana.
Create a rule
  • Kliknij [Add action], by określić, co stanie się, gdy zdefiniowana reguła zotanie spełniona.
  • W oknie wyboru akcji zaznacz Store a message in an Amazon S3 bucket i kliknij [Configure action] (na dole).
  • W oknie konfiguracji akcji wybierz swój bucket s3.
  • Jako Key wpisz ${topic()}/${timestamp()}.json.
  • Kliknij Create Role i wpisz nazwę dla swojej roli. Rola stworzy się automatycznie.
Configure action
  • Po zatwierdzeniu konfiguracji Twoje wiadomości powinny zacząć się pojawiać w zbiorze danych S3. 

Domowe IoT – co dalej?

Sukces!! Udało się nam wysłać i zapisać temperaturę!

Zapisywanie danych w Amazon S3 jest całkiem ok, ale lepiej by było zapisać je w miejscu przeznaczonym specjalnie dla takich informacji, np. w bazie Amazon TimeStream. Jeśli chcesz, możesz to potraktować jako zadnie domowe ?

Tym razem pokazałem, jak domowe IoT może działać w AWS, czeka nas jeszcze GCP. Wiem też, że wiele osób chciałoby zobaczyć, jak wykorzystać Raspberry Pi. Opowiem o tym w kolejnej części naszej serii i postaram się dostarczyć kod, który pomoże połączyć wszystkie chmury.

To tyle na dzisiaj, dziękuję za uwagę i zachęcam do zadawania pytań. Złapiesz mnie na mediach społecznościowych, np. na LinkedIn lub mailowo: [email protected]. Do usłyszenia!

AKTUALNOŚCI
13/06/20232 min.
AI w średniej firmie: Tworzenie przyszłości przy użyciu LLM.

Już 21 czerwca dowiesz się, jak możesz wykorzystać AI w Twojej firmie. Damian Mazurek i Piotr Kalinowski wprowadzą Cię w świat sztucznej inteligencji i LLM.

Zobacz wpis
AKTUALNOŚCI
14/02/20232 min
Chmurowisko łączy się z Software Mind

Przed nami nowy rozdział! Chmurowisko dokonało połączenia z polskim Software Mind – firmą, która od 20 lat tworzy rozwiązania przyczyniające się do sukcesu organizacji z całego świata…

Zobacz wpis
AKTUALNOŚCI
09/11/20225 min
Migracja systemu Dynamic Precision do Oracle Cloud

Grupa Dynamic Precision podjęła decyzję o unowocześnieniu swojej infrastruktury. Razem z Oracle Polska prowadzimy migrację aplikacji firmy do chmury OCI.

Zobacz wpis
AKTUALNOŚCI
AI w średniej firmie: Tworzenie przyszłości przy użyciu LLM.

Już 21 czerwca dowiesz się, jak możesz wykorzystać AI w Twojej firmie. Damian Mazurek i Piotr Kalinowski wprowadzą Cię w świat sztucznej inteligencji i LLM.

Zobacz wpis
Grafika przedstawiająca chmuręGrafika przedstawiająca chmurę

Zapisz się do naszego newslettera i
bądź z chmurami na bieżąco!

Zostaw nam swój e–mail a co miesiąc dostaniesz spis najważniejszych nowości
z chmur Azure, AWS i GCP, z krótkimi opisami i linkami.