Integrazione Eclipse Kura — Oracle IoT

In questo articolo descrivo l’integrazione realizzata tra Eclipse Kura ed Oracle IoT. (last update: 17/09/2018).

Introduzione.

Nell’ambito di una Proof of Concept realizzata per un cliente, per mostrare come è possibile implementare un client per Oracle IoT Cloud, integrato in un Gateway basato su OSGi, ho deciso di adottare il framework aperto Eclipse Kura ed ho realizzato una prima versione dell’integrazione.

In un secondo momento, abbiamo deciso di adottare Kura per il progetto di una demo basata sul concetto di Smart City: Oracle Proxima City.

Infine, l’integrazione realizzata è stata descritta nella prima versione del Workshop IoT realizzata a Roma a settembre 2018.

Per documentare tutto ciò ho deciso di scrivere questo articolo.

Perchè un Gateway per l’IoT?

Un Gateway è spesso un componente fondamentale di un architettura IoT.

Di frequente, i dispositivi che sono direttamente collegati ai sensori e/o attuatori non si possono direttamente collegare ad un IoT Cloud. Le ragioni possono essere molteplici:

  • il dispositivo non supporta IP
  • il dispositivo non ha la memoria/capacità computazionale per utilizzare il protocollo di comunicazione scelto
  • per ragioni di sicurezza

In questo caso si utilizzano N Gateway. I device parlano, con un protocollo comune supportato, con il Gateway. Il Gateway rilancia i messaggi verso il Cloud.

Il Gateway, come traspare dalla breve nota precedente, semplifica e potenzia il modello di sicurezza. Ad esempio, è un vantaggio il fatto che a fronte di un numero elevato di device sul campo, il numero di gateway che si devono collegare al Cloud è ridotto. Ovviamente, la relazione tra device e gateway deve essere “trusted”.

Eclipse Kura.

Dal sito di Eclipse Kura:

Eclipse Kura™ is an extensible open source IoT Edge Framework based on Java/OSGi. Kura offers API access to the hardware interfaces of IoT Gateways (serial ports, GPS, watchdog, GPIOs, I2C, etc.). It features ready-to-use field protocols (including Modbus, OPC-UA, S7), an application container, and a web-based visual data flow programming to acquire data from the field, process it at the edge, and publish it to leading IoT Cloud Platforms through MQTT connectivity.

Kura è nato dal lavoro svolto in Eurotech. Parte del codice da loro realizzato per il framework ESF è stato donato alla Eclipse Foundation ed ha costituito il punto di partenza per il progetto Kura, giunto oggi oramai alla versione 4.0 (la ultima build stabile è la 3.2, di aprile 2018).

In sintesi Kura è un framework aperto, Open Source, per implementare IoT Gateway ed applicazioni custom da far girare sul Gateway.

Kura fornisce un layer che si posiziona sul sistema operativo (Linux) e semplifica:

  • la gestione del dispositivo (es: rete, firewall)
  • lo sviluppo di applicazioni integrate
  • il collegamento con dispositivi muniti di sensori e/o attuatori
  • il collegamento con un management Cloud (si veda, a riguardo, Eclipse Kapua)

Kura supporta tutto un insieme di protocolli (es: BLE, Modbus, …) per colloquiare con i device.

Nella nostra integrazione assumiamo che i dati dal device (esempio: una board Arduino MKR WiFi 1010 con sensori) giungano tramite MQTT, ma potremmo utilizzare BLE o un altro dei protocolli per cui esistono driver. Ovviamente, dovremmo cambiare parte dell’implementazione.

Le componenti applicative si sviluppano come Bundle OSGi. Possono essere installate tramite la Kura WebUI o tramite la sua API, distribuendole come un Deployment Bundle.

Image for post
Image for post

Il linguaggio nativo di sviluppo per Kura è Java.

Oracle Gateway Device Virtualization API.

Oracle (che è l’azienda per cui lavoro) fornisce librerie per lo sviluppo di applicazioni IoT per i linguaggi più comunemente utilizzati (Java, C, NodeJS).

Una libreria di più alto livello è la Device Virtualization API. Di questa esistono due versioni:

  • la versione per Directly Connected Device (DCD)
  • la versione per Gateway

