Configurazione
La configurazione minima per implementare un client Trackle è la seguente:
#include <trackle_interface.h>
int main(int argc, char *argv[]) {
Trackle *trackle_s = newTrackle();
// Inizializzazione
trackleInit(trackle_s);
trackleSetMillis(trackle_s, get_millis_cb);
// Autenticazione
trackleSetDeviceId(trackle_s, DEVICE_ID);
trackleSetKeys(trackle_s, PRIVATE_KEY);
// Configurazione del socket di comunicazione
trackleSetSendCallback(trackle_s, send_cb_udp);
trackleSetReceiveCallback(trackle_s, receive_cb_udp);
trackleSetConnectCallback(trackle_s, connect_cb_udp);
trackleSetDisconnectCallback(trackle_s, disconnect_cb);
// Connessione
trackleConnect(trackle_s);
// Loop
while (1)
{
trackleLoop(trackle_s);
...
// Application Loop
...
usleep(20 * 1000);
}
return 0;
}Inizializzazione
Trackle.setMillis()
Imposta una callback che ritorna il numero di millisecondi da cui il software è in esecuzione.
Autenticazione
Per ogni dispositivo che si vuole connettere a Trackle è necessario possedere un ID Dispositivo e una chiave privata.
Per ottenere un ID dispositivo e una chiave privata puoi seguire questi passaggi:
Crea un account su Trackle Cloud attraverso la Console (https://trackle.cloud/)
Dalla pagina "Dispositivi" clicca sul bottone "Claim di un dispositivo"
Clicca sul link "Non hai un ID dispositivo?", poi su continua
L'ID Dispositivo verrà mostrato sullo schermo e il file della chiave privata verrà scaricato automaticamente dal browser con il nome <id_dispositivo>.der

La connessione verso Trackle Cloud è reciprocamente autenticata utilizzando coppie di chiavi pubbliche / private in formato RPK (Raw Public Key).
La chiave privata del dispositivo ottenuta al passaggio precedente deve essere memorizzata sul dispositivo e deve essere essere mantenuta segreta. Trackle Cloud memorizza la chiave pubblica di ogni dispositivo.
Per quanto riguarda il cloud, la chiave privata del cloud viene mantenuta segreta, mentre tutti i dispositivi conoscono la chiave pubblica del cloud. La chiave pubblica del cloud non è un segreto.
Trackle.setDeviceId()
Configura l'ID univoco del dispositivo (DeviceID) ottenuto dalla Console. L'ID dispositivo deve essere un numero di 12 byte che identifica univocamente il dispositivo.
Trackle.setKeys()
Configura la chiave privata per questo dispositivo. Non è necessario impostare la chiave pubblica del cloud in quanto è già codificata nella libreria.
Comunicazione
Trackle Library si collega al Cloud attraverso il protocollo di comunicazione CoAP (IETF RFC 7252), acronimo di Constrained Application Protocol. CoAP è un protocollo leggero, appositamente progettato per dispositivi IoT con capacità di elaborazione limitate che comunicano su reti con banda disponibile ridotta.
CoAP utilizza UDP come protocollo di trasporto predefinito (ogni messaggio CoAP viene inviato all'interno di un datagram UDP) e implementa le funzionalità software per garantire l'invio, la ricezione e l'ordinamento dei pacchetti (ACK e messageId). La sicurezza della comunicazione è assicurata dall’implementazione dello standard DTLS (Datagram Transport Layer Security), un protocollo progettato per proteggere la privacy dei dati e prevenire intercettazioni e manomissioni.
Per permettere ad un client di comunicare con il cloud è necessario implementare le callback che definiscono come creare e distruggere un socket UDP e come inviare e ricevere dati su quel socket UDP. La libreria si occupa di cifrare la comunicazione e di mantenere il canale sempre attivo.
Trackle.setConnectCallback()
Imposta una callback che crea il socket UDP verso il cloud e ritorna il risultato.
Trackle.setDisconnectCallback()
Imposta una callback che esegue la chiusura del socket UDP e ritorna il risultato.
Trackle.setSendCallback()
Imposta una callback che esegue la scrittura di un buffer dati sul socket UDP e ritorna il numero di byte inviati.
Trackle.setReceiveCallback()
Imposta una callback che legge il socket UDP e ritorna il numero di byte ricevuti.
Trackle.setRandomCallback
Imposta una callback per la generazione di un numero random. Se non definita viene utilizzata la funziona rand() che ritorna un numero pseudo-casuale.
Connessione
Dopo aver implementato la gestione del socket il client può tentare la connessione al cloud.
Trackle.connect()
Tenta la connessione al cloud. Restituisce il valore 0 se non ci sono errori, un valore <0 in caso di errore.
Trackle.connected()
Ritorna true se il dispositivo è connesso al cloud, altrimenti false .
Trackle.loop()
Esegue il background loop che si occupa della comunicazione bidirezionale tra dispositivo e cloud di mantenere il canale attivo. Se non viene chiamata abbastanza frequentemente, la connessione con il Cloud verrà persa.
Trackle.loop() è una funzione che blocca l'esecuzione del firmware per alcuni millisecondi. Più frequentemente viene chiamata, più il tempo di esecuzione si riduce e più il dispositivo risponde con velocità.
Trackle.disconnect()
Tenta di disconnettere il dispositivo dal cloud.
Quando il dispositivo non è connesso, diverse funzionalità come gli aggiornamenti OTA, Trackle.get e Trackle.post non sono disponibili.
Prodotti
Per i dispositivi che fanno parte di un prodotto e' necessario specificare anche un ID Prodotto e una versione del firmware.
Trackle.setProductId()
Configura l'ID prodotto di cui è parte il dispositivo.
Trackle.setFirmwareVersion()
Configura la versione firmware del prodotto.
Trackle.setComponentsList()
Permette di specificare una lista di componenti utilizzati ed inviarli al cloud. Questa informazione può essere utile per monitorare in modo più dettagliato le risorse e le funzionalità disponibili sul dispositivo.
Blockwise
Il Blockwise Transfer (RFC 7959) permette di suddividere un messaggio CoAP in blocchi numerati, rendendo possibile la gestione di payload molto grandi durante operazioni di Publish e Get senza superare i limiti del protocollo o della memoria disponibile.
La Trackle Library usa un sistema di buffer per memorizzare i blocchi:
buffer interno, gestito automaticamente
buffer esterno, gestito dall’utente (consigliato quando si ha poca RAM o si vuole ottimizzare l’allocazione)
La scelta tra buffer interno ed esterno dipende dai requisiti di memoria del dispositivo.
Configurazione
La dimensione e la capacità del sistema blockwise vengono configurate via macro di compilazione:
TRACKLE_BLOCKS_NUMBER
Numero massimo di blocchi che la libreria può memorizzare internamente. Più blocchi = messaggi più grandi gestibili, ma maggiore consumo di RAM.
Valori possibili: da 1 a 32 (default 4)
TRACKLE_CONCURRENT_MESSAGES
Numero massimo di messaggi Blockwise che possono essere gestiti contemporaneamente.
Valori possibili: da 1 a 4 (default 4)
Buffer interno vs buffer esterno
Buffer interno (default)
Allocato dalla libreria.
Semplice da usare, nessuna configurazione aggiuntiva.
Occupa RAM interna alla Trackle Library.
Non permette un controllo preciso del consumo di memoria.
Buffer esterno
Allocato dall’utente.
Permette di utilizzare:
RAM esterna,
RAM statica,
memoria più efficiente.
Utile in sistemi embedded a bassa RAM.
Si abilita tramite la funzione trackleSetExternalBuffer().
Parametri
extBuffer – puntatore al buffer esterno allocato dall’utente
size – dimensione totale del buffer
Valore ritornato
truese il buffer è stato impostato correttamentefalsese la dimensione è insufficiente
Note importanti
Il buffer deve essere statico o globale, non locale (sullo stack).
La dimensione deve essere sufficiente per contenere:
Se troppo piccolo, la libreria segnala errore.
Ultimo aggiornamento