Skip to content
Snippets Groups Projects
relazione.md 17.97 KiB

Introduzione

Il progetto presentato dal gruppo2 si occupa di fornire ad un utente funzionalità di domotica in una LAN. Le funzionalità sviluppate sono le seguenti: controllo remoto delle luci, sistema di antifurto e metodo di deterrenza delle intrusioni.

1. Specifiche funzionali

1.1. Controllo tramite sensori ed attuatori

Il sistema nella LAN è costituito da una beaglebone (con attuatori e led) e un arduino (che presenta un sensore di luminosità).

Gli attuatori simulano gli interruttori e i sensori di movimento. I sensori di movimento permettono il controllo dell'allarme dell'antifurto e, assieme agli interruttori e al sensore di luminosità, dello stato delle luci.

1.2. Accessibilita' via internet

I servizi in cloud consistono di un server che fornisce una webapp, con la quale è possibile controllare gli elementi della LAN; il servizio di autenticazione con Keycloak; il domain manager, responsabile di mantenere la consistenza dei dati; e il cloud app manager, il quale s'interfaccia con il broker mosquitto che è connesso in bridge con la beaglebone della LAN.

I servizi sono stati resi sicuri con l'implementazione di HTTPS e per il broker con TLS (e WSS).

2. Analisi

2.1. Installazione del sistema in reti private

L'installazione del sistema avviene senza configurazioni particolari poiché l'uso di mosquitto, con la configurazione da noi impostata, rende il sistema plug-n-play, ovvero è sufficiente collegarlo alla rete domestica per avere le funzionalità richieste disponibili.

2.2. Accessibilita' da rete pubblica e da rete privata

La connettibilità è indistintamente garantita sia all'interno della LAN sia al suo esterno grazie all'impiego di brokers Mosquitto, tutti connessi grazie all'utilizzo del bridging. Questo permette ai microservizi di comunicare come se fossero nella stessa LAN.

In ogni caso, per accedere al servizio, l'utente deve autenticarsi sia per osservare lo stato dei microservizi che per inviare comandi. Il login è gestito grazie a Keycloak che autorizza l'accesso alla webapp, interfacciata al resto del sistema. Grazie a questa caratteristica, l'accesso può avvenire sia dalla rete pubblica che da quella privata, senza distinzioni.

2.3. Caratteristiche del traffico dati da sostenere e vincoli in tempo reale

Essendo un sistema di domotica, è necessario che i comandi impartiti dall'utente vengano attutati una ed una sola volta ed in tempo utile, in modo tale da non inficiare l'esperienza dell'utente che risulta quindi al pari o migliore della sua esperienza analogica.

La quantità di traffico da gestire non è eccessiva, poiché le uniche 2 fonti di produzione di messaggi (oltre a quella umana) sono il servizio della GPIO, che pubblica a tempo costante di 10s; ed il microservizio dell'antifurto, che pubblica ogni 8s. La componente umana non è precisamente quantificabile, ma proporzionale nella quantità di messaggi prodotti rispetto al numero di lampadine, sensori e interruttori utilizzati da ogni dominio.

2.4. Tecniche viste a lezione con cui soddisfare i requisiti

Per soddisfare i requisiti, è possibile usare delle chiamate REST o il protocollo MQTT. Entrambe queste modalità sono utilizzabili poiché permettono la comunicazione tra servizi diversi.

L'implementazione di microservizi riduce il tempo di installazione grazie alla dimensione inferiore dei file che ogni microservizio richiede. Inoltre la scalabilità del sistema viene semplificata di molto perché tutti i microservizi sono connessi e ognuno counica su un topic differente almeno per dominio e sottodominio.

3. Approccio tecnologico

3.1. Vantaggi dell'uso di un message broker e come lo giudichiamo rispetto alle altre scelte

Il message broker risulta fondamentale nello sviluppo di un'applicazione formata da vari microservizi, poiché permette a questi di registrarsi all'ascolto di topic specifici dai quali ricevere i messaggi degli altri microservizi. In questo modo il lavoro svolto da ogni microservizio è inferiore rispetto ad un progetto dello stesso tipo che non si avvale dell'utilizzo di mqtt.

L'utilizzo di mosquitto assicura il recapito di oggi messaggio nel numero a noi necessario.

