Il progetto presentato dal gruppo2 si occupa di fornire ad un utente funzionalità di domotica in una LAN, controllabili anche dall'esterno.
L’obiettivo del nostro progetto è realizzare:
- un sistema di controllo delle luci
- meccanismi di deterrenza delle intrusioni
I metodi di deterrenza delle intrusioni che abbiamo sviluppato sono due:
- sistema di antifurto
- un sistema di controllo delle luci;
- un sistema di antifurto;
- scenari di accensione e spegnimento automatico delle luci
L'utente ha la possibilità di attivare solo l'antifurto o attivare sia l'antifurto sia la riproduzione di uno scenario.
L’accesso all’intero sistema è controllato tramite autenticazione con OAUTH2.0.
# 1. Specifiche funzionali
## 1.1. Controllo tramite sensori ed attuatori
Il sistema nella LAN è costituito da una BeagleBone (BB), con attuatori e led; e un Arduino, a cui è collegato un sensore di luminosità.
Il sistema nella LAN è costituito da una BeagleBone (BB) e un Arduino. Sulla BB sono presenti pulsanti e led, mentre sull'Arduino è collegato un sensore di luminosità.
Gli attuatori simulano gli interruttori e i sensori di movimento.
I pulsanti simulano gli interruttori e i sensori di movimento.
L’accensione e lo spegnimento dell’antifurto è controllato da un interruttore presente sulla BeagleBone. I sensori di movimento consentono il controllo dell'allarme dell'antifurto. Due led permettono di capire se l’antifurto è spento, acceso o sta suonando.
L’accensione e lo spegnimento dell’antifurto è controllato da un interruttore presente sulla BB. I sensori di movimento consentono il controllo dell'allarme dell'antifurto. Due led permettono di capire se l’antifurto è spento, acceso o sta suonando.
Ciascuna luce configurata nel sistema usa un interruttore e un led. Il sensore di luminosità insieme a un sensore di movimento permettono l’accensione automatica delle luci al passaggio delle persone durante la notte.
E’ possibile avviare e interrompere la modalità di apprendimento negli scenari di accensione e spegnimento delle luci premendo un apposito interruttore.
È possibile avviare e interrompere la modalità di apprendimento negli scenari di accensione e spegnimento delle luci premendo un apposito interruttore.
## 1.2. Accessibilità via internet
<!-- ELISA: questo secondo me non è ciò richiesto in questo punto. Quanto scritto qui rientra nella descrizione dell'architettura.
IO DIREI CIO' CHE HO SCRITTO NELLA SLIDE -->
I servizi in Cloud consistono nei seguenti servizi:
- Sistema di autenticazione per l'accesso ai servizi basato su Token JWT (JSON Web Token)
- Webserver che fornisce una Webapp, con la quale è possibile controllare gli elementi nella LAN
- Domain Manager (DM) per la gestione dei domini e dei relativi servizi e responsabile di mantenere la consistenza dei dati
- Cloud App Manager (CAM), che s'interfaccia con il broker mosquitto connesso in bridge con la BB nella LAN.
- Broker MQTT per la comunicazione tra i servizi (in bridging con smartcity-challenge)
Questi servizi sono stati resi sicuri con l'implementazione di HTTPS e WSS usando dei certificati self-signed.
# 2. Analisi <!-- nelle slide l'ho un po' ristrutturato -->
Il sistema, installato in una rete privata, è accessibile via internet.
L’autenticazione è basata sul protocollo OAUTH2.0, implementato tramite Keycloak.
La sicurezza è garantita dall’uso dei protocolli HTTPS e WSS.
Dopo aver effettuato l’accesso al sistema, l’utente può controllare e gestire i vari microservizi, installati nella LAN, navigando nella webapp.
# 2. Analisi
## 2.1. Installazione del sistema in reti private
Il sistema deve essere installato in reti private senza dover intervenire con configurazioni che riguardino l’apparato di rete.
L'installazione del sistema avviene senza configurazioni particolari: utilizzando mosquitto con la configurazione da noi impostata, è sufficiente collegare il sistema alla rete internet per avere le funzionalità richieste disponibili.
## 2.2. Accessibilità da rete pubblica e da rete privata
L’uso di brokers mosquitto connessi in bridging garantisce l’accessibilità del sistema sia all'interno della LAN sia al suo esterno.
<!-- La connettibilità è indistintamente garantita sia all'interno della LAN sia al suo esterno grazie all'impiego di brokers Mosquitto, connessi in bridging. -->
<!-- Questo permette ai microservizi, alla Webapp ed al CAM di comunicare come se fossero nella stessa LAN. ELISA: questa frase non è totalmente corretta: il CAM non comunica con i microservizi. Il CAM serve solo nel momento dell'install, start e stop. Quindi se proprio vogliamo aggiungere qualcosa, io direi la frase scritta qui sotto -->
La webapp può connettersi a un broker nella LAN o a un broker in cloud, consentendo così all'utente di controllare tutti i suoi servizi indipendentemente dal luogo in cui si trova.
Il sistema deve essere accessibile dalla rete pubblica senza differenze rispetto all’accesso da rete interna.
L’uso di brokers mosquitto (in LAN e in Cloud) connessi in bridging garantisce l’accessibilità del sistema sia all'interno della LAN sia al suo esterno.
La webapp, connettendosi a uno di questi broker, permette all'utente di controllare tutti i suoi servizi.
In ogni caso, per accedere al servizio l'utente deve autenticarsi sia per osservare lo stato dei microservizi che per inviare comandi.
In ogni caso, per accedere al servizio l'utente deve autenticarsi.
Il login è gestito grazie a Keycloak che autorizza l'accesso alla Webapp.
## 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 attuati una ed una sola volta ed in tempo utile, in modo tale da non inficiare l'esperienza dell'utente che deve risultare al pari o migliore dell'esperienza analogica.
La quantità di traffico da gestire è appropriata. Le uniche 2 fonti di produzione di messaggi del sistema sono il servizio della BBGPIO, che pubblica a tempo costante di 10s; ed il microservizio dell'antifurto, che pubblica ogni 30s.
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 in un determinato momento.
<!-- La quantità di traffico da gestire non è eccessiva poiché le uniche 2 fonti di produzione di messaggi del sistema <!--(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 in un determinato momento. -->
Essendo un sistema di domotica, è necessario che i comandi impartiti dall'utente vengano attuati una ed una sola volta ed in tempo utile, in modo tale da non inficiare l'esperienza dell'utente che deve risultare al pari o migliore dell'esperienza analogica.
## 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. -->
<!-- Secondo me dovremmo scrivere qualcosa di più -->
<!-- ELISA io dire quanto scritto qui sotto -->
Le tecniche viste a lezione sono:
- RPC e API REST
- Message brokers e implementazione di un'architettura event-driven
# 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.
<!-- Permette a questi di sottoscrivere topic specifici sui quali ricevere messaggi.
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. -->
Permette la comunicazione tra i vari microservizi, basandosi sul modello produttore consumatore.
Un message broker permette di separare i problemi della comunicazione dalla business logic del servizio.
La scelta effettuata è stata quella di usare un message broker.
## 3.1. Vantaggi dell'uso di un message broker
Il message broker risulta fondamentale nello sviluppo di un'applicazione formata da vari microservizi, permettendone la comunicazione. Inoltre facilita la separazione dei problemi della comunicazione dalla business logic del servizio.
<!-- il punto qui sotto non mi convince molto.. -->
La scelta effettuata risulta migliore rispetto all'uso di chiamate REST per la sua scalabilità.
Volendo rappresentare il sistema 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.
L'utilizzo di mosquitto assicura il recapito di ogni messaggio nel numero a noi necessario (impostando il QoS a 2 si riceve uno e un solo messaggio).
La scelta di utilizzare il protocollo MQTT è dovuta al fatto che è un protocollo molto semplice e leggero, che permette di inviare messaggi in modo veloce e sicuro. Questo protocollo permette di evitare l'invio di messaggi a tutti i microservizi: solo quelli che sono effettivamente interessati al messaggio lo riceveranno.
La centralità del message broker permette la sincronizzazione di tutti i dispositivi ad esso connessi in tempo reale. A differenza dell'utilizzo di RPC, questa soluzione evita lo spreco di risorse causato dal polling dei dispositivi.
L'utilizzo di mosquitto assicura il recapito di ogni messaggio nel numero a noi necessario (impostando il QoS a 2 si riceve uno e un solo messaggio).
La scelta di utilizzare il protocollo MQTT è dovuta al fatto che è un protocollo molto semplice e leggero, che permette di inviare messaggi in modo veloce e sicuro. Inoltre questo protocollo permette di evitare l'invio di messaggi a tutti i microservizi: solo quelli che sono effettivamente interessati al messaggio lo riceveranno.
Anche la manutenibilità migliora: infatti, se si volesse modificare un microservizio, non sarebbe necessaria la modifica del codice di tutto il sistema, ma solo quello del microservizio in questione. Tramite la modifica delle access list è infatti possibile permettere o negare l'accesso a un topic specifico. <!-- questo però è un vantaggio dell'architettura a microservizi, in contrapposizione con l'architettura tradizionale client-server. Quindi non so se ha senso inserilo tra i vantaggi nell'utilizzo dei message broker. -->
# 4. Architettura del software
## 4.1. Organizzazione del software (evidenziandone i moduli)
Nel sistema troviamo:
- La LAN domestica
- Il Cloud
- Il Webserver
- Il domain manager
- L'istanza di Keycloak per l'autenticazione.
- l'istanza di Keycloak per l'autenticazione,
- il Webserver,
- il Domain Manager,
- il Cloud App Manager,
- i broker connessi in bridging,
- la LAN domestica.
L'istanza di Keycloak si occupa di gestire l'autenticazione degli utenti. Se l'autenticazione ha successo, rilascia un Token JWT (JSON Web Token), utilizzato ogni volta che l'utente accede alle risorse.
L'istanza di Keycloak si occupa di gestire l'autenticazione degli utenti.
Il client che esegue nel browser effettuerà chiamate al webServer per ottenere risorse, potendo così mostrare le pagine all'utente.
Il DM espone un'interfaccia REST, consentendo all'utente che naviga nel browser di effettuare chiamate per installare, avviare, fermare o cancellare domini.
Il DM espone un'interfaccia REST, consentendo all'utente che naviga nel browser di effettuare chiamate per installare, avviare, fermare o cancellare domini.
Il CAM, a seguito di chiamate REST da parte del domain manager, pubblica opportuni messaggi sul mosquitto presente sul cloud, connesso in bridging con il mosquitto presente sulla BB.
Nella LAN è presente la porzione di sistema che si occupa di comandare le luci, l'allarme e gli scenari.
Nella LAN è presente la porzione di sistema che si occupa di comandare le luci, l'antifurto e gli scenari.
Essa è composta da una BB e da un Arduino.
Sulla BB è in esecuzione un broker Mosquitto, a cui si collegano i vari microservizi e il programma in esecuzione sull'Arduino.
...
...
@@ -106,14 +87,10 @@ Il Webserver fornisce la webapp. L'utente, navigando nella webapp, può controll
## 4.2. Distribuzione delle funzionalità tra i moduli, attività e loro interazione
<!-- (ognuno si scriva i suoi 2)
(cosa fa ogni modulo) -->
### 4.2.1. Webserver e Webapp
Il Webserver, implementato come server HTTPS concorrente, fornisce la Webapp al client grazie all'uso di API REST.
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 DM tramite API REST.
### 4.2.2. Keycloak
### 4.2.1. Keycloak
#### Responsabile: Elisa Giglio
<!-- DA FINIRE: spiegare meglio richiesta token e successivi con refresh, logout, interazione con Domain, ovvero ogni chiamata ha il token. Eventualmente scrivere gli utenti creati su keycloak, il fatto che ho creato il realm test00 -->
L'autenticazione è gestita con Keycloak. Per ottenere il "grant" di accesso è stata utilizzata la sequenza "Authorization Grant con PKCE".
La pagina iniziale si trova all'url https://localhost:3000/
Il Webserver fornisce al browser una pagina vuota contentente solo un link (non visibile all'utente). Tramite javascript, si ridirige la pagina al link specificato, ovvero viene fatta una richiesta GET all'authorization server. Nell'URI della richiesta sono presenti i seguenti query parameters: response_type, code_challenge, code_challenge_method, client_id, redirect_uri, scope, nonce, response_mode, state.
...
...
@@ -126,27 +103,44 @@ Periodicamente, prima che scada il token e se l'utente è ancora loggato, viene
Inoltre, ogni volta che l'utente effettua un'operazione che richiede l'uti
### 4.2.3. Domain Manager <!-- non sono certa che operi in cloud. Meglio omettere -->
Il DM è un microservizio <!-- che opera in Cloud, -->con funzionalità da server REST ed interagisce con il DB dell'intero sistema.
Nell'header di ogni richiesta inviata al DM è presente un Token JWT (JSON Web Token), rilasciato da Keycloak.
Cliccandolo viene effettuata una richiesta GET all'url http://localhost:8080/realms/test00/protocol/openid-connect/logout. Nell'url sono presenti due query parameters: id_token_hint (ovvero l'id del token corrente <!--DA FARE: controlla cos'è -->) e post_logout_redirect_uri (che consente di effettuare il redirect automatico a https://localhost:3000/ dopo il logout)
### 4.2.2. Webserver e Webapp
#### Responsabile: Alfredo Chissotti (Webserver e seconda pagina della Webapp), Elisa Giglio (prima pagina della Webapp)
Il Webserver, implementato come server HTTPS concorrente, fornisce la Webapp al client grazie all'uso di API REST.
La Webapp comunica con il server di autenticazione (Keycloak) ed effettua richieste HTTPS al DM. Nel momento il cui l'utente seleziona un dominio, la Webapp si connette al message broker, mediante il protocollo WSS, consentendo così il controllo e la gestione di tutti i servizi presenti.
### 4.2.3. Domain Manager
#### Responsabile: Alessandro Carbonelli
Il DM è un microservizio con funzionalità da server REST ed interagisce con il DB dell'intero sistema.
Si occupa di soddisfare le richieste HTTPS provenienti dalla Webapp, controllandone la validità e la consistenza col DB e inoltrarle al CAM richiamando degli URI esposti da quest'ultimo.
Dopo aver verificato l'autorizzazione tramite il Token fornito da Keycloak, il DM interagisce con il DB ed effettua la chiamata al CAM.
Dopo aver verificato l'autorizzazione tramite il Token presente nell'header della richiesta della Webapp, il DM interagisce con il DB ed effettua la chiamata al CAM.
Terminate queste due interazioni, viene servita la risposta alla Webapp.
<!-- => poco chiaro (Alfredo) -->
### 4.2.4. BeagleBone
- Luci
Responsabile: Alessandro Carbonelli
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 per le seguenti variazioni nel microservizio: accensione o spegnimento di una lampadina, aggiunta di una nuova lampadina e modifica del sensore di movimento.
- Scenari
Responsabile: Alfredo Chissotti
Gestisce la deterrenza delle intrusioni riproponendo uno schema di accensione e spegnimento delle luci quando l'utente attiva l'antifurto.
Lo schema registra lo stato delle luci dopo che l'utente ha attivato la modalità di apprendimento; alla sua disattivazione, la registrazione è immediatamente disponibile poiché viene salvata 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 scenario è attivo; il secondo permette il funzionamento dell'automa e memorizza lo stato attuale; il terzo è usato per salvare gli interruttori e la luce attualmente in uso.
- Antifurto
Responsabile: Elisa Giglio
Permette la gestione di un sistema di antifurto. Un pulsante consente di attivare / disattivare l'antifurto. I sensori di movimento sono simulati mediante pulsanti sulla BB. A ciascun sensore di movimento corrisponde un valore delta.
In caso di antifurto impostato, l'allarme scatta nel momento in cui si supera un certo valore soglia. Questo meccanismo è stato pensato per cercare di evitare falsi allarmi.
Due led consentono all'utente di conoscere lo stato dell'antifurto, ovvero se esso è impostato e se sta suonando.
...
...
@@ -155,69 +149,82 @@ La persistenza è realizzata mediante la scrittura e la lettura di file JSON. Si
### 4.2.5. Arduino
Questo componente della LAN scrive sul broker Mosquitto della BB i valori del sensore di luminosità, usato dal microservizio delle luci per decidere se l'ambiente è abbastanza buio da dover accendere le luci nel caso in cui il suo sensore di movimento invii un messaggio.
### 4.2.6. Cloud App Manager
<!--DA FARE chi?, direi da NON FARE-->
### 4.2.7. Broker Mosquitto (smartcity)
<!-- (cosa c'è da scrivere?) forse no? -->
Questo componente della LAN scrive sul broker Mosquitto della BB i valori del sensore di luminosità. Se il valore supera 200, si inibisce l'accensione comandata dai sensori di movimento delle luci.
### 4.2.6 Brokers Mosquitto
#### Responsabile: Elisa Giglio
<!-- DA FARE: qui descrivo le configurazioni dei due mosquitto e dei certificati che ho fatto-->
# 5. Descrizione dell'implementazione
## 5.1. UML delle classi implementate
- Domain Manager
Responsabile: Alessandro Carbonelli

La classe principale del DM è Domain.java. Essa funge da server REST su Https.
Questa classe 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.
Il microservizio si compone di due packages.
Il package 'code' contiene la logica del microservizio, mentre il package 'db' contiene la classe DBC per l'accesso al database tramite query SQL avvalendosi della libreria JDBC. La persistenza del sistema è affidata ad un DB SQLite locale.
La classe principale del DM è Domain.java. Essa funge da server REST concorrente su Https.
Questa classe espone gli URI che vengono richiamati 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 grazie alla classe TokenHandler.
Per verificare che l'utente sia autenticato, viene effettuata una chiamata all'URI della nostra istanza di Keycloak per ottenere la chiave pubblica. Dopo di ciò la firma del JWT che era stato precedentemente inviato nel payload della richiesta della Webapp viene decifrata con la chiave pubblica e viene confrontato il risultato con l'hash(header.body) del JWT. Se il risultato è uguale allora l'utente è verificato. Il metodo che si occupa di ciò è verificaToken che si avvale dell'oggetto di tipo Verifier.
Per verificare che l'utente sia autenticato, viene effettuata una chiamata all'URI della nostra istanza di Keycloak per ottenere la chiave pubblica. Dopo di ciò la firma del JWT che era stato precedentemente inviato nell'header della richiesta della Webapp viene decifrata con la chiave pubblica e viene confrontato il risultato con l'hash(header.body) del JWT. Se il risultato è uguale allora l'utente è verificato. Il metodo che si occupa di ciò è verificaToken che si avvale dell'oggetto di tipo Verifier.
Confermata l'autenticazione dell'utente, è possibile ottenerne il nome utente e distinguere i domini di cui è utente comune o amministratore. A questo punto, a seconda dei servizi richiesti dalla Webapp, si aprono diversi scenari di interazione con il DB ed il CAM (Install, Delete, Start, Stop).
Le chiamate si risolvono una volta che il CAM manda la sua risposta, quindi possiamo considerare la chiamata al CAM incapsulata in termini di tempo all'interno della chiamata da parte della Webapp al DM.
La persistenza del sistema è affidata ad un DB SQLite locale.
- Luci
Responsabile: Alessandro Carbonelli

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, la struttura dati fondamentale per il funzionamento del microservizio definita 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.
La classe principale è Luci.java che, oltre a istanziare il client mqtt, opera su un ArrayList di oggetti di tipo Luce, la struttura dati fondamentale per il funzionamento del microservizio definita dal quartetto input, output, stato e nome.
Input è la stringa "IN" seguita dal numero che rappresenta quella sorgente in input della BBGPIO.
Output è la string "OUT" seguita dal numero che rappresenta quello specifico output della BBGPIO.
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.
Esecutore è la classe che si occupa di attuare l'accensione a tempo delle luci, sfruttando un timer. Necessita di Luci per accedere all'ArrayList<Luce>.
Il sensore di luminosità presente sull'arduino impedisce ai sensori di movimento di operare se la stanza è troppo illuminata, ovvero se è giorno.
Il sensore di luminosità presente sull'Arduino impedisce ai sensori di movimento di operare se la stanza è troppo illuminata, ovvero se è giorno.
Subscriber legge i comandi dai topic e li gestisce. Per istanziare questa classe, è necessaria un'istanza di Esecutore, Luci ed del sensore di movimento.
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 dell'Esecutore ed istanziarne uno nuovo.
Questo meccanismo è trasparente al sistema degli attuatori "tradizionali", quindi se un utente vuole accendere una luce tramite interruttore potrà farlo sempre e comunque.
Questo meccanismo è trasparente al sistema degli interruttori "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 <!--DA FARE elisa integra con la tua parte (keycloak)-->
Responsabile: Alfredo Chissotti

Come il DM, anche il Webserver espone delle API REST su HTTPS.
Il Webserver è concorrente ed 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.
La classe Helper permette di inviare le risposte HTTPS alla Webapp e di fare controlli, evitando la ripetizione del codice nelle varie classi.
<!-- DA FARE: descrivere ObtainToken e Keycloak.java
La classe Keycloak legge dal file keycloak.json i parametri di configurazione di keycloak e ulteriori informazioni dal file params.json -->
- Scenari
Responsabile: Alfredo Chissotti

Il microservizio 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 attualmente in uso sulla GPIO.
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 attualmente in uso sulla BBGPIO.
L'automa gestisce lo stato in cui si trova il microservizio, che può essere uno dei seguenti: spento, in fase di apprendimento o in fase di esecuzione. Questa classe espone i getter e setter dello stato, permettendo alle altre classi di sapere in qualunque momento quali sono le operazioni possibili. Per salvaguardare la persistenza, l'automa salva lo stato in cui si trova in un file di testo.
...
...
@@ -232,6 +239,8 @@ La seconda espone dei metodi che vengono usati da più classi.
- Antifurto
Responsabile: Elisa Giglio

Il microservizio Antifurto si compone di 9 classi: Antifurto, Automa, Esecutore, Helper, MyQueue, Pair, Publisher, SubscribeCallback, Timer.
...
...
@@ -240,7 +249,7 @@ La classe principale è Antifurto. Essa si occupa di far partire il microservizi
- un metodo per pubblicare messaggi MQTT,
- un metodo per sottoscrivere un ulteriore topic,
- un metodo per effettuare l'unsubscribe di un topic.
Sono inoltre presenti getter e setter degli IN e OUT in uso dal microservizio.
Sono inoltre presenti getter e setter degli IN e degli OUT in uso dal microservizio.
L'automa che rappresenta il microservizio Antifurto è scritto nel file automa.json. Basandosi su questo file, la classe Automa gestisce lo stato dell'antifurto.
...
...
@@ -260,21 +269,44 @@ La classe Helper espone metodi per la scrittura e la lettura di file.
## 5.2. Descrizione della UI
### 5.2.1. Autenticazione
#### Responsabile: Elisa Giglio

La prima pagina che viene fornita serve per ridirigere l'utente alla pagina di login su Keycloak; per questo motivo è interamente vuota.
La prima pagina contiente un unico link, non visibile all'utente. Essa serve per ridirigere l'utente alla pagina di login su Keycloak (mostrata in figura).
Il realm 'test00' ha 4 utenti. Le credenziali degli utenti sono:
- username: elisa
- password: elisa
- username: alfredo
- password: alfredo
- username: alessandro
- password: alessandro
- username: john
- password: mariorossi
### 5.2.2. Lista di domini
#### Responsabile: Elisa Giglio

In questa pagina vengono mostrati tutti i domini appartenenti all'utente autenticato. Nel caso in cui l'utente sia amministratore di un particolare dominio, alla destra dello stato di quel dominio viene mostrato un cestino, per poterlo eliminare; inoltre il bottone dello stato è cliccabile, consentento la sua attivazione/spegnimento. Al contrario, se non è un amministratore e il dominio è attualmente attivo, egli può solamente accedere alla pagina d'interazione.
In questa pagina vengono mostrati tutti i domini appartenenti all'utente autenticato.
Nel caso in cui il dominio sia attivo, un click sul suo nome permette all'utente di visualizzare e gestire i corrispondenti servizi.
Se l'utente è amministratore di un particolare dominio, il bottone dello stato è cliccabile e, in fondo alla riga, è presente un cestino. Un click sul bottone di stato consente di avviare / fermare tutti i microservizi di quel dominio; mentre un click sul cestino elimina l'intero dominio.
Se l'utente non è amministratore di un dominio non potrà agire sul bottone di stato e non vedrà il cestino: potrà solamente accedere al dominio cliccando sul suo nome (se questo è nello stato ON).
In basso a destra è presente un bottone per effettuare il logout dall'intero sistema.
### 5.2.3. Interazione con il proprio dominio
#### Responsabile: Alfredo Chissotti
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.
- Homepage

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.
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 e i sensori connessi.
All'avvio della Webapp, viene fatta una RPC ad ogni microservizio installato nel dominio per richiedere e mostrare correttamente tutti i dati attualmente disponibili all'utente; inoltre viene richiesto al server se l'utente è in realtà l'amministratore del dominio, per eventualmente mostrare funzionalità aggiuntive.
...
...
@@ -308,4 +340,8 @@ Dalla Webapp, un utente normale può solamente attivare/disattivare l'antifurto
# 6. Validazione del software
## 6.1. Procedure usate per verificare il corretto funzionamento del sistema
La validazione del software è stata effettuata in modo procedurale sia durante la fase di sviluppo sia alla sua fine.
Nella fase finale sono stati effettuati test di sistema simulando un ambiente reale: sono stati testati tutti i microservizi assieme alla Webapp e gli altri componenti dell'architettura: in particolare, ogni componente è stato testato in modo autonomo (per verificare che funzionasse correttamente) e in modo combinato (per verificare che funzionasse anche in presenza degli altri componenti).
Durante la fase di sviluppo, ogni modulo è stato testato singolarmente. Questo ha permesso l'individuazione e la correzione di errori nelle varie implementazioni.
Successivamente è stata testata l'interazione tra i componenti del sistema: si è verificato che ciascun microservizio fornisse tutti i dati necessari agli altri moduli.
Nella fase finale sono stati effettuati test di sistema simulando un ambiente reale: sono stati testati tutti i microservizi assieme alla Webapp e agli altri componenti dell'architettura.