Il seguente repository fornisce un'implementazione per ipotetici dispositivi IoT a seguito di quanto discusso nel il progetto Diversity. Il dispositov IoT ha l'obiettivo di svolgere i seguenti compiti
- Effettuare la codifica ABI di dati in un formato ben definito
- Firmare in ECDSA dei dati in codifica ABI
- Assemblare una stringa JSON definita a priori
- Spedire dei dati in formato JSON ad un server UDP
Il repository presenta due cartelle, con lo scopo di presentare un esempio il più completo possibile. Dentro Codice Arduino è presente l'effettiva implementazione per il dispositivo IoT, in Server Java è fornito, con solo scopo dimostrativo, un generico codice per la ricezione dei pacchetti UDP generati dal dispositivo IoT.
Il programma è stato testato su un ESP32-Wroom-32 di AzDelivery utilizzando Arduino IDE.
Per la realizzazione di alcune funzionalità sono state impiegate delle librerie esterne, reperibili ai seguenti link:
- Portable C++ Hashing Library per la funzione di hashing Keccak256
- libsecp256k1 per firmare con la curva secp256k1 dell'algoritmo ECDSA.
Nel caso venga utilizzato il medesimo dispositivo citato nella precedente sezione occore seguire la guida ESP32 Arduino core. Necessaria per ottenere la corretta board (ESP32 Dev Module) e funzionamente del modulo atto a realizzare l'invio dei dati tramite UDP.
Per motivi di sicurezza, le informazioni per l'invio dei dati tramite UDP non sono stati inserite. Esse vanno aggiunte nel file Credential.h
Informazioni relative alla propria rete Wi-Fi
const char* ssid = "";
const char* password = "";
Informazioni relative al server UDP
const char *udpAddress = "";
const int udpPort = 0;
I moduli sono stati separati e nominati in modo da rispecchiare le relative funzioni, predisponendo un esempio di esecuzione in ThesisEmbedded.ino. Una generica esecuzione è composta da:
creazione di una stringa ABI -> firma della stringa precedentemente generata -> formattazione JSON dei dati originali includendo la loro firma -> invio del JSON ad un server UDP
Per effettuare la codifica ABI dei dati con il formato definito in SensorType.h è necessario utilizzare il metodo:
createDataField(sensorData);
* sensorData è un generico oggetto SensorData, restituendo in output una stringa
Per ottenere la firma dei dati, che si presuppone siano già stati codificati in ABI, è necessario utilizzare il seguente metodo:
createSignature(encodedData,"privateKey");
* privateKey va sostituita con la propria chiave privata per realizzare le transazione in blockchain
encodedData è una stringa contente i dati da firmare, restituendo in output un array di byte
Per formattare in una stringa json i campi di un SensorData unendo la loro firma è necessario utilizzare il seguente metodo:
createJson(msg);
* msg è un generico oggetto SensorData, restituendo in output una stringa
Per inviare dei dati ad un server UDP è necessario utilizzare il seguente metodo:
sendRequest(msg);
* msg è una stringa contenente i dati da inviare al server UDP, restituendo in output un intero per la gestione di possibili errori durante l'invio
In futuro si prevede un miglioramento per quanto riguarda i seguenti aspetti:
- Modifica del modulo atto a effettuare l'invio dei dati al server UDP, con lo scopo di migliorarne le performance ed evitare il blocco in caso di mancata connessione alla rete Wi-Fi
- Dismissione della classe String
- Implementazione di un modulo atto a ottenere dei dati effettivi da sensori
- Implementazione di un modulo atto a realizzare la funzione di hash Keccka256
- Implementazione di un modulo atto a realizzare l'invio dei dati tramite UDP