Brittany Workspace
Il workspace Brittany può essere definito come il workspace di default del progetto JaCaMo.
Questo workspace contiente gli artefatti che non rientrano negli altri Workspace che verranno introdotti in seguito, constituendo quindi un ambiente tramite cui accedere ad artefatti di uso generale.
Gli artefatti esposti dal Brittany workspace sono i seguenti:
- CommonArtifact
- SamplingCoordinatorArtifact
- SamplingArtifact
- DiscoverComponentsArtifact
CommonArtifact
Il CommonArtifact è un Artefatto che viene osservato da tutti gli agenti e svolge il compito di punto di riferimento per la condivisione di informazioni comuni.
Questo artefatto espone tre operazioni, le quali sono identificate dal tag @OPERATION:
- shareComponents
Questa operazione viene chiamata dal discoverComponentsAgent, il quale reperisce i componenti connessi agli Edge per mezzo dell’analisi dei dati ricevuti. La seguente operazione permette di convidere con tutti gli agenti che hanno accesso a questo artefatto la lista dei componenti. Questo viene aggiornando una proprietà osservabile denominata setupComponents. - shareSettings
L’operazione shareSettings, analogamente all’operazione precedente, viene utilizzata al fine di condividere a tutti gli agenti interessati le configurazioni attuali. Questa operazione viene chiamata dal setupAgent, il quale, tramite la comunicazione con il Settings Service, è in grado appunto di reperire la configurazione attualmente valida. Quest’ultima viene resa osservabile tramite la proprietà setupSettings. - shareThingDescriptors
Infine, l’ultima operazione, similmente alle precedenti, serve per la condivisione di Thing Descriptor trovati, per mezzo della proprietà setupThingDescriptors. Questa operazione viene chiamata dal discoverComponentsAgent, che riceve da Edge il Thing Descriptor.
In base alle esigenze specifiche, ogni agente ha dei plan denominati con gli stessi nomi delle proprietà osservabili; in questo modo, quando tali proprietà vengono modificate, il piano dell’agente viene azionato, dando inizio a una serie di specifiche operazioni.
SamplingCoordinatorArtifact
Il SamplingCoordinatorArtifact viene utilizzato per fornire un supporto per la coordinazione delle operazioni di campionamento e per decidere se rendere i dati campionati persistente e/o se attivare o disattivare un attuatore.
Questo artefatto, oltre alle operazioni utilizzate per salvare la lista di componenti e le configurazioni attuali, rende disponibili le seguenti operazioni:
- sampleOperation
Quando chiamata, questa operazione filtra i componenti fisici trovati in base a una specifica categoria e rende disponibile una proprietà osservabile sampling che aziona l’agente dedicato al campionamento. - updateOperation La seguente operazione viene utilizzata per analizzare i dati appena campionati; una volta calcolata la media, questa viene confrontata con la media dell’ultimo campionamento effettuato e nel caso in cui la differenza superi un certo delta prestabilito, allora viene condivisa la proprietà osservabile uploadPersisence, il cui obiettivo è quello di condividere la media del campionamento corrente all’agente che si occupeà di renderla persistente.
UpdateOperation ha anche il compito di verificare che la media corrente rientri tra il valore minimo e massimo stabilito da una possibile configurazione attiva; nel caso in cui non sia così allora viene utilizzata la proprietà osservabile actuate, il cui compito è di scatenare l’azione che gestirà gli attuatori per fare rientrare lo stato della serra in quello prestabilito dalle configurazioni.
SamplingArtifact
Il compito di SamplingArtifact è quello di esporre una operazione chiamata getSamples.
Tale operazione riceve un lista di componenti e comunica con ognuno di essi utilizzando i Thing Descriptor. Ogni componente contattato restituirà lo stato registrato dal sensore e, una volta raccolti tutti, vengono condivisi all’agente che osserva la proprietà checkSamples.
DiscoverComponentsArtifact
Il DiscoverComponentsArtifact è utilizzato per la gestione della ricerca di Edge, i quali devono restituire un Thing Descriptor valido.
L’operazione utilizzata per azionare la ricerca di Edge si chiama discoverComponents; questa sfrutta un meccanismo messo a disposizione dal framework Cartago, ovvero un @INTERNAL_OPERATION, che in questo caso si chiama broadcastRequest. Una Internal Operation viene utilizzata quando si vuole eseguire un’operazione in modo asincrono, soprattutto nel caso in cui la sua esecuzione richieda molto tempo. BroadcastRequest ha lo scopo di ciclare su tutti gli indirizzi IP nella sottorete, al fine di trovare Edge, il che richiede molto tempo.
Ogni volta che viene ricevuta una risposta valida da un certo indirizzo IP, il Thing Descriptor ricevuto viene analizzato per estrarre una lista di componenti. Successivamente vengono create due proprietà osservabili: components (per condividere la lista dei componenti) e thingDescriptors (per distribuire i Thing Descriptor).
Una cosa particolare da notare è che al termine di ogni richiesta viene chiamata la seguente primitiva esposta da Cartago:
await_time(TICK_TIME);
Questa primitiva è necessaria per fermare momentaneamente l’esecuzione dell’operazione a lungo termine, per dare il tempo alle proprietà osservabili di essere effettivamente condivise. Trascorso il tempo specificato, l’operazione riprende ad eseguire.