Mokabyte

Dal 1996, architetture, metodologie, sviluppo software

  • Argomenti
    • Programmazione & Linguaggi
      • Java
      • DataBase & elaborazione dei dati
      • Frameworks & Tools
      • Processi di sviluppo
    • Architetture dei sistemi
      • Sicurezza informatica
      • DevOps
    • Project Management
      • Organizzazione aziendale
      • HR
      • Soft skills
    • Lean/Agile
      • Scrum
      • Teoria della complessità
      • Apprendimento & Serious Gaming
    • Internet & Digital
      • Cultura & Società
      • Conferenze & Reportage
      • Marketing & eCommerce
    • Hardware & Tecnologia
      • Intelligenza artificiale
      • UX design & Grafica
  • Ultimo numero
  • Archivio
    • Archivio dal 2006 ad oggi
    • Il primo sito web – 1996-2005
  • Chi siamo
  • Ventennale
  • Libri
  • Contatti
  • Argomenti
    • Programmazione & Linguaggi
      • Java
      • DataBase & elaborazione dei dati
      • Frameworks & Tools
      • Processi di sviluppo
    • Architetture dei sistemi
      • Sicurezza informatica
      • DevOps
    • Project Management
      • Organizzazione aziendale
      • HR
      • Soft skills
    • Lean/Agile
      • Scrum
      • Teoria della complessità
      • Apprendimento & Serious Gaming
    • Internet & Digital
      • Cultura & Società
      • Conferenze & Reportage
      • Marketing & eCommerce
    • Hardware & Tecnologia
      • Intelligenza artificiale
      • UX design & Grafica
  • Ultimo numero
  • Archivio
    • Archivio dal 2006 ad oggi
    • Il primo sito web – 1996-2005
  • Chi siamo
  • Ventennale
  • Libri
  • Contatti

Nel numero:

286 settembre
, anno 2022

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

VII parte: La dashboard di visualizzazione

Luigi Bennardis
Luigi Bennardis

Luigi Bennardis si è laureato in Scienze Statistiche ed Economiche all’Università di Roma. Si occupa di informatica da un po’ di tempo ed è attualmente impegnato su tematiche DevOps. Nel tempo libero ancora gioca a basket, nuota ed è appassionato di elettronica vintage.

Traffico

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

VII parte: La dashboard di visualizzazione

Picture of Luigi Bennardis

Luigi Bennardis

  • Questo articolo parla di: Architetture dei sistemi, DataBase & elaborazione dei dati, Programmazione & Linguaggi

La dashboard di visualizzazione

La dashboard di visualizzazione, basata su tecnologia WebSocket, viene implementata sotto forma di microservizio SpringBoot che espone un WebServer, il quale pubblica una pagina HTML di presentation e le classi di backend Java necessarie alla definizione del microservizio e di accesso ai dati di Cassandra.

WebSocket è una specifica che permette la comunicazione bidirezionale sincrona tra un client e un server, nel nostro caso il browser web e il microservizio SpringBoot. WebSocket è un protocollo basato su una connessione HTTP attraverso cui possono essere scambiati frame a lunghezza variabile tra i due endpoint. Si tratta quindi di un protocollo generalmente utilizzato per la comunicazione sincrona tra il browser dell’utente e un’applicazione di backend esposta da un web server.

Figura 1 – WebSocket.
Figura 1 – WebSocket.

 

Un WebSocket è un canale di comunicazione che utilizza TCP come protocollo sottostante. Viene avviato dal client che invia una richiesta HTTP al server richiedendo un aggiornamento della connessione a WebSocket. Se il server supporta questo protocollo, la richiesta del client viene concessa e viene stabilita una connessione di questo tipo tra le due parti. Da questo momento tutte le comunicazioni avvengono tramite WebSocket e il protocollo HTTP non viene più utilizzato. WebSocket realizza un protocollo di comunicazione senza richiedere uno specifico formato di messaggistica. Spetta alle applicazioni concordare il formato dei messaggi scambiati. WebSocket API fa parte della specifica HTML5 ed è supportata dai più diffusi browser Internet.

Per la dashboard di visualizzazione la comunicazione WebSocket viene realizzata attraverso il framework Spring, utilizzando STOMP (Streaming Text Oriented Message Protocol) come protocollo di messaggistica. STOMP definisce un formato di comunicazione dove un client STOMP può comunicate con un message broker STOMP per realizzare un’interoperabilità di messaggistica di semplice implementazione piuttosto diffusa tra linguaggi di programmazione e piattaforme diverse.

