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/arrow-up-right)

  • 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.

circle-info

Per ottenere l'array esadecimale dal file .der della chiave privata scaricata dalla Console è possibile usare questo comando su sistemi unix:

cat private_key.der | xxd -i

Comunicazione

Trackle Library si collega al Cloud attraverso il protocollo di comunicazione CoAP (IETF RFC 7252arrow-up-right), 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.

circle-info

Se l'hardware utilizzato dispone di metodi più sicuri per la generazione di un numero random, è possibile configurarli attraverso questa callback.

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.

circle-exclamation

Trackle.disconnect()

Tenta di disconnettere il dispositivo dal cloud.

circle-exclamation

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

  • true se il buffer è stato impostato correttamente

  • false se 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