La documentazione è disponibile alla URL: https://docs.oracle.com/en/cloud/paas/iot-cloud/iotcp/overview-summary.html

In questa integrazione abbiamo usato, ovviamente, le librerie per Java e la versione per Gateway.

La differenza fondamentale risiede nel fatto che, in linea di principio, un Gateway può essere connesso ad N device e quindi, nel momento in cui invia i messaggi al Cloud, lo deve fare “a nome di questi device”, impersonando i “device” e non se stesso.

L’integrazione realizzata.

Quello che ho realizzato è un “modulo applicativo”, che si può installare in Kura, che legge messaggi JSON da una topic MQTT, li trasforma e li invia ad Oracle IoT Cloud. Installando in Kura tale componente, un Raspberry PI, con Kura a bordo, diviene a tutti gli effetti un IoT Gateway per Oracle IoT.

Il modulo è implementato come un bundle OSGi, che contiene bytecode Java (JAR), un file manifest che definisce le dipendenze, librerie ed un file di configurazione.

La classe principale è la classe IoTGateway, che implementa due interfacce:

  • ConfigurableComponent
  • DataServiceListener

Altra classe importante è la classe Oracle IoTClient che incapsula il codice della DeviceLibrary di Oracle, che permette di inviare i messaggi all’IoT Cloud Oracle.

Infine, vi sono una serie di classi di supporto: le classi che implementano i formati di dati supportati (OBD2, Aircare, …).

Il modulo è distribuito, come previsto in Kura, mediante un deployment package, un file di estensione “.dp”.

Per un approfondimento su come realizzare un OSGi bundle per Kura, conviene consultare la documentazione ufficiale. Vi è un ottimo, dettagliato “how-to” che può servire come punto di partenza: https://eclipse.github.io/kura/dev/hello-example.html

Il repository.

Il codice dell’integrazione è accessibile nel repository GitHub creato allo scopo: OraKuraGateway

Nel repository sono stati collocati anche i file JAR delle librerie utilizzate.

Installazione di Kura.

Nel seguito faccio riferimento ad un installazione su un Raspberry PI 3 B+. La versione di sistema operativo adottato è Raspbian Stretch.

Il primo passo è installare il S.O. su RPI 3. Dopo averlo installato conviene:

  • abilitare le connessioni via SSH
  • cambiare la password dell’utente “pi”
  • settare il timezone corretto e la zona WiFi
  • effettuare un upgrade agli ultimi pacchetti disponibili con

sudo apt-get update

sudo apt-get upgrade

Infine installare un JDK 8 (per ora le integrazioni sono state testate con questa versione).

Per installare Oracle JDK 8:

sudo apt-get install oracle-java8-jdk

Quindi seguire con precisione i passi indicati nella guida online per l’installazione di Eclipse Kura

Nella guida si fa riferimento ad una versione precedente di Rapbian, ma, come detto, ho verificato che funziona su Stretch. Si deve aver cura di attuare le modifiche indicate nella nota dedicata a Stretch.

Importante: Kura prende in gestione la rete WiFi. Nel corso dell’installazione è fondamentale che il RPI sia collegato al router tramite cavo Ethernet, altrimenti, dopo il reboot, il RPI non sarà più raggiungibile su rete.

Il file da scaricare per installare l’ultima versione disponibile di Kura (oggi, la 3.2) è

kura_3.2.0_raspberry-pi-2–3_installer.deb

Dopo il reboot, la Web UI di Kura è accessibile alla URL

http://<hostname kura>/kura

Image for post
Image for post

Configurazione di Kura.

Dopo l’installazione, tramite la Web UI, si deve provvedere alle seguenti operazioni propedeutiche:

  • Configurazione della rete WiFi
  • Abilitazione, sul firewall, della port 1883 (per il protocollo MQTT)
  • Abilitazione del “Simple Artemis MQTT Broker”
  • Configurazione del Cloud Service

Infine, prima di installare il bundle dell’integrazione Kura — Oracle IoT si deve modificare il contenuto del file:

start_kura_background.sh

contenuto in

/opt/eclipse/kura/bin

Inserendo le seguenti due righe:

-Dhttps.protocols=TLSv1.2 \

-Dorg.osgi.framework.system.packages.extra=sun.net.www.protocol.https \

e modificando la riga