L’implementazione della dashboard di visualizzazione viene completata dall’utilizzo delle librerie JavaScript JQuery e Chart. JQuery viene utilizzata nelle pagine per semplificare la selezione, la manipolazione, la gestione degli eventi e l’animazione di elementi (Document Object Model). JQuery semplifica anche l’uso di funzionalità AJAX, la gestione degli eventi e la manipolazione dei CSS. Attraverso la libreria Chart.js verranno creati gli elementi grafici in linguaggio JavaScript.

Backend

Descriviamo in questo paragrafo le classi che definiscono il layer applicativo di backend. Di seguito l’implementazione della classe di avvio Spring Boot dove si evince la direttiva che abilita lo scheduling che sarà impostato poi nella classe service.

Figura 2 – Classe di avvio SpringBoot.
Figura 2 – Classe di avvio SpringBoot.

 

La funzionalità WebSocket viene abilitata attraverso l’annotazione @EnableWebSocketMessageBroker. Viene quindi codificata la registrazione dell’endpoint STOMP alla URL scelta (/stomp) attraverso SockJS, abilitato un message broker e configurata la URL corrispondente (/topic). Di seguito il fragment di implementazione della classe di configurazione.

Figura 3 – Implementazione WebSocket e STOMP nel message broker.
Figura 3 – Implementazione WebSocket e STOMP nel message broker.

 

Di seguito la classe che serializza le informazioni che saranno ottenute da Cassandra attraverso la classe di tipo data service.

Figura 4 – Classe di serializzazione delle informazioni ricevute da Cassandra.
Figura 4 – Classe di serializzazione delle informazioni ricevute da Cassandra.

 

Di seguito la classe DataService con la codifica di accesso schedulato ai record di Cassandra e invio degli stessi sotto forma di messaggio (WebSocket/STOMP) alla dashboard di visualizzazione.

Figura 5 – Classe DataService con la codifica di accesso schedulato ai record di Cassandra.
Figura 5 – Classe DataService con la codifica di accesso schedulato ai record di Cassandra.

 

Di rilevo nella codifica viene segnalata la variabile responseMessage che rappresenta un’istanza di org.messaging.simp.SimpMessagingTemplate, implementazione dell’interfaccia SimpleMessageSendingOperations, classe che a sua volta specializza MessageSendingOperations. MessageSendingOperations implementa i metodi  necessari al supporto del framework di Spring per protocolli di Simple Messaging come STOMP. Il metodo convertAndSend invia il contenuto serializzato della classe httpDatiResponse alla URL di pubblicazione della dashboard.

Presentation

Viene riportata di seguito la codifica della pagina HTML/JavaScript che implementa le funzionalità di visualizzazione. Il primo fragment evidenzia l’importazione delle librerie client dei framework JavaScript utilizzati:

Figura 6 – Import Framework JavaScript.
Figura 6 – Import Framework JavaScript.

 

La codifica continua definendo le variabili di persistenza delle tabelle accedute attraverso JQuery e la creazione di una istanza SockJS e di un client STOMP.

Figura 7 – Variabili JQuery, istanza SockJs e client WebSocket.
Figura 7 – Variabili JQuery, istanza SockJs e client WebSocket.

 

Viene quindi codificato il client STOMP che sottoscrive il messaggio al path specificato. Nel body del messaggio saranno presenti i dati contenuti nelle tabelle Cassandra letti dal microservizio SpringBoot.

Figura 8 – Codifica e configurazione del client STOMP.
Figura 8 – Codifica e configurazione del client STOMP.

 

I dati di ciascuna tabella Cassandra (nell’esempio listaTrafficoTotale) vengono concatenati in una stringa con gli elementi HTML di visualizzazione.

Figura 9 – Creazione dei contenuti HLML di visualizzazione.
Figura 9 – Creazione dei contenuti HLML di visualizzazione.

 

La visualizzazione delle informazioni sui controlli Chart.js conclude l’implementazione della codifica JavaScript.

Figura 10 – Assegnazione dell’HTML costruito dai dati Cassandra ai controlli grafici.
Figura 10 – Assegnazione dell’HTML costruito dai dati Cassandra ai controlli grafici.