La scelta effettuata risulta migliore rispetto all'uso di chiamate REST per la sua scalabilità. Volendo rappresentare il sistmea con un grafo non orientato in cui i nodi sono i microservizi e gli archi rappresentanti delle connessioni tra di essi, grazie al message broker otteniamo un grafo molto più sparso, in cui i microservizi comunicano con il message broker centrale, anzichè istanziare una connessione per ogni altro microservizio. Anche la manutenibilità migliora.

4. Architettura del software

4.1. Organizzazione del software (evidenziandone i moduli)

4.1.1. Webserver e Webapp

Il Webserver, configurato per usare HTTPS, fornisce la Webapp al client grazie all'uso di API REST. Il Webserver è in grado di gestire molteplici sessioni allo stesso tempo grazie all'implementazione di Threads.

La Webapp può comunicare con il Message Broker grazie al protocollo MQTT, con il server di autenticazione (Keycloak) con l'utilizzo di token JWT e con il Domain Manager grazie all'uso di API REST.

4.1.2. Keycloak

4.1.3. Domain Manager

Il Domain Manager è un microservizio che opera in cloud, con funzionalità sia da server REST sia da client che interagisce con il database (DB) dell'intero sistema. Si occupa di soddisfare le richieste provenienti dalla Webapp, controllandone la validità e la consistenza con il DB e inoltrarle al Cloud App Manager (CAM). Dopo aver verificato l'autorizzazione tramite token di Keycloak interagisce con il DB ed effettua la chiamata al CAM. Terminate queste due interazioni, viene servita la risposta alla Webapp. => poco chiaro (Alfredo)

4.1.4. BeagleBone (BB)

  • Luci

Microservizio che opera in LAN che si occupa di gestire l'accensione e lo spegnimento delle lampadine sia tramite interruttore sia tramite sensori di movimento. I comandi e gli stati delle lampadine vengono letti e scritti su due topic distinti del broker Mosquitto presente sulla BB. La persistenza dello stato del microservizio è mantenuta in locale su un file testuale in formato JSON, che viene aggiornato ad ogni variazione dello stato, ad esempio accensione o spegnimento di una lampadina, aggiunta di una nuova lampadina e modifica del sensore di movimento.

  • Scenari

Gestisce la deterrenza delle intrusioni riproponendo uno schema di accensione e spegnimento delle luci quando l'utente attiva l'antifurto. Lo schema segue precisamente lo stato delle luci scelto dall'utente dopo che questo ha attivato la modalità di apprendimento; una volta disattivata, lo schema è disponibile poiché viene immediatamente salvato su un file come sequenza di JSON. La persistenza è garantita grazie all'uso di tre file che vengono aggiornati in momenti diversi: uno ricorda quale schema è attivo; il secondo permette il funzionamento dell'automa e memorizza lo stato attuale; mentre il terzo è usato per salvare gli interruttori e la luce attualmente in uso.

  • Antifurto

4.1.5. Arduino

Questo componente della LAN scrive sul broker Mosquitto della BB i valori del sensore di luminosità, usato dal microservizio delle luci. Questo microservizio usa il valore del sensore di luminosità per decidere se l'ambiente è abbastanza buio da dover accendere le luci nel caso in cui il sensore di movimento invii un messaggio.

4.1.6. Cloud App Manager

4.1.7. Broker Mosquitto (smartcity)

