![expresslink_title](https://malak.cloud/wp-content/uploads/2022/07/expresslink_title-scaled.jpeg)
AWS IoT ExpressLink
21 czerwca AWS udostępnił publicznie usługę AWS IoT ExpressLink. W artykule postaram się pokazać czym ta usługa jest, w czym może nam pomóc i jak zacząć z niej korzystać.
Czym jest AWS IoT ExpressLink
AWS inwestuje sporo zasobów w rozwój usług Internet of Things, które wykorzystywane są zarówno w rozwiązaniach konsumenckich, jak i w przemyśle.
Każde rozwiązanie wdrażane komercyjnie w chmurze powinno przede wszystkim przynosić korzyść biznesową. Nie samą logiką aplikacje jednak żyją. Ważne jest też bezpieczeństwo rozwiązań. Nie chcemy przecież, aby na przykład ktoś przechwycił nasze niezaszyfrowane dane. Zabezpieczenie zarówno rozsianych po całym świecie urządzeń IoT jak i komunikacji pomiędzy nimi, a chmurą AWS nie jest zadaniem łatwym. Uwierzytelnienie, autoryzacja do usług, czy wreszcie szyfrowanie przesyłanych danych to nie są trywialne zadania.
Do tej pory te wszystkie niewdzięczne zadania leżały po stronie twórców aplikacji. Teraz z pomocą przychodzi tu AWS i usługa IoT ExpressLink, a właściwie urządzenia oferowane przez partnerów AWS zgodne z IoT ExpressLink. Wystarczy praktycznie takie urządzenie zarejestrować w usłudze AWS IoT Core i można wymieniać dane z chmurą. Można skupić się na tworzeniu aplikacji pod kątem potrzeb użytkowników, zapominając o całej warstwie sieciowej, kryptograficznej czy wreszcie uwierzytelnianiu. Łączymy się, wysyłamy i odbieramy dane.
W czasach gdy time to market czasami znaczy być albo nie być dla jakiegoś pomysłu lub biznesu, usługa może być bardzo przydatna. A taki development kit ExpressLink to raj dla wszelkiego rodzaju PoC.
Więcej na ten temat można przeczytać na blogu AWS.
Urządzenia AWS IoT ExpressLink
Katalog dostępnych urządzeń dostępny jest tutaj. Nie ma tego wiele, ale myślę, że na początek każdy znajdzie coś dla siebie.
Jak tylko usługa weszła w GA i zobaczyłem, że nie kosztują one miliona dukatów postanowiłem, że muszę się tym pobawić. Miałem wcześniej do czynienia z komunikacją z modemami, komendy Hayes nie są dla mnie czarną magią, a IoT zawsze siedziało mi w głowie, nie zastanawiałem się zbyt długo. Wybór padł na development kit USB-Nora-W256-AWS zakupiony w sklepie DigiKey.
Zamówiłem dwie sztuki. W czerwcu było trochę taniej, poza tym zakup dwóch urządzeń z darmową przesyłką był tylko 30zł droższy niż zakup jednego. A przy okazji będę się mógł też pobawić komunikacją pomiędzy urządzeniami.
PROTIP. Jeżeli zamówicie tam urządzenia i nic nie bedzie się działo, to zacznijcie się do nich dobijać. Nikt się o nic nie pytał, ale okazało się, że musiałem wyjaśnić po co mi to, jakie rozwiązania będę budował itd. Czyżby wrócił CoCom? 🙂 Wystarczyło wyjaśnienie, że jestem architektem i developerem AWS i potrzebuję do R&D i po 3-4 dniach miałem zabawki u siebie.
Konfiguracja urządzenia AWS IoT ExpressLink
Po podłączeniu do portu USB, powinniśmy mieć dostępny kolejny port szereregowy.
Większość z Was pewnie nawet takich portów nie widziała, mi przypomniała się aplikacja do sterowania modemem GSM, którą kiedyś napisałem. Swego czasu używałem także RS232 do sterowania urządzeniami zewnętrznymi. Co to były za czasy. 😉 Z czasów Windows pamiętam jednak, że konieczne były dodatkowe sterowniki, aby tego typu urządzenia były widoczne w systemie.
Do komunikacji potrzebna będzie jakaś aplikacja terminalowa. Ja na MAC OS użyłem Cool Term dostępnego tutaj.
W pierwszej kolejności musimy skonfigurować połączenie z portem szeregowym. Poniżej wartości, które należy ustawić w programie.
- Baudrate: 115200
- Bits: 8
- Parity: None
- Stop: 1
- Flow control: None
- Local Echo: Yes
- End of Line: LF
Tak to wygląda w Cool Term-ie.
Po podłączeniu do urządzenia sprawdźmy czy została nawiązana poprawna komunikacja. Wpiszmy w terminalu komendę AT
. Jeżeli dostaliśmy w odpowiedzi OK to znaczy, że wszystko działa poprawnie.
Gdyby ktoś był ciekawy, to pełna lista komend obsługiwanych przes urządzenia AWS IoT ExpressLink znajduje się tutaj.
W kolejnym kroku musimy skonfigurować połączenie do sieci. Pełna lista możliwych konfiguracji urządzeń ExpressLink dostępna jest tutaj, w naszym przypadku (łączymy się przez WiFi) musimy podać nazwę sieci (SSID) oraz hasło (Passphrase). Konfigurację wykonujemy za pomocą dwóch komend w aplikacji terminalowej:
AT+CONF SSID=<nazwa sieci WiFi> AT+CONF Passphrase=<hasło do sieci WiFi>
Za każdym razem powinniśmy otrzymać potwierdzenie OK.
Konfiguracja IoT Core
Kolejnym krokiem jest konfiguracja usługi IoT Core. Po kolei dodamy nasze urządzenie, certyfikat oraz utworzymy politykę IAM.
Na początek pobierzmy z urządzenia jego nazwę:
AT+CONF? ThingName
oraz zarejestrujmy je w IoT Core:
aws iot create-thing --thing-name 34b4727041e4
{ "thingName": "34b4727041e4", "thingArn": "arn:aws:iot:eu-central-1:455118752320:thing/34b4727041e4", "thingId": "c3e0be51-5fa1-41e2-9579-946acae7de39" }
Jak wiemy, każde urządzenie ExpressLink ma „zaszyty” certyfikat. Musimy zarejestrować go w AWS. Certyfikat możemy wyświetlić za pomocą polecenia:
AT+CONF? Certificate
Po skopiowaniu go do schowka, zapiszmy go do pliku:
echo "-----BEGIN CERTIFICATE-----MIIDfzCCAmcCF.........5HnSk=-----END CERTIFICATE-----" > ThingName.cert.pem
a następnie do zmiennej środowiskowej, którą za chwilę wykorzystamy:
export CERT=$(cat ThingName.cert.pem)
Rejestrację certyfikatu w usłudze IoT Core wykonujemy za pomocą polecenia:
aws iot register-certificate-without-ca --certificate-pem $CERT --status ACTIVE
{ "certificateArn": "arn:aws:iot:eu-central-1:455118752320:cert/14d06c345a202ccfa5ca13e483ae852ab5849ab803ae1d0f99f260a7d0c1273a", "certificateId": "14d06c345a202ccfa5ca13e483ae852ab5849ab803ae1d0f99f260a7d0c1273a" }
ARN certyfikatu za chwilę się przyda. W kolejnym kroku podepniemy go jako principal do naszej (naszego?) Thing:
aws iot attach-thing-principal --thing-name 34b4727041e4 --principal <arn certyfikatu>
Pozostało utworzenie polityki IoT umożliwiającej dostęp do usług AWS. Niezbyt dobry przykład mamy poniżej.
aws iot create-policy --policy-name IoTTestPolicy --policy-document '{"Version": "2012-10-17", "Statement": [ {"Effect": "Allow", "Action": "*", "Resource": "*"}]}'
{ "policyName": "IoTTestPolicy", "policyArn": "arn:aws:iot:eu-central-1:455118752320:policy/IoTTestPolicy", "policyDocument": "{\"Version\": \"2012-10-17\", \"Statement\": [ {\"Effect\": \"Allow\", \"Action\": \"*\",\n\"Resource\": \"*\"}]}", "policyVersionId": "1" }
Na pewno o tym wiecie, ale takiej polityki nie używajcie w domu, a tym bardziej na produkcji. Umożliwia ona zrobienie wszystkiego i używam jej tutaj tylko dlatego, żeby nie komplikować za bardzo tematu. Przykłady polityk IoT możecie znaleźć np. tutaj. O bezpieczeństwie w IoT pisze także Łukasz Malinowski na swoim blogu. Polecam.
Na koniec konfiguracji musimy podpiąć politykę pod certyfikat:
aws iot attach-policy --policy-name IoTTestPolicy --target <arn certyfikatu>
W tym momencie jesteśmy przygotowani i możemy rozpocząć przesyłanie danych pomiędzy naszym urządzeniem, a usługą IoT Core.
Komunikacja
Ja zapewne się domyślacie, komunikacja pomiędzy urządzeniem AWS IoT ExpressLink a AWS odbywa się poprzez endpoint usługi IoT Core. Jego adres możemy pobrać za pomocą polecenia:
aws iot describe-endpoint --endpoint-type iot:Data-ATS
![endpoint](https://malak.cloud/wp-content/uploads/2022/07/expresslink_endpoint-1024x204.png)
AT+CONF Endpoint=xxxxxxxxxxxxxx-ats.iot.eu-central-1.amazonaws.com
i konfigurujemy endpoint AWS IoT Core.
Tu mała uwaga. Wydaje mi się, że komunikacja jest dość kapryśna pod kątem jakości? sieci WiFi. W biurze, gdzie mam jakiś modemorouter od Vectry gubię czasem połączenie, wysyłanie danych jest problemem. W domu, przy porządnym routerze nie mam najmniejszych problemów. Miejcie to na uwadze.
Komunikacja z chmurą odbywa sie poprzez topiki, skonfigurujemy więc w urządzeniu takie dwa:
AT+CONF Topic1=My First Topic AT+CONF Topic2=My Second Topic
![topics](https://malak.cloud/wp-content/uploads/2022/08/el-topics-1024x410.png)
Wysyłamy do chmury
![](https://malak.cloud/wp-content/uploads/2022/08/el-client.png)
![](https://malak.cloud/wp-content/uploads/2022/08/el-client-sub-1024x530.png)
AT+CONNECT
![connected](https://malak.cloud/wp-content/uploads/2022/07/expresslink_connected-1024x389.png)
AT+SEND1 Hello Przemek 1
Po chwili powinniśmy dostać potwierdzenie wysyłki
![](https://malak.cloud/wp-content/uploads/2022/08/el-send1-1024x410.png)
![](https://malak.cloud/wp-content/uploads/2022/08/el-client1-1024x334.png)
AT+SEND2 Hello Przemek 2
Odbieramy dane z chmury
Aby odbierać dane przesyłane z chmury należy oczywiście zasobskrybować się do odpowiedniego topica. Nas będzie interesował My First Topic, subskrybcję wykonamy więc za pomocą polecenia:
AT+SUBSCRIBE1
Gdybyśmy chcieli zasubskrybować się do kolejnych topiców to polecenie jest podobne do tego wysyłającego dane AT+SUBSCRIBE#, gdzie # to ponownie numer skonfigurowanego w urądzeniu topica.
Jeżeli subskrypcję mamy za sobą, to wracamy do konsoli AWS, gdzie przechodzimy do zakładki Publish to a topic, podajemy identufikator urządzenia i nazwę topica.
Po wysłaniu wiadomości wracamy do terminala urządzenia i pobieramy dane z topica nr 1:
AT+GET1
Jeżeli wszystko poszło dobrze, to powinniśmy zobaczyc wysłaną z AWS wiadomość.
Podsumowanie
WOW!!! Tak, jestem pod wrażeniem. Całość konfiguracji i komunikacja z AWS przebiegła bardzo sprawnie. To działa.
Od dłuższego czasu mówię, że AWS stara się „ukryć” przed nami chmurę i po prostu umożliwić nam korzystanie z ich zasobów. Tu mamy kolejny krok. Tym razem w ramach IoT. Możemy spokojnie dać takie urządenie developerowi, który nie ma wiedzy o AWS, nawet komuś, kto nie ma pojęcia w ogóle o tym, co jest po drugiej stronie.
To co zrobimy z danymi po stronie chmury to inna sprawa, ale ktoś kto ma pojęcie o demenie biznesowej, o tym co chce osiągnąć pod kątem użytkowym w urządzeniu IoT będzie w stanie pracować z usługami IoT w AWS. Być może nawet o tym nie wiedząc.