Grafici di monitoraggio

Di seguito i grafici di monitoraggio che rappresentano i veicoli al POI con il dettaglio della distanza, la distribuzione del traffico per tipo veicolo rilevata in nodo stradale specifico e il traffico totale per le direttrici stradali considerate.

Figura 11 – Veicoli al POI.
Figura 11 – Veicoli al POI.

 

Figura 12 – Dettaglio dei veicoli al Point of Interest.
Figura 12 – Dettaglio dei veicoli al Point of Interest.

 

Figura 13 – Distribuzione del traffico per tipo veicolo al nodo A24/A90.
Figura 13 – Distribuzione del traffico per tipo veicolo al nodo A24/A90.

 

Figura 14 – Dettaglio del traffico totale per tipo veicolo sulle direttrici considerate.
Figura 14 – Dettaglio del traffico totale per tipo veicolo sulle direttrici considerate.

 

Dashboard Spark

Spark pubblica alla URL: <nome_host>:4040/jobs la dashboard di controllo. La dashboard elenca i job completati e la loro corrispondenza sulla timeline di esecuzione. Nella figura 15 c’è il dettaglio di un job di esempio con i riferimenti alla corrispondente linea di codice Java, il timestamp del momento dell’invio, la durata, gli stage e il dettaglio dei task. Nella timeline, i job sono rappresentati con colori diversi per quelli in esecuzione, quelli eseguiti con successo e quelli falliti.

Figura 15 – Dashboard Spark: lista job completati.
Figura 15 – Dashboard Spark: lista job completati.

 

Figura 16 – Dashboard Spark: lista job completati e dettaglio sulla timeline.
Figura 16 – Dashboard Spark: lista job completati e dettaglio sulla timeline.

 

Figura 17 – Dashboard Spark: dettaglio del job sulla timeline.
Figura 17 – Dashboard Spark: dettaglio del job sulla timeline.

 

Di seguito la visualizzazione in formato DAG (Directed Acyclic Graph) di un job di esempio, con il dettaglio degli stage che esegue. Nella lista degli stage completati possiamo notare la corrispondenza di ciascuno alla linea di codice Java di implementazione. Anche in questo caso, la lista riporta le informazioni con il timestamp di invio, la durata, il numero di task terminati con successo, la quantità di dati di input e di output e il numero di letture/scritture.

Figura 18 – Dashboard Spark. Stage del job: visualizzazione DAG.
Figura 18 – Dashboard Spark. Stage del job: visualizzazione DAG.

 

Nelle figure di seguito, sono riportate la visualizzazione di dettaglio di ogni stage con le evidenze delle metriche di esecuzione.

Figura 19 – Dashboard Spark: dettaglio dello stage e metriche di esecuzione.
Figura 19 – Dashboard Spark: dettaglio dello stage e metriche di esecuzione.

 

Figura 20 – Dashboard Spark:  metriche aggregate e dettaglio del task.
Figura 20 – Dashboard Spark:  metriche aggregate e dettaglio del task.

 

Nel dettaglio di visualizzazione DAG di ciascuno stage vengono visualizzati i task che lo compongono: nel riquadro verde l’operazione eseguita da ciascun task (direct stream, map).

Nella parte evidenziata in rosso la corrispondenza al codice Java eseguito: nell’esempio, la creazione dello stream di lettura da Kafka utilizzando il runtime kafka 0.10 direct stream e le due operazioni di map che ottengono in sequenza i nuovi RDD richiesti dall’elaborazione.

Figura 21 – Dashboard Spark: dettaglio dello stage e corrispondenza di implementazione.
Figura 21 – Dashboard Spark: dettaglio dello stage e corrispondenza di implementazione.

 

Analogamente a quanto già descritto per lo stage precedente, con una serie di immagini, di seguito viene riportato il dettaglio del secondo stage, sempre riferito al job preso in esame.

Figura 22 – Dashboard Spark: dettaglio dello stage.
Figura 22 – Dashboard Spark: dettaglio dello stage.

 

Figura 23 – Dashboard Spark: dettaglio dello stage e metriche di esecuzione.
Figura 23 – Dashboard Spark: dettaglio dello stage e metriche di esecuzione.

 