(cosa c'è da scrivere?)

4.2. Distribuzione delle funzionalità tra i moduli, attività e loro interazione

(ognuno si scriva i suoi 2) (cosa fa ogni modulo)

5. Descrizione dell'implementazione

5.1. UML delle classi implementate

  • DomainManager

La classe principale del DomainManager è Domain.java. Essa funge da server REST su Https. Espone le rotte che vengono richiamate dalla WebApp per avviare, installare, creare ed eliminare i domini, oltre a fornire servizi per la corretta visualizazione degli elementi in app. Prima di operare da server esso effettua una chiamata al nostro repository gitlab per popolare la tabella dei moduli del DB. In qualità di server si avvale di un threadPoolExecutor e per ogni nuova chiamata istanzia un nuovo thread per servirla. A seconda dell'URI richiamato viene istanziato un handler diverso, che verifica il token JWT tramite la classe Helper che a sua volta richiama TokenHandler. Da qui viene effettuata una chiamata all'URI della nostra istanza di Keycloak per ottenere la chiave pubblica. Dopo di ciò il body del JWT che era stato precedentemente inviato nel payload della richiesta della Webapp viene firmato con la chiave pubblica e se il risultato è uguale alla firma inviata nel JWT stesso allora l'utente è verificato. Una volta verificato è possibile ottenere il nome dell'utente e distinguere i domini di cui è utente comune o amministratore. Da questo punto, a seconda dei servizi richiesti dalla WebApp, si aprono diversi scenari di interazione con il DB ed il CloudApp (Install, Delete, Start, Stop). Le chiamate si risolvono una volta che il CloudApp risponde al Domain, ossia possiamo considerare la chiamata al CloudApp incapsulata in termini di tempo all'interno della chiamata da parte della WebApp al Domain. La persistenza del sistema è affidata ad un DB SQLite locale.

  • Luci

Il microservizio Luci opera in LAN e serve a gestire l'accensione e spegnimento delle lampade nella casa. la classe principale è Luci.java che opera su un ArrayList di oggetti di tipo Luce, che è la struttura dati fondamentale per il funzionamento del microservizio. L'oggetto Luce è definito dal quartetto input, output, stato e nome. Input è la stringa "IN" seguita dal numero che rappresenta quella sorgente in input della GPIO, ovvero un attuatore. Output è la string "OUT" seguita dal numero che rappresenta quello specifico output della GPIO. Stato è un boolean che corrisponde all'accensione o spegnimento della lampadina. Nome è il nome della sala a cui appartiene la luce ed è il suo ID. La classe Subscriber serve a leggere i comandi dai topic e ad attuarli. Per essere istanziata necessita di un Esecutore, Luci ed il sensore di movimento. Esecutore è la classe che si occupa di attuare l'accensione a tempo delle luci, sfruttando un timer. Necessita di Luci per accedere all'ArrayList. Qualora dovesse arrivare un segnale di accensione da parte del sensore di movimento e le luci fossero già accese, Subscriber provvede ad eliminare il vecchio timer e istanziarne uno nuovo. Il sensore di luminosità presente sull'arduino impedisce ai sensori di movimento di operare se la stanza è troppo illuminata, ovvero se è giorno. Questo meccanismo è trasparente al sistema degli attuatori "tradizionali", quindi se un utente vuole accendere una luce tramite interruttore potrà farlo sempre e comunque. Ad ogni modifica dello stato delle luci corrisponde una modifica del file di stato locale (zona.json), al fine di mantenere le ultime impostazioni in caso di malfunzionamenti o cali di tensione. Questo file viene letto all'avvio del microservizio ed è ciò che garantisce la persistenza.

  • Webserver

Come il Domain Manager, anche il webserver espone delle API REST su HTTPS. Queste API sono richiamate dalla WebApp per ottenere i dati necessari per la visualizzazione delle pagine; in particolare restituiscono le pagine HTML, le immagini, i file CSS e JavaScript. Ogni richiesta viene gestita da un nuovo Thread, che legge il file e lo restituisce; una volta che il Thread ha terminato di rispondere ad una richiesta, viene eliminato; in questo modo il webserver non occupa risorse inutilmente ed è in grado di gestire molte richieste contemporaneamente. È anche presente la classe Helper, che permette di inviare le risposte HTTPS alla Webapp e di fare controlli ripetuti in varie altre classi.

  • Scenari

Il microservizio degli scenari contiene 4 classi fondamentali: Scenari, Automa, SubscribeCallback ed Esecutore. Scenari è la classe principale: fa partire il microservizio ed espone alle altre classi il metodo per l'invio dei messaggi MQTT, il path delle cartelle di configurazione e di risorse (nella quale si trova la cartella in cui sono salvati gli scenari) e gli IN e OUT in uso sulla GPIO. L'automa gestisce lo stato in cui si trova il microservizio, che può essere uno dei seguenti: spento, in fase di apprendimento e in fase di esecuzione. Questa classe espone i getter e setter dello stato, permettendo alle altre classi d'interfacciarsi. Per salvaguardare la persistenza, l'automa salva lo stato in cui si trova in un file di testo. SubscribeCallback è la classe che gestisce la ricezione dei messaggi MQTT. Quando riceve un messaggio, lo elabora con un metodo ad hoc che permette di gestirlo autonomamente. Esecutore è la classe che gestisce l'esecuzione degli scenari a partire dai file presenti nella cartella di risorse. Consiste di un ciclo infinito nel quale si leggono tutti gli scenari salvati e (nel caso in cui l'automa sia nella fase di esecuzione) si fa partire il primo utile, ovvero il primo scenario che ha un orario di esecuzione futuro. In caso contrario, il Thread si sospende per evitare computazione inutile. Sono inoltre presenti 2 classi di utilità: UserChangeSync ed Helper. La prima permette all'utente di modificare lo scenario attivo dalla Webapp e quindi di avere un vero impatto su quale scenario stia venendo usato. La seconda espone dei metodi che vengono usati da più classi.