-Djdk.tls.trustNameService=false \

Dopo aver effettuato tali modifiche si deve far ripartire Kura con

sudo systemctl stop kura

sudo systemctl start kura

Per verificare che non vi siano errori, è opportuno esaminare il contenuto dei due file

kura.log

kura-console.log

collocati nella directory

/var/log

Installazione del bundle OSGi.

L’integrazione è impacchettata come un Bundle OSGi ed è distribuita tramite un deployment package: il file IoTGateway.dp.

Il package può essere installato tramite il Menù “Packages”.

Dopo l’installazione, nella WebUI di Kura, in baso a sinistra, compare la voce “IoTGateway”, attraverso cui si accede alla pagina di configurazione.

Image for post
Image for post

Test dell’integrazione.

L’integrazione realizzata prevede una modalità di test. In questa modalità, impostata dalla pagina di configurazione di IoTGateway

Image for post
Image for post

impostando “mode.test” a “YES”, i messaggi inviati via MQTT alla topic definita, sempre nella stessa pagina, sono letti, de-serializzati e stampati nel kura.log, senza che nessun messaggio sia inviato ad Oracle IoT CS.

Ovviamente, il formato dei messaggi deve essere uno dei formati previsti (campo msg.type). Potrebbe essere utile, per chi vuole provare, utilizzare il Simulatore che ho descritto nell’articolo:

reperibile nel repository github:

Tale simulatore utilizza il formato da me denominato “Aircare”. I dati sono letti da file. Ovviamente, nel file Python si devono definire correttamente: credenziali per la connessione MQTT e nome della topic.

Se il test sopra descritto è superato positivamente, come verificato dal kura.log, si può procedere al test completo, inviando i messaggi ad Oracle IoT Cloud.

Per poter procedere con tale secondo test si deve:

  • creare un’applicazione in Oracle IoT Cloud
  • definire il DeviceModel, che descrive i dati utilizzati
  • registrare il Device Gateway (RPI) e scaricare il provisioning file (trusted assett store)
  • collocare tale file nella directory definita nella configurazione del bundle (vedi sopra bundle configuration page), impostando nella configurazione la password scelta per proteggere il file
  • Impostare il “mode.test” a “NO”.

(I primi tre passi sono descritti in dettaglio nell’articolo su Medium precedentemente menzionato).

Dopo aver effettuato le modifiche alla configurazione dell’IoT Gateway, effettuare un restart di Kura.

Se tutte le configurazioni sono state compiute correttamente, si vedranno i messaggi via via arrivare sull’IoT Cloud, ad esempio nella Dashboard dell’applicazione definita.

Sicurezza.

Il colloquio tra device e Gateway Kura avviene tramite protocollo MQTT. Nella configurazione adottata il traffico non è cifrato, ma lo si può fare semplicemente configurando il device e l’MQTT broker Artemis integrato.

Il device deve utilizzare per la connessione MQTT una coppia (user, pwd), definita nella configurazione del Broker. Tali particolari possono essere configurati tramite la Kura Web UI.

Limiti dell’integrazione.

L’integrazione qui descritta è stata implementata la prima volta per una Proof of Concept per un cliente e poi utilizzata nei gateway impiegati nel progetto demo “ProximaCity”.

Anche se ho posto molta cura nella realizzazione del codice e nei test, il codice fornito non deve essere considerato “ready for production”, ma piuttosto:

  • un esempio funzionante di integrazione Oracle IoT — Kura
  • il punto di partenza per realizzare una vera integrazione “ready-for-production”
  • un esempio di bundle OSGi per Kura

Di alcuni limiti sono a conoscenza. Si tratta di aspetti che non ho avuto il tempo di completare e/o migliorare (ma nulla esclude che lo faccia o lo abbia già fatto).

Se volete segnalare dei bug o issue, il posto migliore è il repository github.

Troubleshooting

Il file di log da consultare è

/var/log/kura.log

Un buon segnale che i messaggi sono effettivamente inviati ad Oracle IoT Cloud è la presenza in tale file del messaggio:

o.e.k.e.I.OracleIoTClient — Msg sent to Iot…

Cool, have fun.

Written by

Born in the wonderful city of Naples, but living in Rome. Always curious about new technologies and new things. I work in a big Cloud Company.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store