Figura 24 – Dashboard Spark: dettaglio dello stage e corrispondenza di implementazione.
Figura 24 – Dashboard Spark: dettaglio dello stage e corrispondenza di implementazione.

 

Conclusioni

Questa serie di articoli descrive una possibile implementazione di una piattaforma digitale di monitoraggio in tempo reale di dati posizionali inviati dai veicoli in transito su alcune direttrici stradali. Sono stati presentati i moduli applicativi, i dettagli tecnologici di integrazione e le caratteristiche di funzionamento di Kafka, Spark e Cassandra.

L’esempio proposto è facilmente estendibile a molti altri casi d’uso. Per esempio, al monitoraggio delle informazioni che rilevano eventuali criticità sui dispositivi in dotazione dei veicoli che trasportano merci pericolose. La possibilità di attuare un monitoraggio in tempo reale di queste informazioni potrebbe attivare una più efficace gestione della sicurezza, anche con l’integrazione delle informazioni inviate dai dispositivi IOT installati su infrastrutture stradali critiche, anche utilizzabili per eseguire algoritmi di intelligenza artificiale orientati alla prevenzione degli incidenti e/o a rendere più efficiente la fluidità del traffico.

Tra le caratteristiche di Spark Streaming c’è la possibilità di integrare batch di dati storicizzati con dati live streaming. Questa caratteristica rappresenta un elemento significativo in tema di gestione e programmazione del fabbisogno e della domanda di nuovi servizi di mobilità e più in generale per l’attuazione dei modelli di smart city.

Anche in ambito industriale il monitoraggio dei dati provenienti dai dispositivi IOT installati sulle macchine può rappresentare uno strumento di analisi e miglioramento dei processi oltre che di valutazione degli impatti di una modifica dei processi stessi.

Più in generale è verosimile che le analisi basate sul monitoraggio in tempo reale dei dati provenienti dai dispositivi IOT integrati dai batch di dati storicizzati, e con l’applicazione su questi dati di algoritmi di intelligenza artificiale, rappresentano uno strumento efficace per analizzare e migliorare l’efficienza dei processi osservati.

 

Luigi Bennardis
Luigi Bennardis

Luigi Bennardis si è laureato in Scienze Statistiche ed Economiche all’Università di Roma. Si occupa di informatica da un po’ di tempo ed è attualmente impegnato su tematiche DevOps. Nel tempo libero ancora gioca a basket, nuota ed è appassionato di elettronica vintage.

Facebook
Twitter
LinkedIn
Picture of Luigi Bennardis

Luigi Bennardis

Luigi Bennardis si è laureato in Scienze Statistiche ed Economiche all’Università di Roma. Si occupa di informatica da un po’ di tempo ed è attualmente impegnato su tematiche DevOps. Nel tempo libero ancora gioca a basket, nuota ed è appassionato di elettronica vintage.
Tutti gli articoli
Nello stesso numero
Loading...

Veicoli elettrici ed esperienza utente

I parte: Il contesto e i casi d’uso

WebAssembly, uno standard web per il presente e per il futuro

II parte: Docker vs. WebAssembly

Fare pair programming con l’intelligenza artificiale

I parte: Il quadro della situazione

Nella stessa serie
Loading...

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

VI parte: Data processing e persistenza

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

V parte: Data Ingestion & Computing

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

IV parte: L’invio dei dati al topic di Kafka

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

III parte: Il framework Spark

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

II parte: Tecnologie di analisi

Un sistema di monitoraggio del traffico veicolare “in tempo reale”

I parte: Introduzione e panoramica

Mokabyte

MokaByte è una rivista online nata nel 1996, dedicata alla comunità degli sviluppatori java.
La rivista tratta di vari argomenti, tra cui architetture enterprise e integrazione, metodologie di sviluppo lean/agile e aspetti sociali e culturali del web.

Imola Informatica

MokaByte è un marchio registrato da:
Imola Informatica S.P.A.
Via Selice 66/a 40026 Imola (BO)
C.F. e Iscriz. Registro imprese BO 03351570373
P.I. 00614381200
Cap. Soc. euro 100.000,00 i.v.

Privacy | Cookie Policy

Contatti

Contattaci tramite la nostra pagina contatti, oppure scrivendo a redazione@mokabyte.it

Seguici sui social

Facebook Linkedin Rss
Imola Informatica
Mokabyte