5.2. Descrizione della UI

5.2.1. Autenticazione

La prima pagina che viene fornita serve per ridirigere l'utente alla pagina di login su Keycloak; per questo motivo è interamente vuota.

5.2.2. Lista di domini

In questa pagina vengono mostrati tutti i domini appartenenti all'utente autenticato. Nel caso in cui questi sia amministratore di un dominio, a destra dello stato viene mostrato un cestino, per poterlo eliminare; inoltre il bottone dello stato e' cliccabile, consentento la sua attivazione/spegnimento. Al contrario, se non e' un amministratore e il dominio e' attualmente attivo, egli puo' solamente accedere alla pagina d'interazione.

5.2.3. Interazione con il proprio dominio

Questa è la pagina principale del progetto, in cui si possono vedere tutti i dettagli del dominio installato. In alto si trovano fino a 3 bottoni che rappresentano i microservizi installati nel dominio scelto. Alla loro pressione, mostrano la UI relativa al loro microservizio, con la quale interagire per apportare modifiche.

  • Visione d'insieme

La pagina principale della Webapp permette l'interazione completa con il sistema. Questo significa che il suo utilizzo permette di avere sia una visione real-time di ciò che accade nella LAN, sia di comandare da remoto gli attuatori connessi.

All'avvio della Webapp, viene fatta una RPC ad ogni microservizio installato nel dominio per mostrare correttamente tutti i dati disponibili all'utente; inoltre viene richiesto al server se l'utente è in realtà l'amministratore del dominio, per mostrare funzionalità aggiuntive.

In alto si trovano fino a 3 bottoni che, una volta premuti, mostrano la pagina corrispondente al loro microservizio.

  • Luci

La pagina è formata da una tabella in cui sono mostrati il nome della luce ed il suo stato. La luce può venire accesa/spenta semplicemente cliccando lo switch che ne mostra lo stato.

Al fondo dell'elenco delle luci, è presente un bottone che permette la creazione di una nuova luce. Questo processo richiede all'utente di scegliere il luogo/nome della luce, un pulsante libero e un led libero della BBGPIO. Nel momento in cui la Webapp riceve la conferma di creazione dal microservizio, la luce appena creata viene mostrata a schermo.

  • Scenari

La pagina è composta da una tabella e da dei bottoni al fondo di essa. Nella tabella vengono mostrati gli scenari (il nome, la data di creazione e lo stato). I bottoni permettono di attivare la funzione di apprendimento e l'antifurto. Nel caso in cui il visualizzatore sia l'amministratore del dominio, è anche presente un terzo bottone per modificare gli interruttori usati.

In ogni momento è possibile cambiare lo stato attuale in quello di apprendimento, di antifurto o di attesa.

Mentre l'antifurto è spento, tutti gli scenari sono spenti e non è possibile attivarli; viceversa all'attivazione dell'antifurto viene immediatamente attivato uno scenario da parte del microservizio, che può essere cambiato (attivando uno scenario diverso) o disabilitato (spegnendo lo scenario attivo).

  • Antifurto

La pagina presenta una barra di attenzione, una campanella e lo stato dell'antifurto; inoltre nel caso in cui si sia amministratore del dominio, è presente un pulsante che permette la configurazione delle porte, l'aggiunta di un sensore di movimento e la modifica della soglia (ovvero del valore oltre il quale far scattare l'allarme).

Dalla Webapp, un utente normale può solamente attivare/disattivare l'antifurto e controllare il valore a cui è arrivato l'antifurto (oltre a sapere se l'allarme è stato attivato).

6. Validazione del software

6.1. Procedure usate per verificare il corretto funzionamento del sistema