nostro precedente articolo <\/a>abbiamo presentato una panoramica del mondo IoT su Amazon Web Services. Grazie ai suoi serivzi, AWS ci offre molti vantaggi per la realizzazione di applicazioni IoT sul cloud come ad esempio la possibilit\u00e0 di avere un punto centralizzato di gestione e monitoring dei device grazie ai servizi managed, sempre disponibili, in alta disponbilit\u00e0 e con scaling gestito. <\/p>\n\n\n\nIn questo articolo entreremo nel dettaglio di una parte specifica dell\u2019ecosistema IoT su AWS: il motore delle regole. <\/p>\n\n\n\n
Case study: Smart cities<\/h2>\n\n\n\n I servizi correlati al mondo IoT su AWS sono in continua espansione. In questo articolo analizzeremo per\u00f2 le componenti principali, agendo direttamente da console.<\/p>\n\n\n\n
Vedremo infatti come configurare un dispositivo simulando l\u2019invio di alcuni dati da esso, per poi innescare azioni specifiche basate su di essi. Come trattato nell\u2019articolo precedente, questi messaggi vengono invati e ricevuti attraverso protocollo MQTT<\/strong> tramite un meccanismo di publisher\/subscriber. Su AWS \u00e8 supportato anche il protocollo HTTP\/HTTPS, ma in contesti IoT di un certo tipo \u00e8 preferibile il protocollo MQTT. Non entreremo nel merito di questa scelta dato che non \u00e8 lo scopo di questo articolo e in parte \u00e8 stato trattato nel precedente.<\/p>\n\n\n\nPer dare contesto alla parte pratica, immaginiamo di realizzare un\u2019applicazione IoT per un progetto di Smart Cities. Parliamo quindi di uno scenario urbano in cui sono presenti dispositivi di vario tipo, in grado di mandare continuamente (e non, in base alla connettivit\u00e0) i loro dati su cloud ed eseguire delle azioni specifiche se valutate opportumanente.<\/p>\n\n\n\n
Things setup<\/h2>\n\n\n\n Iniziamo il deep-dive <\/em>creando degli oggetti (Things) <\/em>su IoT Core. Per entrare nel merito dello use case, immaginiamo di dover configurare dei sensori installati su lampioni, impianti di irrigazione o semafori per la regolazione intelligente del traffico. Entrando nella sezione AWS IoT<\/em> sulla console, sotto la voce di men\u00f9 Manage, <\/em>sar\u00e0 possibile creare degli oggetti – Things, appunto – configurandone alcune propriet\u00e0, come la loro associazione a un gruppo, ad una categoria o ad una tipologia di billing. Inoltre, \u00e8 possibile assegnare dei tag specifici (attributi) che potranno essere usati nell\u2019intero ecosistema AWS IoT. Nel nostro caso, abbiamo assegnato come attributo il nome della citt\u00e0 di appartenenza dell\u2019oggetto:<\/p>\n\n\n\n<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Nella fase di creazione degli oggetti sar\u00e0 necessario scaricare i certificati associati ad essi. I certificati verranno utilizzati dal dispositivo stesso per poter inoltrare messaggi sui topic MQTT. In questo articolo non entreremo nel dettaglio delle varie modalit\u00e0 con cui \u00e8 possibile scaricare i certificati sul dispositivo, per ora ci limitiamo a considerare il caso di dispositivi gi\u00e0 presenti sul campo e dotati di certificati. <\/p>\n\n\n\n
[Spoiler: questa parte verr\u00e0 descritta nel dettaglio nel prossimo articolo della nostra serie dedicato al Device management!]<\/em><\/p>\n\n\n\nAd ogni modo, consigliamo di salvare i certificati su un bucket S3 privato, in modo che possano essere disponibili per ogni evenienza. Per completezza, i certificati associati ad un dispositivo possono essere pi\u00f9 di uno ed \u00e8 possibile recuperarli, se necessario.<\/p>\n\n\n\n
Device shadow<\/h2>\n\n\n\n In fase di configurazione dei nostri dispositivi abbiamo scelto di utilizzare il Classic Shadow<\/strong>.<\/em><\/p>\n\n\n\nMa cos\u2019\u00e8 lo shadow di un device? Lo shadow \u00e8 la rappresentazione virtuale del dispositivo, fruibile da altre applicazione, indipendentemente dal loro stato di connessione. Lo stesso device, le web application e numerosi altri servizi possono creare, aggiornare, cancellare i shadows usando vari canali, tra cui i topic MQTT. Gli shadows sono salvati sul cloud di AWS e quindi sempre disponibili.<\/p>\n\n\n\n
Di default, sono disponibili alcuni topic MQTT tramite qui \u00e8 possibile gestire lo shadow:<\/p>\n\n\n\n
<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Per la nostra applicazione IoT possiamo ovviamente creare ulteriori topic MQTT, ma questi non potranno gestire lo shadow del device.<\/p>\n\n\n\n
I dati del dispositivo sono rappresentati nello shadow sottoforma di documento in formato JSON conentente appunto lo stato del device, diviso nelle seguenti parti:<\/p>\n\n\n\n
Desiderd<\/strong>: Lo stato desiderato dalle applicazioni che interagiscono con il dispositivo<\/li>Reported<\/strong>: Lo stato corrente riportato dal dispositivo<\/li>Delta<\/strong>: Differenza tra desired <\/em>e reported<\/em>. Questa parte dello shadow \u00e8 gestita in automatico da AWS IoT.<\/li><\/ul>\n\n\n\nEcco un esempio di shadow per i lampioni della nostra smart city:<\/p>\n\n\n\n
{\n \"state\": {\n \"reported\": {\n \"light_sensor\": 80,\n \"light_actuator\": \"on\",\n \"last_clean_in_days\": 67\n },\n \"desired\": {\n \"light_sensor\": 80,\n \"light_actuator\": \"off\",\n \"last_clean_in_days\": 67\n },\n \"delta\": {\n \"light_actuator\": \"off\"\n }\n }\n}<\/code><\/pre>\n\n\n\nRule engine<\/h2>\n\n\n\n Eccoci finalente alle Rules! <\/em>Le regole conferiscono l\u2019abiit\u00e0 ai nostri device di interagire con i servizi AWS. In un approccio completamente event-driven<\/strong>, le regole vengono analizzate ogni volta che arrivano eventi sui topic MQTT.<\/p>\n\n\n\nMa cosa possiamo fare con le regole? Le action <\/em>possibili sono molteplici, la maggior parte di essere riguardano integrazioni native con altri servizi AWS. <\/p>\n\n\n\nVediamo alcuni esempi:<\/p>\n\n\n\n
Filtrare o arricchire i dati ricevuti dai dispositivi, prima di inoltrarli ad altri servizi<\/li> Scrivere i dati su vari data sources, come S3, DynamoDB e Timestream<\/li> Inoltrare i dati a Cloudwatch per far scattare allarni, aggiornare metriche o salvare dei log<\/li> Invocare funzioni Lambda o Step functions<\/li><\/ul>\n\n\n\nUno statement SQL semplificato, creato ad hoc per IoT Core, definisce la nostra regola. Essa viene valutata ogni volta che un device inoltra un messaggio su un topic MQTT. Se esiste un matching tra il messaggio e la regola, allora verranno attivate una o pi\u00f9 azioni.<\/p>\n\n\n\n
Lo statement SQL viene definito come di seguito:<\/p>\n\n\n\n
SELECT<\/strong>: Estrae informazioni dal payload di un evento in ingresso. E\u2019 possibile trasformarlo utilizzando anche funzioni rese gi\u00e0 disponibili da AWS.<\/li>FROM: <\/strong>Qui viene ideinfiticato il topic MQTT su cui la regola \u00e8 in ascolto.<\/li>WHERE (opzionale): <\/strong>Fase in cui possiamo aggiungere ultriori condizioni che determinano quando al regola dev\u2019essere valutata positivamente.<\/li><\/ul>\n\n\n\nPossiamo riassumere gli step effettuati dalle regole come di seguito:<\/p>\n\n\n\n
Una regola viene valutata se \u00e8 in arrivo un messaggio sul topic MQTT selezionato.<\/li> La regola viene verificata secondo le clausole riportate dopo il WHERE<\/li> Se la regola viene verificata, delle azioni vengono triggerate.<\/li><\/ul>\n\n\n\nNon preoccupatevi, nel prossimo capitolo vedremo alcuni esempi di SQL statement.<\/p>\n\n\n\n
Hands-on!<\/h2>\n\n\n\n Prima di entrare nel dettaglio del motore delle regole, ritorniamo al nostro caso d\u2019uso: le Smart cities.<\/p>\n\n\n\n
Semplificando, possiamo immaginare la parte di ingestion degli eventi con un\u2019architettura infrastrutturale di questo tipo:<\/p>\n\n\n\n
<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Ipotizziamo di voler rendere \u201cintelligenti\u201d molteplici citt\u00e0. Sul campo, avremo una serie di sensori dislocati fisicamente in punti geografici diversi, ognuno con difficolt\u00e0 di accesso alla connettivit\u00e0.<\/p>\n\n\n\n
I device inoltreranno i propri dati su vari topic MQTT. Per la nostra infrastruttura abbiamo ipotizzato 3 regole:<\/p>\n\n\n\n
Regola di Ingestion<\/strong>: Tutti i dati in arrivo su un topic MQTT, vengono inoltrati a Firehose\/S3 e Timestram per memorizzazione storica.<\/li>Regole di action<\/strong>: Le altre 2 regole vengono valutate positivamente solo in alcuni casi specifici, ovvero quando il sistema rileva che bisogna accendere o spegnere i lampioni o gli irrigatori della nostra Smart City.<\/li><\/ul>\n\n\n\nEccole riportate in console:<\/p>\n\n\n\n
<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Vediamo nel dettaglio come \u00e8 composta una di queste regole e prendiamo ad esempio quella di ingestion. La sintassi SQL di questa regola risulta molto semplice:<\/p>\n\n\n\n
<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Nella sezione Rule query statement <\/em>si pu\u00f2 notare come vengano selezionati tutti i parametri in ingresso sul topic $aws\/things\/+\/shadow\/update\/accepted.<\/p>\n\n\n\nQuesta regola viene valutata positivamente ogni volta che un quaslsiasi dispositivo (grazie alla wildcard \u201c+\u201d presente nella clausola FROM) inoltra un messaggio di update correttamente formattato.<\/p>\n\n\n\n
Come azioni abbiamo configurato l\u2019inoltro dei dati su S3, passando da Kinesis Firehose, e su Timestream, il database serverless gestito da AWS per le time series.<\/p>\n\n\n\n
E\u2019 possibile selezionare fino a 10 action per regola. Opzionalmente si pu\u00f2 anche configurare una regola per gestire gli errori in fase di processamento della regola stessa.<\/p>\n\n\n\n
Analizziamo ora le altre 2 regole, quelle utilizzate per comandare accensione, spegnimento o qualsiasi attuatore della nostra smart citiy.<\/p>\n\n\n\n
Prendendo ad esempio la regola di accensione, lo statement SQL sar\u00e0 formattato come di seguito:<\/p>\n\n\n\n
SELECT topic(3) as device_id,* FROM '$aws\/things\/+\/shadow\/update\/accepted' where state.reported.light_sensor < 60 and state.reported.light_actuator = 'off'<\/code><\/pre>\n\n\n\n<\/p>\n\n\n\n
Con questa regola stiamo filtrando per campi specifici nel device shadow riportato dal device. Inoltre, nella clausola di select vediamo come recuperare l\u2019identificativo del device, aspetto fondamentale in quanto la regola viene valutata per ogni device, grazie alla wildcard \u2018+\u2019.<\/p>\n\n\n\n
Il payload riportato nella SELECT verr\u00e0 poi inoltrato ad una Lambda function che gestir\u00e0 effettivamente le logiche di business e comunicher\u00e0 con i device. <\/p>\n\n\n\n
Come pu\u00f2 avvenire questa comunicazione? Sempre attraverso i nostri topic MQTT! Come le IoT Rule sono in ascolto su dei topic MQTT, anche i device possono essere in ascolto su questi topic, reagendo anch’essi a nuovi eventi.<\/p>\n\n\n\n
Vediamo ora come testare il tutto. Nel pannello IoT Core, \u00e8 presente la voce di men\u00f9 Test <\/em>tramite cui si pu\u00f2 trovare un client MQTT. Da qui possiamo sottoscriverci e pubblicare messaggi su topic MQTT a nostro piacimento, senza quindi avere un dispositivo realmente sul campo.<\/p>\n\n\n\n<\/p>\n\n\n\n <\/figure>\n\n\n\n<\/p>\n\n\n\n
Conclusione e osservazioni<\/h2>\n\n\n\n In questo articolo abbiamo visto com\u2019\u00e8 possibile approcciarsi in modo relativamente semplice al mondo IoT e abbiamo visto come i servizi offerti da AWS possono aiutare a ridurre notevolmente il time to market.<\/p>\n\n\n\n
Una domanda potrebbe sorgere spontanea: perch\u00e8 \u201ccomplicarci\u201d la vita \u00e8 progettare un sistema cos\u00ec articolato quando potrei demandare tutta la gestione ai dispositivi? <\/p>\n\n\n\n
La risposta \u00e8 semplice: Gestione Centralizzata<\/strong>.<\/p>\n\n\n\nSfruttando il cloud, possiamo infatti centralizzare tutta la gestione, demandando la mera funzionalit\u00e0 di sensoristica ai nostri dispositivi IoT sul campo per poi gestire in un unico punto tutte logiche<\/strong> delle nostre applicazioni. I sistemi informatici sono in continuo cambiamento e aggiornamento. Immaginate di dover rilsaciare un quaslasi update software, ogni volta, su tutti i dispositivi (tra l\u2019altro, questa \u00e8 una feature disponibile con IoT greengrass<\/em>)…<\/p>\n\n\n\nPer questo primo deep-dive nell\u2019ecosistema IoT su AWS \u00e8 tutto. Appuntamento al terzo capito della nostra serie per parlare della gestione dei device<\/strong>. <\/p>\n\n\n\nIscriviti alla newsletter di Proud2beCloud<\/a> per essere avvisato! <\/p>\n","protected":false},"excerpt":{"rendered":"Introduzione L\u2019Internet of Things (IoT) \u00e8 diventato uno dei termini pi\u00f9 cool e ricercati degli ultimi tempi in ambito di […]<\/p>\n","protected":false},"author":14,"featured_media":4160,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[477],"tags":[442,412],"class_list":["post-4154","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud-native-development","tag-aws-iot","tag-internet-of-things-iot"],"yoast_head":"\n
Deep dive in IoT core rules: Guida pratica e casi d\u2019uso - Proud2beCloud Blog<\/title>\n \n \n \n \n \n \n \n \n \n \n \n\t \n\t \n\t \n \n \n \n \n \n \n\t \n\t \n\t \n