Link Search Menu Expand Document (external link)

Architettura Generale

Ogni Edge è quello che nel Web Of Things viene definito Thing, ossia un oggetto che espone delle operazioni e che può essere manipolato attraverso chiamate API.

Edge

Nei seguenti diagrammi delle classi, il componente chiamato Edge è la classe centrale che può eseguire dei comandi, i quali vanno a recuperare informazioni o ad agire sullo stato dello stesso.

Diagramma delle classi - Edge

Diagramma delle classi - Edge

Ogni Edge viene quindi utilizzato per la creazione di un WebServer REST. Le API disponibili sono variabili e dipendono dai componenti affidati all’Edge.

Per creare una API è necessario creare un OperationHandler. Si tratta di una classe utile a descrivere un’operazione da eseguire ed ha quindi caratteristiche molto simili a quelle di una API Rest:

  • un nome che descrive brevemente lo scopo dell’operazione.
  • una route, ovvero un percorso a cui l’operazione è associata.
  • un handler, ovvero l’effettiva funzione da eseguire se un OperationHandler viene evocato.

Gli OperationHandler sono contenuti all’interno di Module. Un Module non è altro che una raccolta di OperationHandler che agiscono sugli stessi componenti.

Diagramma di Sequenza - Edge

Diagramma di Sequenza - Edge

Per effettuare una richiesta al WebServer, il client esegue una normalissima HTTP Request. Il WebServer riceverà quindi la richiesta ed eseguirà la funzione execute, la quale itererà sui Module posseduti da Edge e contatterà l’OperationHandler corretto che verrà quindi eseguito. Una volta ottenuto il risultato dalla computazione il risultato tornerà ad Edge e poi al WebServer, il quale preparerà il risultato per la trasmissione e lo invierà come HTTP Response.

ComponentHw

Dato che il linguaggio di programmazione di destinazione si conosceva già dalla fase di analisi, si è deciso di utilizzare un construtto presente. Per la creazione di componenti fisici si è sfruttata infatti l’ereditarietà multipla, presente in C++. La classe principale da cui deve estendere un componente hardware è ComponentHw, che forza tutti i componenti ad avere almeno un ID di tipo stringa.
Nel diagramma delle classi seguente viene illustrata la creazione di un componente per una luce di tipo digitale (che può assumere solo gli stati accesa e spenta).
Ogni componente viene creato con modalità simili, dipendentemente dalle sue proprietà. L’ereditarietà multipla è un ottimo meccanismo per favorire il riuso di classi, in modo che componenti con le stesse caratteristiche siano più semplici e veloci da realizzare.

Legenda package (click me!) - brittany - _brittany-concrete_ - brittany-mock
High-Level organizaiton

Diagramma delle classi - ComponentHw

Per comodità conviene sempre creare una classe di Template che verrà estesa dalle implementazioni effettive. La classe di Mock viene utilizzata solamente a finalità di test, mentre la classe di implementazione effettiva viene utilizzata per manovrare il componente reale.

Module

Un Module è una classe composta da più OperationHandler che hanno componenti in comune. Nel seguente diagramma è riportato un esempio di Modulo che utilizza il componente menzionato nella sezione precedente.

Legenda package (click me!) - brittany - _brittany-concrete_ - brittany-mock
Diagramma delle classi - Module

Diagramma delle classi - Module

DigitalLightModule in questo caso è un modulo che contiene due OperationHandler che agiscono sugli stessi componenti di tipo DigitalLightHw. Oltre alle implementazioni effettive, anche in questo caso è possibile creare delle classi di Mock per testare il funzionamento dell’architettura. In questo caso è necessario che i componenti manovrabili siano a loro volta classi di Mock.