IOT E M2M: UNA PANORAMICA DAI CONSTRAINED … · 3.1.1.4 Bootstrap da Server ... il protocollo a...

42
Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in RETI DI CALCOLATORI IOT E M2M: UNA PANORAMICA DAI CONSTRAINED DEVICE ALLA GESTIONE DEI DISPOSITIVI CON LWM2M Anno Accademico 2016/2017 Relatore: Simon Pietro Romano Candidato: Nicola d’Ambrosio matr. N46/2251

Transcript of IOT E M2M: UNA PANORAMICA DAI CONSTRAINED … · 3.1.1.4 Bootstrap da Server ... il protocollo a...

Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in RETI DI CALCOLATORI

IOT E M2M: UNA PANORAMICA DAI CONSTRAINED DEVICE ALLA GESTIONE DEI DISPOSITIVI CON LWM2M

Anno Accademico 2016/2017 Relatore:

Simon Pietro Romano Candidato:

Nicola d’Ambrosio

matr. N46/2251

Indice

Introduzione ....................................................................................................................................... 1

Capitolo 1: I Constrained Device ...................................................................................................... 3

1.1 Classificazione dei Constrained Device .................................................................................. 3 Capitolo 2: Il protocollo CoAP ......................................................................................................... 5

2.1 Introduzione ................................................................................................................................. 5

2.2 Caratteristiche ............................................................................................................................. 5

2.3 Formato dei messaggi ............................................................................................................... 6

2.3.1 Definizione di metodi ............................................................................................................... 8

2.3.2 Definizione di codici ................................................................................................................ 9

2.3.3 Options .................................................................................................................................... 11

2.4 Comunicazione/Trasmissione/Funzionamento ................................................................... 13

2.4.1 Modello messaggi ................................................................................................................ 13

2.4.2 Trasmissione affidabile dei messaggi ............................................................................... 14

2.4.3 Piggybacked .......................................................................................................................... 15

2.4.4 Separate ................................................................................................................................ 15

2.4.5 Trasmissione dei messaggi senza Reliability .................................................................. 15

2.4.6 Trasmissione dei messaggi senza Reliability .................................................................. 16

2.4.7 Messaggi e Endpoint ............................................................................................................ 16

2.4.8 Controllo congestione ........................................................................................................... 16 Capitolo 3: Il protocollo LwM2M ................................................................................................... 18

3.1 Le interfacce .............................................................................................................................. 20

3.1.1 L’interfaccia Bootstrap .......................................................................................................... 21

3.1.1.1 Bootstrap di fabbrica .......................................................................................................... 21

3.1.1.2 Bootstrap da Smartcard .................................................................................................... 22

3.1.1.3 Bootstrap da Client ............................................................................................................ 22

3.1.1.4 Bootstrap da Server ........................................................................................................... 23

3.1.1.5 I comandi di Bootstrap....................................................................................................... 24

3.1.2 L’interfaccia Client Registration........................................................................................... 24

3.1.3 L’interfaccia Device Management and Service Enablement .......................................... 25

3.1.4 L’interfaccia Information Reporting ..................................................................................... 26

3.2 Modello delle risorse ................................................................................................................ 27

3.2.1 Creazione e istanziazione di un modello delle risorse ............................................................. 28

3.2.1.1 Creazione di un modello delle risorse............................................................................. 29

3.2.1.2 Istanziazione delle risorse ................................................................................................ 31

3.2.2 Collegamento con il livello trasporto................................................................................... 33

3.2.2.1 Bootstrap Interface ............................................................................................................. 33

3.2.2.2 Registration Interface ........................................................................................................ 34

3.2.2.3 Device Management & Service Enablement Interface ................................................ 35

3.2.2.4 Information Reporting Interface ....................................................................................... 37

Bibliografia ....................................................................................................................................... 38

1

Introduzione

Al giorno d’oggi, si sta avendo un notevole sviluppo dell’ “Internet of Things”, conosciuto anche

con l’ acronimo “IoT”, ovvero con la terminologia italiana di “Internet delle cose” o “Internet degli

oggetti”.

L’idea fondante è quella di rendere gli oggetti intelligenti, dotati di una propria identità e capaci di

comunicare, scambiarsi informazioni, interagire e cooperare tra loro, tramite la rete. In virtù di

questa cooperazione e scambio di informazioni si possono creare nuove applicazioni e nuovi

servizi.

I potenziali vantaggi dell’IoT sono quasi illimitati e le applicazioni IoT stanno cambiando il nostro

modo di lavorare e vivere, facendo risparmiare tempo e risorse, aprendo nuove opportunità di

crescita, innovazione e creazione di conoscenze. L’Internet delle cose consente alle organizzazioni

private e pubbliche di gestire asset, ottimizzare le prestazioni e sviluppare nuovi modelli di

business. Nell'ultimo anno, l'IoT si è trasformato da una visione futuristica ad una realtà di mercato,

in continuo aumento.

L’IoT è così definito da ITU1 e da IERC

2:

“A dynamic global network infrastructure with self-configuring capabilities based on

standard and interoperable communication protocols where physical and virtual

‘things’ have identities, physical attributes, and virtual personalities and use

intelligent interfaces, and are seamlessly integrated into the information network.”

L’aspettativa dell’IoT è quella di un mondo in cui il reale, il digitale e il virtuale convergano per

creare ambienti intelligenti che rendano l'utilizzo dell’energia, i trasporti, le città e molte altre cose

più intelligenti. L'obiettivo di Internet delle cose è quello di consentire la connessione a chiunque, di

qualsiasi cosa, in qualsiasi momento, ovunque, con (idealmente) qualsiasi mezzo, qualsiasi rete e

qualsiasi servizio. L’IoT è la nuova rivoluzione di Internet. Gli oggetti si rendono riconoscibili e

acquisiscono intelligenza, potendo prendere decisioni, grazie al fatto che possono scambiarsi

informazioni, possono accedere ad informazioni che sono state aggregate da altri oggetti e possono

essi stessi essere componenti di servizi complessi.

1 ITU, acronimo di International Telecommunication Union 2 IERC sta per IoT European Research Cluster

2

In questo scenario diventano di fondamentale importanza le comunicazioni e le interazioni

Machine-to-Machine (M2M) e, quindi i sistemi M2M.

I componenti di un sistema M2M sono i seguenti:

M2M Device. Dispositivo M2M collegato al bene di interesse; fornisce funzionalità di

rilevamento ed attuazione. Tali dispositivi spesso hanno potenzialità limitate e per tale

ragione prendono il nome di ‘Constrained Device’.

Network. Fornisce la connettività remota tra i dispositivi M2M client e server (è

implementata un’architettura client-server).

M2M Service Enablement. Fornisce funzionalità generiche che sono comuni ad una serie di

applicazioni diverse. Il suo scopo primario è quello di ridurre i costi per l'implementazione,

evitando sviluppi di implementazioni specifiche, e di facilitare lo sviluppo di applicazioni.

M2M Application. L’applicazione che utilizza i dispositivi M2M

Tra i dispositivi M2M al giorno d’oggi si sta assistendo al notevole incremento produttivo dei

Constrained Device, dispositivi dalle ridotte dimensioni, peso e costo.

In questo lavoro di tesi verrà esaminato il protocollo Lightweight Machine-to-Machine per il

management dei Constrained Device, il protocollo a livello di Sessione CoAP3 e la libreria Leshan

per lo sviluppo di applicazioni per i Server ed i Client.

3 CoAP acronimo di Constrained Application Protocol

3

Capitolo 1: I Constrained Device

I Constrained Device nascono dall’esigenza di ridurre le caratteristiche di questi device per renderli

economicamente e fisicamente realizzabili. Tali device spesso vengono utilizzati per realizzare

dispositivi M2M.

Un Constrained Node è un nodo di rete costituito da un Constrained Device dove alcune

caratteristiche, che sono considerate scontate per i nodi di Internet, non sono presenti, spesso a

causa dei vincoli di costo e/o vincoli fisici come dimensione, peso e potenza del dispositivo. I limiti

di potenza, memoria e risorse di elaborazione portano all’introduzione di limiti per lo spazio di

codice e cicli di elaborazione. Bisogna anche osservare che i maggiori vincoli di questi dispositivi

vengono riscontrati nella bandwidth della rete.

La presenza dei suddetti limiti si manifesta in varie forme:

Vincoli sulla complessità massima del codice (ROM / Flash)

Vincoli sulla dimensione dello stato e dei buffer (RAM)

Vincoli sulla quantità di calcolo per unità di tempo ("potere di elaborazione")

Vincoli sull'interfaccia utente e accessibilità in fase di implementazione (capacità di

impostare chiavi, aggiornamento software, ecc.).

1.1 Classificazione dei Constrained Device A causa della vastissima varietà di dispositivi connessi a Internet che si possono utilizzare può

risultare utile andare a fare una classificazione degli stessi.

Name Data size (e.g., RAM) Code size (e.g., Flash)

Class 0, C0 << 10 KB << 100 KB

Class 1, C1 ~ 10 KB ~ 100 KB

Class 2, C2 ~ 50KB ~ 250 KB

I device di classe 0 sono dispositivi estremamente limitati (generalmente sensori). Sono così

gravemente vincolati dalle scarse capacità di memoria e di elaborazione che la maggior parte non ha

le risorse necessarie per comunicare direttamente con Internet in modo sicuro. I dispositivi di classe

0 partecipano alle comunicazioni via Internet con l'aiuto di dispositivi più grandi che agiscono come

proxy, gateway o server.

I dispositivi di classe 1 sono abbastanza limitati nello spazio e nell'elaborazione dei codici. Tali

device incontrano notevoli difficoltà nel comunicare con altri nodi presenti in rete che utilizzano

protocolli come HTTP, Transport Layer Security (TLS) e relativi protocolli di protezione, basati

sulla rappresentazione dei dati come XML. Tuttavia, essi sono in grado di utilizzare un protocollo

stack specificamente progettato per i Constrained-Node (come ad esempio CoAP) e partecipare a

comunicazioni di rete senza l'aiuto di un nodo gateway.

I dispositivi di classe 2 sono meno vincolati e fondamentalmente capaci di supportare la maggior

parte degli stessi stack di protocolli utilizzati sui notebook o server. Tuttavia, anche per questi

dispositivi è consigliabile utilizzare protocolli efficienti nell’utilizzo della larghezza di banda.

Inoltre, usando meno risorse per il networking si lascia più banda disponibile per le applicazioni.

4

Si può osservare che, comunque, esistono dispositivi limitati con potenzialità superiori rispetto alla

classe 2. Tali dispositivi creano meno problemi per lo sviluppo di applicazioni poiché possono

utilizzare i protocolli esistenti senza alcun tipo di variazione.

5

Capitolo 2: Il protocollo CoAP

Il Constrained Application Protocol (CoAP) è un protocollo di trasferimento web progettato per lo

scambio di messaggi tra nodi e network aventi hardware dalle potenzialità limitate. CoAP fornisce

un modello di interazione richiesta/risposta tra le applicazioni endpoint studiato per interfacciarsi

facilmente con HTTP, permettendo anche comunicazioni multicast e, allo stesso tempo, limitando

l’overhead.

2.1 Introduzione

L’utilizzo di servizi web (web api) è diventato fondamentale nella maggior parte delle applicazioni

grazie all’uso dell’architettura REpresentational State Transfer (REST). È importante ricordare che

l’utilizzo di architetture REST può richiedere risorse hardware spesso non disponibili negli

ambienti di Constrained RESTful Environments (CoRE) e per tale ragione si devono individuare

delle soluzioni per rendere utilizzabili architetture software REST anche da dispositivi con capacità

hardware limitate. I progettisti del protocollo CoAP, per raggiungere tale scopo, hanno cercato di

limitare il più possibile l’overhead all’interno dei messaggi al fine di diminuire il bisogno di

frammentazione. Con tali linee guida CoAP fornisce un generico protocollo web disegnato su

misura per i dispositivi constrained. È importante ricordare che l’obiettivo di tale protocollo non è

quello di comprimere “ciecamente” il protocollo HTTP, ma di realizzare un sottoinsieme comune di

operazioni REST con HTTP, ottimizzate per i dispositivi M2M. Le interazioni tra gli utilizzatori di

tale protocollo risultano essere molto semplici. Lo scambio di messaggi previsto da CoAP segue le

regole del modello client/server di HTTP con alcune piccole differenze. Infatti, nelle interazioni

M2M, i ruoli di client e di server vengono spesso scambiati tra gli endpoint presenti nella

comunicazione. All’interno di una comunicazione, il client è colui che effettua l’invio di una

determinata richiesta mentre, il server, è colui che riceve la richiesta e risponde fornendo la risorsa

desiderata. È importante ricordare che, a differenza di HTTP, CoAP è in grado di inviare messaggi

asincroni grazie all’utilizzo di canale di trasmissione a datagrammi come UDP. Tale protocollo

prevede anche la possibilità di avere una comunicazione affidabile attraverso un layer Messanger

che permette di colmare le lacune presenti nel protocollo di trasporto UDP.

2.2 Caratteristiche

Le principali caratteristiche di CoAP sono:

Protocollo Web che soddisfa i requisiti M2M UDP con possibilità di trasmissione affidabile dei messaggi sia con richieste unicast e

multicast. Scambio di messaggi asincroni Basso overhead nel header dei messaggi e bassa complessità di parsing. Supporto di URI e Content-type

6

Semplici capacità di proxy e caching dei messaggi Possibilità di utilizzo di un canale DTLS Un mapping HTTP senza stati

2.3 Formato dei messaggi

CoAP si basa sullo scambio di messaggi compatti trasportati con UDP (viene previsto anche

l’utilizzo di altri protocolli come DTLS, TCP, SMS). Un messaggio CoAP inizia con un header di

lunghezza fissa di 4 byte. Quest’ultimo è seguito da un campo opzionale di lunghezza variabile (0-8

byte) denominato Token value. Dopo il Token value è previsto un campo di dimensione variabile

(0-8 byte) in cui è previsto l’inserimento di zero o più opzioni di trasferimento del messaggio.

Un’opzione può essere seguita dalla fine del messaggio, da un’altra opzione oppure dal payload-

ma’ker e il payload. Il payload-maker è un prefisso a lunghezza fissa di un byte (0xFF) per indicare

la fine delle opzioni e l’inizio del payload. Il payload si estende dalla fine del payload maker fino

alla conclusione del datagramma UDP. La presenza di un payload-maker associato ad un payload di

lunghezza nulla indica un errore di costruzione del messaggio. Si deve osservare che le specifiche

CoAP prevedono esclusivamente un limite superiore per la dimensione dei messaggi. Messaggi di

lunghezza superiore al pacchetto IP risultato indesiderabili a causa della frammentazione che

quest’ultimi devono subire. Per tale ragione i pacchetti CoAP dovrebbero avere le dimensioni

adeguate per calzare perfettamente in un unico datagramma IP ed evitare la frammentazione del

messaggio. Tale formattazione del messaggio viene utilizzata sia dal Client per effettuare le

richieste desiderate sia dal Server per rispondere a queste ultime.

Versione (2 bit unsigned integer)

Indica il version number utilizzato di CoAP. Tale campo deve essere settato con il valore 1 (01 in

binario). Altri valori sono riservati per versioni future. I messaggi con versioni non identificate

vengono silenziosamente ignorate dal server.

7

Type (2 bit unsigned integer)

Due bit che indicano il tipo del messaggio. In CoAP sono previsti quattro tipi di messaggi:

confermabile (0 - 00), non confermabile (1 - 01), acknowledgement (2 - 10) e reset(3 - 11).

I messaggi confirmable hanno bisogno di un acknowledgement. Quando il messaggio è arrivato a

destinazione il server è obbligato a rispondere con un acknowledgement oppure con un reset. Tale

tipo di messaggio permette la comunicazione reliable.

I messaggi non confirmable non richiedono alcun onere di invio di acknowledgement e sono

necessari per l’implementazione della comunicazione asincrona.

Il messaggio di acknowledgement indica la corretta ricezione di una determinata richiesta.

Il messaggio di reset viene utilizzato quando il messaggio ricevuto da un server presenta

determinate caratteristiche tali da non essere poter essere processato dal Server.

Nella descrizione di questi tipi di messaggi si evince subito l’ortogonalità delle interazioni

richiesta/risposta infatti i messaggi confermabili/non confermabili sono utilizzati dal client per

avanzare una richiesta mentre i messaggi di reset/acknowledgement sono utilizzati dal server per

rispondere a tali richieste.

Message ID (16 bit unsigned int)

Utilizzato per identificare i messaggi duplicati e soprattutto per permettere un corretto match tra gli

acknowledgement/reset e i messaggi confermabili/non confermabili. Infatti, i messaggi di

acknowledgement e di reset sono associati ad un messaggio confermabile o non confermabile grazie

al message ID e alle informazioni sull’indirizzo dell’endpoint corrispondente.

Il message ID viene deciso dal mittente del messaggio e, successivamente, copiato nel messaggio di

risposta creato dal server. Si osservi che non è possibile riusare lo stesso message ID all’interno

della stessa EXCHANGE_LIFETIME (finestra temporale in cui il client è ancora in attesa della

risposta).

Un altro importante utilizzo del message ID è quello di eliminare i messaggi duplicati. Un ricevente

potrebbe ricevere lo stesso messaggio confermabile più volte all’interno dello stesso intervallo

EXCHANGE_LIFETIME. Il ricevente dovrebbe rispondere con un acknowledgement o con un

reset per ogni copia del messaggio confermabile duplicato ma, allo stesso tempo, processare ogni

richiesta o risposta una sola volta. Le duplicazioni del messaggio si possono verificare nel caso in

cui l’ack non venga ricevuto dal suo destinatario oppure non riesca a raggiungere il destinatario

all’interno della finestra temporale prevista dal protocollo.

Inoltre, un ricevente potrebbe ricevere più volte lo stesso messaggio non confermabile ad istanti di

tempo ravvicinati. In queste condizioni il destinatario di tali messaggi può decidere di ignorare

silenziosamente ogni duplicato del messaggio non confermabile e processare qualsiasi richiesta o

risposta una sola volta.

8

Code (8 bit unsigned int)

Il campo codice può indicare un Method code (per la richiesta) oppure un Responce Code (per la

risposta). Tale campo risulta essere suddiviso in due sezioni: “class”(3 bit più significativi) e

“detail”(i rimanenti 5 bit). Le classi possono indicare una richiesta (0), una risposta avvenuta con

successo (2), una risposta causata dagli errori del client (3), una risposta causata dagli errori del

server (4)(Il valore 1 è riservato). Un caso speciale risulta essere il codice 0.00 il quale indica la

presenza di un messaggio vuoto. Nel caso fosse presente all’interno della classe del codice il valore

0 allora tale campo indicherà una richiesta di metodo. Nel caso in cui il codice fosse presente in un

messaggio di risposta il codice risulterà essere di risposta (ovvero classi 2 3 4).

2.3.1 Definizione di metodi

GET

Il metodo GET recupera una rappresentazione per le informazioni che correntemente corrispondono

alla risorsa identificata dall'URI della richiesta. Se eseguita con successo è possibile all’interno del

messaggio individuare i codici 2.05 (Content) oppure 2.03 (Valid).

Tale metodo è sicuro e idempotente.

POST

Il metodo POST richiede di elaborare la rappresentazione allegata alla richiesta. La funzione

effettiva eseguita dal metodo POST è determinata dal server di origine e dipende dalla risorsa di

destinazione. Di solito o si crea una nuova risorsa o la risorsa di destinazione viene aggiornata.

Se la risorsa è stata creata sul server, la risposta inviata avrà il codice 2.01 (create) e l'URI

corrispondente sarà inserito in una sequenza di Location-Path e / o Location-Query contenute nelle

opzioni.

Invece, nel caso in cui il POST va comunque a buon fine, ma non provoca la creazione di una

nuova risorsa sul server, la risposta avrà il codice 2.04 (modified).

Infine, se il POST ha esito positivo e come risultato la risorsa di destinazione viene eliminata, la

risposta avrà il codice 2,02 (deleted).

Il metodo POST non è sicuro e idempotente.

PUT

Il metodo PUT richiede che la risorsa identificata dall'URI della richiesta venga aggiornata o creata

con la rappresentazione allegata. Il formato di rappresentazione è specificato dal tipo di supporto e

dal codice contenuto contenuto nell'opzione Content-Format Option, se previsto. Se una risorsa

esiste all'URI di richiesta, la rappresentazione allegata sarà considerata una sua versione modificata

e verrà restituito un codice di risposta 2.04 (changed). nel caso in cui non dovesse esiste alcuna

risorsa, il server potrebbe crearne una nuova con tale URI, generando un codice di risposta 2.01

(created). Se la risorsa non è stata creata o modificata, è necessario inviare l’errore appropriato.

9

L’operazione PUT non è sicura ma è idempotente.

DELETE

Il metodo DELETE richiede che la risorsa identificata dall'URI della richiesta venga eliminata. Il

codice di risposta 2.02 (deleted) sarà usato sia in caso di successo sia nel caso in cui la risorsa non

esistesse prima della richiesta.

DELETE non è sicura ma è idempotente.

2.3.2 Definizione di codici

I codici di risposta vengono inseriti dal server all’interno del messaggio. Tali codici hanno lo scopo

di informare il client sullo stato di terminazione dell’operazione richiesta.

Success 2.xx

Questa classe di codice di risposta indica che la richiesta dei client è stata ricevuta, compresa e

accettata con successo.

2.01 Created

Utilizzata esclusivamente nelle richieste di PUT e POST. Il payload ottenuto con la risposta, se è

presente, è una rappresentazione del risultato dell'azione richiesta. Se la risposta include una o più

opzioni di Location-Path e / o di Location-Query, i valori di questi ultimi specificano la posizione in

cui è stata creata la risorsa (l’URI).

Questa risposta non è cachable.

2.02 Deleted

Tale codice è utilizzato esclusivamente in risposta alle richieste che causano la terminazione della

disponibilità di una data risorsa. Il payload restituito, se presente, fornisce una rappresentazione del

risultato dell’azione.

Anche questa operazione non è cachable.

2.04 Changed

Tale codice è utilizzato esclusivamente con i metodi POST e PUT e indica la corretta

modifica/creazione della risorsa desiderata. Il payload restituito con la risposta, se presente, è una

rappresentazione del risultato dell'azione.

Tale risorsa non è cachable.

10

2.05 Content

Tale codice indica il corretto conseguimento della operazione di GET. Il payload restituito con la

risposta è una rappresentazione della risorsa di destinazione. Tale operazione è cachable.

Client Error 4.xx

Questa classe di codice di risposta è destinata a casi in cui si ha un errore da parte del client. Questi

codici di risposta sono applicabili a qualsiasi metodo di richiesta.

4.00 Bad Request

Questo codice di risposta è equivalente a HTTP 400 "Bad Request

4.01 Unauthorized

Il client non è autorizzato a eseguire l'azione richiesta. Il client non dovrebbe ripetere la richiesta

senza prima aver cambiato il suo stato di autenticazione sul server.

4.02 Bad Option

La richiesta non è stata eseguita dal server a causa di una o più opzioni non riconosciute o non

correttamente inserite all’interno del messaggio.

4.03 Forbidden

Questo codice di risposta è analogo al 403 "Forbidden" di HTTP.

4.04 Not Found

Questo codice di risposta è analogo al 403 "Not Found" di HTTP.

Server Error 5.xx

Questa classe di codice di risposta indica i casi in cui il server è consapevole dell’impossibilità di

eseguire la richiesta. Tali codici sono applicabili a qualsiasi metodo di richiesta.

5.00 Internal Server Error

Questo codice di risposta è analogo al 403 "Internal Server Error" di HTTP.

5.01 Not Implemented

Questo codice di risposta è analogo al 403 "Not Implemented" di HTTP.

11

5.02 Bad Gateway

Questo codice di risposta è analogo al 403”Bad Gateway" di HTTP.

5.03 Service Unavailable

Questo codice di risposta è analogo al 403 "Service Unavailable" di HTTP.

5.04 Gateway Timeout

Questo codice di risposta è analogo al 403 "Gateway Timeout" di HTTP.

Token Length (TKL) (4 bit unsigned int).

Indica la lunghezza del campo Token (0-8 byte). Valori di lunghezza del token tra 9 e 15 non sono

ammessi e pertanto il messaggio non può essere inviato e deve essere processato come avente un

errore di costruzione.

I token sono utilizzati per far coincidere richieste e risposte. Ogni richiesta inviata dal client

trasporta un token da trascrivere nel messaggio di risposta generato dal server. I token sono

utilizzati come identificatori dal client per differenziare le richieste correnti. Infatti, la generazione

dei token da parte del client è effettuata garantendo l’unicità per ogni specifica source/destination.

Può essere utilizzato un token nullo esclusivamente nel caso in cui non sono utilizzati altri token per

una data destinazione oppure quando le richieste vengono fatte serialmente e ricevono sempre

risposte.

2.3.3 Options

CoAP definisce un numero di opzioni che possono essere inserite all’interno del messaggio. Ogni

istanza di opzione specifica: il numero di opzione tra quelle definite in CoAP, la lunghezza del

valore dell’opzione e il valore dell’opzione stessa. Invece di specificare direttamente il numero

dell’opzione, le istanze devono essere inserite in ordine secondo il loro option number e in modo da

utilizzare una codifica “ delta” tra di esse: il numero dell’opzione per ogni istanza è calcolato come

somma tra il suo delta e il valore dell’istanza dell’opzione precedente presente nel messaggio. Per la

prima istanza del messaggio viene assunta l’esistenza di un’istanza di opzione precedente avente

valore nullo. Più istanze della stessa opzione possono essere inserite utilizzando un valore delta

nullo.

12

I campi in una determinata opzione sono definiti come seguono:

Option Delta (4 bit unsigned int): può assumere valori tra 0 e 12. Tre valori sono utilizzati per usi

speciali:

13 - Viene utilizzato per rappresentare la delta un unsigned int di 8 bit. Tale valore viene

memorizzato dopo il primo byte dell’istanza dell’opzione. Il valore contenuto in tale campo deve

essere sottratto di 13.

14 - Viene utilizzato per rappresentare la delta un unsigned int di 16 bit. Tale valore viene

memorizzato dopo il primo byte dell’istanza dell’opzione. Il valore contenuto in tale campo deve

essere sottratto di 265.

15 - Riservato per il payload maker.

Il delta viene calcolato come la differenza tra il numero dell’opzione corrente e quello dell’istanza

precedente, pertanto l’option number può essere calcolato semplicemente sommando

esclusivamente tutti i delta.

Option Length (4 bit unsigned int): può assumere valori tra 0 e 12. Tale campo indica la lunghezza

dei valori associati all’opzione in byte. Tre valori sono utilizzati per usi speciali:

13 - Viene utilizzato per rappresentare l’Option Lenght con un unsigned int di 8 bit. Tale valore

viene memorizzato dopo il primo byte dell’istanza dell’opzione oppure dopo l’estensione del delta

se presente. Il valore contenuto in tale campo deve essere sottratto di 13.

14 - Viene utilizzato per rappresentare l’Option Lenght con un unsigned int di 16 bit. Tale valore

viene memorizzato dopo il primo byte dell’istanza dell’opzione oppure dopo l’estensione del delta

se presente. Il valore contenuto in tale campo deve essere sottratto di 269.

15 - Riservato per il payload maker.

Lista opzioni

CoAP definisce un singolo insieme di opzioni che vengono utilizzate sia per le richieste che per

risposte: ETag

Location-Path

Location-Query

Max-Age

Proxy-Uri

Proxy-Scheme

Uri-Host

Uri-Path

Uri-Port

Uri-Query

Accept

If-Match

If-None-Match

Size1

13

Option Length

I valori delle opzioni sono definiti per avere una lunghezza specifica e, pertanto, l’insieme dei

valori rappresentabili è delimitato da un limite inferiore e superiore. Se la lunghezza di un valore di

opzione in una richiesta è al di fuori del range definito, tale opzione deve essere trattata come

un'opzione non riconosciuta.

Option Numbers

Le opzioni sono riconosciute da un numero identificativo il quale fornisce anche alcune

informazioni aggiuntive sul tipo di opzione. Il numero di una determinata opzione è costruito in

maniera tale che, confrontando con una determinata maschera permette di individuare se l’opzione

risulta essere critica, elective, Unsafe or Safe-to-Forward. La maschera per individuare le

caratteristiche di una determinata opzione può essere costruita su un singolo byte

Il bit 7 (il bit meno significativo) uguale a 1 indica che un'opzione è Critica (e elective quando 0). Il

bit 6 uguale a 1, indica che un'opzione è Unsafe (0 quando è Safe-to-Forward). Se il bit 6 è 0, cioè

l'opzione Safe-to-Forward, e i bit 3-5 sono tutti impostati su 1, non è memorizzata alcuna chiave di

cache (NoCacheKey). Tutte le altre combinazioni di bit significa che è in realtà una chiave di cache

Payload

I messaggi di richiesta e di risposta avranno o meno un payload a secondo del codice di metodo o

codice di risposta utilizzato. Se un determinato metodo o codice di risposta non è definito per avere

un payload allora quest’ultimo risulterà essere ignorato.

In genere il payload nelle operazioni avvenute con successo (sia metodi che risposte) mantiene una

rappresentazione della risorsa richiesta. Il formato di rappresentazione del payload è specificato

dalla codifica dei contenuti del payload ed è indicata nell'opzione Content-Format Option. In

assenza di questa opzione non viene assunto alcun valore predefinito ed il formato deve essere

dedotto dall'applicazione.

2.4 Comunicazione/Trasmissione/Funzionamento

2.4.1 Modello messaggi Il modello messaggi di CoAP è basato sullo scambio di messaggi attraverso il canale a datagrammi

UDP tra due endpoint. Tale protocollo permette la consegna affidabile e inaffidabile dei messaggi. I

modelli Richiesta/risposta sono necessari per un corretto scambio di messaggi tra client e server.

14

L’affidabilità dei messaggi è fornita grazie all’utilizzo di messaggi Confirmable. In questo caso,

infatti, si fa uso di un timeout predefinito per le ritrasmissioni e un Back-off esponenziale tra esse. Il

client termina le ritrasmissioni alla ricezione di un messaggio di conferma (ACK) con lo stesso ID

del messaggio iniziale.

Quando il destinatario non è in grado di processare il messaggio appena ricevuto, invia un

messaggio di reset (RST) invece del messaggio di acknowledgement.

Nel caso non si fosse interessati ad uno scambio affidabile dei messaggi è possibile inoltrare la

richiesta desiderata con un messaggio non confermabile. In tal condizioni il Server non è obbligato

all’invio del acknowledgement.

2.4.2 Trasmissione affidabile dei messaggi

I messaggi CoAP vengono scambiati in modo asincrono tra gli endpoint CoAP. Poiché CoAP è

legato al protocollo di livello trasporto non affidabile UDP, i messaggi CoAP possono arrivare fuori

ordine, duplicati oppure, nella peggiore delle ipotesi, essere persi. Per questo motivo, CoAP

implementa un meccanismo di affidabilità leggera, senza cercare di ricreare l'insieme completo di

funzionalità offerte dal protocollo TCP. Pertanto, l’affidabilità in COAP è data da:

la possibilità di ritrasmissione e attesa con back-off esponenziale per i messaggi confermabili.

il rilevamento dei duplicati per i messaggi confermabili e non-confermabili.

La trasmissione affidabile di un messaggio viene avviata contrassegnando come confermabile

nell'intestazione CoAP.

Un messaggio confermabile porta sempre una richiesta o una risposta, a meno che non venga

utilizzato solamente per generare un messaggio di RESET (messaggio vuoto in questo caso). Il

destinatario ha l’obbligo di inviare un acknowledgement nel caso in cui possa processare la richiesta

oppure deve rigettare la richiesta se presenta qualche forma di ambiguità. Il rigetto di una richiesta

confermabile impone al destinatario l’invio di un messaggio di RESET al mittente. Il messaggio di

acknowledgement deve riportare l'ID messaggio del messaggio confermato e la risposta

(piggybacked) oppure essere vuoto. Il messaggio di ripristino deve riprendere solo l'ID messaggio

del messaggio confirmable. Si ricordi che i riceventi di un messaggio di acknowledgement o di reset

non devono rispondere con altri acknowledgement o reset.

In caso di mancata ricezione dell' acknowledgement il mittente dovrà ri-trasmettere il messaggio.

Tale ritrasmissione del messaggio avverrà con intervalli esponenzialmente maggiori, fino a quando

15

non si riceve l’acknowledgement oppure si esauriscono i tentativi disponibili. La ri-trasmissione è

controllata da due fattori di cui un endpoint CoAP deve tenere traccia: il timeout e il conteggio delle

ritrasmissioni. Per un nuovo messaggio confermabile il timeout è settato randomicamente mentre il

conteggio delle ritrasmissioni è impostato a zero. Allo scadere del timeout, se il contatore di

ritrasmissione è inferiore a MAX_RETRANSMIT, il messaggio viene ritrasmesso. Se il contatore

di ritrasmissione raggiunge MAX_RETRANSMIT in un timeout o se l'endpoint riceve un

messaggio di reset il tentativo di trasmettere il messaggio viene annullato. Invece, se l'endpoint

riceve un acknowledgement in tempo, la trasmissione è considerata riuscita. Esistono casi in cui un

endpoint CoAP che ha inviato un messaggio confirmable potrebbe declinare nel tentativo di

ottenere un ACK ancor prima che il valore del contatore MAX_RETRANSMIT sia raggiunto (per

esempio alla ricezione di un risposta per un messaggio con risposta separata).

2.4.3 Piggybacked

Nella maggior parte dei casi la risposta viene riportata direttamente nel messaggio di

riconoscimento associato alla richiesta. Tale metodologia di risposta prende il nome di

Piggybacked. La risposta viene restituita nel messaggio di acknowledgement, indipendentemente

dal fatto che la risposta indica il successo o il fallimento. Utilizzando questa tecnica la risposta

viene inviata insieme al acknowledgement e non è necessario inviare un messaggio separato per

fornire la risposta della richiesta.

2.4.4 Separate

Esistono casi in cui non è possibile restituire una risposta piggybacked a causa della mancata

disponibilità della risorsa richiesta. Quindi, per evitare l'eccessiva duplicazione dei messaggi, si

separano le due componenti del messaggio piggybacked: acknowledgement e risorsa. Un server

può implementare tale soluzione avviando un timer insieme alla richiesta per ottenere la

rappresentazione della risorsa . Se la risorsa non è ancora disponibile allo scadere del timer, il

Server invierà al mittente un acknowledgement associato ad un messaggio vuoto. Quando il server

ha finalmente ottenuto la rappresentazione delle risorse, invierà la risposta al client. Tale risposta è

inviata con un messaggio confirmable utilizzando un nuovo message ID scelto dal server e lo stesso

token presente nella richiesta iniziale. Pertanto, quando il server invia un acknowledgement vuoto,

non deve inoltrare la risposta in un altro acknowledgement, anche se il client nel frattempo ha

effettuato un'altra richiesta identica. Il server termina la trasmissione della risposta alla ricezione di

un acknowledgement o di un reset da parte del client.

2.4.5 Trasmissione dei messaggi senza Reliability

Alcuni messaggi non necessitano di acknowledgement. Un messaggio può essere inviato senza

reliability marcandolo come non confermabile. Un messaggio non confermabile deve sempre

trasportare una richiesta o una risposta e pertanto non può essere inviato vuoto; il messaggio non

16

confermabile non obbliga il ricevente all’invio del acknowledgement. Un destinatario deve rifiutare

il messaggio se manca il contesto per elaborarlo correttamenteoppure presenta errori nel formato. Il

rigetto di un messaggio non confermato comporta l’invio di un messaggio di reset al client ed il

rifiuto della richiesta in maniera silenziosa. Per il mittente non esiste alcun sistema per scoprire

informazioni riguardo la consegna del messaggio. Per tale ragione un mittente può decidere di

inviare copie multiple dello stesso messaggio per aumentare le probabilità di ricezione di

quest’ultimo. I messaggi non confermati specificano un solo message ID per evitare che il ricevente

processi più volte la stessa identica richiesta.

2.4.6 Trasmissione dei messaggi senza Reliability

CON NON ACK RST

Request X X - -

Response X X X -

Empity * - X X

Il simbolo "*" indica che la combinazione non viene utilizzata nel normale funzionamento del

protocollo ma solo per generare un messaggio di ripristino ("Coap ping").

2.4.7 Messaggi e Endpoint

Un endpoint CoAP è la sorgente o la destinazione di un messaggio CoAP. In questo protocollo

l'endpoint viene identificato a seconda della modalità di sicurezza utilizzata. Senza alcun sistema di

sicurezza, l'endpoint è solamente identificato da un indirizzo IP e un numero di porta UDP. Con

altre modalità di sicurezza, l'endpoint viene identificato come definito dalla modalità di sicurezza

utilizzata. All’interno di questo protocollo esistono vari tipi di messaggi. Il Tipo di messaggi può

essere individuato dal campo tipo del header. Oltre al tipo i messaggi possono essere classificati in:

richiesta, risposta oppure vuoto. La classificazione di tali messaggi può essere riconosciuta grazie al

campo codice dell’header. Se la classe del campo codice presenta il valore 0 allora quest’ultimo

risulta essere un messaggio di richiesta, altrimenti è un messaggio di risposta. Caso particolare è il

codice 0.00. Tale codice viene utilizzato per segnalare la presenza di un messaggio vuoto. In un

messaggio vuoto il campo lunghezza del Token deve essere impostato su 0 e non deve essere

presente payload. Nel caso almeno una di queste condizioni non vengano rispettate allora il

messaggio vuoto verrà processato come un messaggio di errore.

2.4.8 Controllo congestione

Un elementare controllo della congestione è effettuato utilizzando il meccanismo di bake-off

esponenziale. Per non causare congestione i client devono limitare le interazioni simultanee

eccezionali che mantengono in un determinato momento con uno specifico server. Il numero

17

massimo di interazioni è indicato dal parametro NSTART. Una interazione eccezionale è un

messaggio confermabile (CON) per il quale si sta aspettando ancora un acknowledgement o una

risposta. Il valore di default di interazioni simultanee aperte ammesse è 1. Al raggiungimento

dell’istante di tempo denominato EXCHANGE_LIFETIME il client termina l’attesa di una risposta

e pertanto l’interazione eccezionale può considerarsi conclusa.

2.4.9 Regole per il matching delle richieste e delle risposte

Le regole per il matching di una risposta a una richiesta sono le seguenti:

L'endpoint di origine della risposta deve essere lo stesso dell'endpoint di destinazione della richiesta originale.

In una risposta piggybacked, l'ID messaggio della richiesta confermabile e la acknowledgement devono corrispondere e i token della risposta e della richiesta originale devono coincidere. In una risposta separata, solo i token della risposta e della richiesta originale devono corrispondere

18

Capitolo 3: Il protocollo LwM2M

Il protocollo LwM2M4 è un protocollo ideato per dispositivi con risorse limitate, nel seguito

indicati come ‘LwM2M devices’. Per questi dispositivi è necessario utilizzare un protocollo leggero

e compatto ed un efficiente modello di dati delle risorse.

L’OMA5 definisce un ‘LwM2M Enabler’ dotato delle seguenti caratteristiche:

Un modello di risorse semplice

Operazioni per la creazione, l'aggiornamento, la cancellazione e il recupero delle risorse.

Notifiche asincrone delle modifiche delle risorse.

Supporto per diversi formati di serializzazione.

Sicurezza della comunicazione basata sul protocollo DTLS6 che supporta diversi tipi di

credenziali.

Funzionalità per un client LwM2M di informare il server LwM2M che potrebbe essere

disconnesso per un periodo prolungato e di avvisarlo quando diventa nuovamente

raggiungibile.

Supporto per l'utilizzo di più server LwM2M.

Fornitura di credenziali e ‘access control lists’ da un server di avvio dedicato (LwM2M

bootstrap-server).

L'Enabler LwM2M definisce il protocollo di comunicazione, a livello di applicazione, tra un server

LwM2M e un client LwM2M, che è situato in un dispositivo LwM2M. Viene, quindi, introdotta

un'architettura client-server, dove il dispositivo LwM2M funge da client LwM2M ed il servizio,

ovvero l'applicazione M2M, funge da server LwM2M.

L'Enabler LwM2M dispone di due componenti, LwM2M Server e LwM2M Client e quattro

interfacce tra queste due componenti che sono:

Bootstrap

Client Registration

Device management and service enablement

Information Reporting

L'Enabler LwM2M utilizza il protocollo CoAP, descritto nel capitolo precedente.

Il DTLS fornisce la sicurezza per il livello di trasporto UDP.

4 LwM2M è acronimo di Lightweight Machine-to-Machine 5 OMA è acronimo di Open Mobile Alliance 6 DTLS è acronimo di Datagram Transport Layer Security

19

L’architettura è mostrata nella figura seguente:

Nella figura successiva è mostrato lo stack del protocollo LwM2M:

L'Enabler LwM2M definisce un modello di risorse semplice; ogni pezzo di informazione, reso

disponibile dal Client LwM2M, è una Risorsa.

20

Le Risorse sono logicamente organizzate in Oggetti.

Ad ogni Risorsa è assegnato un identificatore unico all’interno dell’oggetto.

Ad ogni Oggetto è assegnato un identificatore unico allocato e mantenuto dall’ OMNA7.

Nella figura seguente è illustrata questa struttura e le relazioni tra le Risorse e gli Oggetti.

Il Client LwM2M può avere un numero di Risorse qualsiasi, ognuna delle quali appartenenti ad un

Oggetto. Per esempio, l’Oggetto ‘Firmware Update’ contiene tutte le Risorse usate per il firmware

update.

L'Enabler LwM2M definisce Oggetti e Risorse standard. Altri Oggetti possono essere aggiunti

dall’OMA8 o da altre organizzazioni per abilitare Servizi M2M

9 addizionali.

Nella versione 1.0 dell'Enabler LwM2M sono definiti i seguenti Oggetti standard: 0. Security Object

1. Server Object

2. Access Control Object

3. Device Object

4. Connectivity Monitoring Object

5. Firmware Update Object

6. Location Object

7. Connectivity Statistics Object

Una Risorsa può contenere un valore (se essa è Readable e/o Writeable) oppure può essere

indirizzata da un server LwM2M per eseguire un’azione nel client LwM2M (se è Executable).

La specifica dell’Oggetto definisce le operazioni (Read, Write, Execute) che sono individualmente

consentite per le Risorse appartenenti a quell’Oggetto.

L'Enabler LwM2M definisce un meccanismo di controllo degli accessi per le ‘Object Instances’. Le

‘Object Instances’ dovrebbero avere associate un ‘Access Control Object Instance’. Un ‘Access

Control Object Instances’ contiene una Access Control Lists (ACLs) che definisce quali operazioni

sono permesse su una ‘Object Instance’ per quel/quei Server LwM2M.

L'Enabler LwM2M definisce quattro formati di dati: plain text, opaque, TLV e JSON. Il Server

LwM2M deve supportare tutti questi formati di dati; il Cliente LwM2M deve supportare almeno il

formato TLV.

3.1 Le interfacce

Come già detto precedentemente, ci sono quattro interfacce: 1) Bootstrap, 2) Client Registration, 3)

Device Management and Service Enablement, e 4) Information Reporting.

Le operazioni per queste interfacce possono essere operazioni di uplink, se dirette dal Client

LwM2M al Server LwM2M, oppure operazioni di downlink, se dirette dal Server LwM2M al Client

LwM2M.

Le operazioni su queste interfacce sono riassunte nella seguente tabella:

7 OMNA è acronimo di Open Mobile Naming Authority 8 OMA, acronimo di Open Mobile Alliance 9 M2M, Machine to Machine

21

3.1.1 L’interfaccia Bootstrap

L'interfaccia Bootstrap viene utilizzata per fornire informazioni essenziali nel client LwM2M per

consentire al client LwM2M di eseguire l'operazione di registrazione con uno o più server LwM2M.

Ci sono quattro modalità di bootstrap supportate dall'Enabler LwM2M:

Bootstrap di fabbrica

Bootstrap da Smartcard

Bootstrap iniziato dal Client

Bootstrap iniziato dal Server

Le ultime due modalità Bootstrap richiedono l'ausilio di un Bootstrap-Server LwM2M ed è

necessario che il Client LwM2M abbia un Account Bootstrap-Server sul Bootstrap-Server.

Il Bootstrap-Server LwM2M deve supportare sia il Bootstrap iniziato dal Client che quello iniziato

dal Server.

Il Client LwM2M deve supportare almeno una modalità di bootstrap specificata nell'interfaccia di

Bootstrap.

Il modello operazionale è schematizzato nella figura seguente:

3.1.1.1 Bootstrap di fabbrica

In questa modalità il Client LwM2M viene fornito delle informazioni di Bootstrap necessarie prima

del suo utilizzo.

22

3.1.1.2 Bootstrap da Smartcard

Quando il dispositivo supporta una smartcard, il Client LwM2M deve recuperare ed elaborare i dati

di bootstrap contenuti nella smartcard.

Operativamente, dopo che il recupero dei dati di bootstrap è riuscito, il Client LwM2M deve

applicare le informazioni di Bootstrap della Smartcard alla sua configurazione, per aumentare la

sicurezza. A causa della natura sensibile di questi dati, deve essere stabilito un canale di

comunicazione sicuro tra la Smartcard ed il Device.

Il Client LwM2M deve anche assicurarsi che i dati recuperati precedentemente dalla Smartcard

siano rimasti invariati all’interno della stessa. Se questi dati sono variati, le precedenti informazioni

di Bootsrap devono essere disabilitate nel Client LwM2M e questo dovrebbe applicare le nuove

informazioni alla sua configurazione. Se la Smartcard è disabilitata, come accade se essa viene

rimossa, le informazioni di Bootstrap da questa precedentemente caricate, devono essere cancellate.

Il controllo per entrambi questi due casi deve essere eseguito ogni volta che viene eseguita una

operazione di “Register” o di “Update”.

3.1.1.3 Bootstrap da Client

Questa modalità si ha quando il riferimento del Server LwM2M non è configurato nel Client

LwM2M oppure quando l’operazione di “Register” con il Server LwM2M è fallita. Quando ciò

accade, questa modalità fornisce un meccanismo per recuperare le informazioni di Bootstrap da un

Bootstrap-Server LwM2M.

Questa modalità Il Bootstrap iniziato dal Client richiede che il Client LwM2M abbia un Account

Bootstrap-Server sul Bootstrap-Server. Le informazioni minime che occorre siano precaricate sono

le credenziali per la sicurezza per una connessione sicura DTLS al Bootstrap-Server LwM2M.

Nella figura seguente è rappresentato il flusso dei dati per questa modalità:

23

Step 0 - Il client LwM2M invia un "Bootstrap-Request" al Bootstrap-Server LwM2M identificato

dal suo URI10

che è stato precaricato nel Client LwM2M. Il client LwM2M invia l’ “Endpoint

Client Name”, come parametro per consentire al Bootstrap-Server LwM2M di fornirgli le

informazioni di Bootstrap.

Step 1 - Il Bootstrap-Server LwM2M configura il Client LwM2M con le informazoni di Bootstrap

usando le operazioni di “Write” e/o “Delete”.

Step 2 – Quando il Bootstrap-Server LwM2M ha finito di inviare le informazioni di Bootstrap al

Client LwM2M invia un ‘Finish Bootstrap Indication’ al Client per chiudere correttamente questa

fase. Se il Client non riceve il ‘Finish Bootstrap Indication’ in un certo periodo deve considerare la

procedura di Bootstrap fallita.

Step 3 - Se il comando Bootstrap-Finish è stato ricevuto dal client LwM2M e la configurazione

caricata è considerata coerente dal Client LwM2M, viene eseguita un’operazione di pulizia.

3.1.1.4 Bootstrap da Server

In questa modalità, il Bootstrap-Server LwM2M configura le informazioni di Bootstrap nel Client

LwM2M, senza una richiesta di "Bootstrap-Request" al Bootstrap-Server LwM2M da parte del

Client LwM2M. Pertanto il Bootstrap-Server ha bisogno di sapere se il dispositivo LwM2M è

pronto per il Bootstrap. Il meccanismo col quale il Bootstrap-Server acquisisce questa

informazione è una implementazione specifica. Uno scenario comune è che gli elementi della rete

del provider informano il Bootstrap-Server LwM2M quando un dispositivo LwM2M si connette

alla rete del provider.

In questa modalità occorre che il Client LwM2M abbia un Account e le credenziali di sicurezza per

una connessione sicura DTLS al Bootstrao-Server LwM2M siano precaricate. Quando al

Bootstrap-Server è stato notificato che il dispositivo LwM2M è pronto per ricevere le informazioni

di Bootstrap,

vengono eseguiti gli step dal numero 1 al 3 del paragrafo precedente. Il flusso delle informazioni è

quindi il seguente:

10 L’URI (Uniform Resource Identifier) è una sequenza di caratteri che identifica univocamente una risorsa generica.

24

3.1.1.5 I comandi di Bootstrap Si elencano brevemente i comandi utilizzati sull’interfaccia Bootstrap; essi utilizzano il protocollo

CoAP11

.

BOOTSTRAP-REQUEST. Questo comando è utilizzato per iniziare una sequenza di Bootstrap

nella modalità ‘Bootstrap iniziato dal Client’.

BOOTSTRAP-FINISH. Questo comando è utilizzato unicamente per terminare una sequenza di

Bootstrap iniziata in modalità ‘Bootstrap iniziato dal Client’ oppure in modalità ‘Bootstrap iniziato

dal Server’. Con questo comando si informa il Client LwM2M che tutte le informazioni per il

Bootstrap sono state fornite.

BOOTSTRAP DISCOVER. Questo comando viene utilizzato per scoprire quali ‘LwM2M

Objects’ e quali ‘LwM2M Object Instances’ sono supportate da un determinato Client LwM2M.

Questo comando è utile per ripulire o aggiornare la configurazione del Client LwM2M.

BOOTSTRAP WRITE. Per effetto di questo comando il client LwM2M scrive il valore incluso

nel payload indipendentemente dall'esistenza della relativa ‘LwM2M Object Instance’ o ‘LwM2M

Resource. Questo comando può essere inviato più volte.

BOOTSTRAP DELETE. Con questo comando viene cancellata la ‘LwM2M Object Instance’

indicata.

3.1.2 L’interfaccia Client Registration

L'interfaccia ‘Client Registration’ viene utilizzata da un Client LwM2M per registrarsi con uno o

più Server LwM2M, mantenere aggiornata la registrazione e, alla fine, deregistrarsi da un server

LwM2M.

Quando viene inviato il messaggio “Register” il Client LwM2M fornisce al Server LwM2M le

informazioni necessarie per ricontattarlo (per es.: ‘End Point Name’) nonché le informazioni

aggiornate sugli ‘Object’ supportati e sulle ‘Object Instances’ esistenti sul Client LwM2M.

Il Client LwM2M esegue periodicamente un aggiornamento delle sue informazioni di registrazione

al o ai Server LwM2M con cui si è registrato tramite il messaggio “Update”. Se il lifetime della

registrazione scade senza che sia stato ricevuto un “Update” dal Client LwM2M, il Server LwM2M

rimuove la registrazione di questo Client LwM2M e questo deve ri-registrarsi per connettersi

nuovamente.

Infine, il Client LwM2M, quando determina che non è più richiesta la disponibilità del Server

LwM2M, ad esempio nel caso di un Factory Reset o di un suo uso discontinuo, invia il messaggio

“De-register”. Al ricevimento di questo messaggio il Server LwM2M elimina le informazioni di

registrazione.

11 CoAP è acronimo di Constrained Application Protocol

25

Riepilogando, il flusso dei messaggi relativi a questa interfaccia è il seguente:

3.1.3 L’interfaccia Device Management and Service Enablement

L’interfaccia ‘Device Management and Service Enablement’ viene usata dal Server LwM2M per

accedere alle ‘Object Instance’ ed alle Risorse disponibili di un Client LwM2M registrato 12.

L'interfaccia fornisce questo accesso tramite l'utilizzo dei comandi “Create”, “Read”, “Write”,

“Delete”, “Execute”, “Write-Attributes”, or “Discover”.

READ. Il comando “Read” viene usato per accedere al valore di una ‘Resource’, o ai valori di un

array delle ‘Resource Instances’, o ad una ‘Object Instance’ o a tutte le ‘Object Instances’ di un

‘Object’.

DISCOVER. Il comando “Discover” è usato per apprendere gli attributi di un ‘Object’, o delle

‘Object Instances’, o delle ‘Resources’.

WRITE. Questo comando viene usato per cambiare il valore di una ‘Resource’, o i valori di un

array delle ‘Resource Instances’, o i valori di più ‘Resources’. Il messaggio deve contenere il valore

da scrivere in uno dei formati supportati13

.

WRITE-ATTRIBUTES. Questo comando viene usato per cambiare gli Attributi14

. I valori degli

Attributi sono specifici di un dato Server LwM2M.

EXECUTE. Questo comando è utilizzato dal Server LwM2M per avviare un'azione e può essere

eseguita solo su Risorse individuali.

CREATE. Questo comando è usato dal Server LwM2M per creare una o più ‘Object Instance’

all’interno del Client LwM2M.

12 registrato secondo la procedura descritta al § 3.1.2. 13 V. § 3. 14 Gli attributi sono metadati che possono essere associati a un Object, ad una Object Instane o ad una Resource.

26

DELETE. Questo comando è usato per cancellare una ‘Object Instance’.

Di seguito si riporta il flusso dei messaggi di questa interfaccia relativi a due esempi.

3.1.4 L’interfaccia Information Reporting

L'interfaccia ‘Information Reporting’ viene utilizzata da un Server LwM2M per osservare eventuali

modifiche di una Risorsa su di un Client LwM2M registrato15

, ricevendo notifiche quando sono

disponibili nuovi valori. Questa relazione di osservazione viene avviata inviando il comando

15 registrato secondo la procedura descritta al § 3.1.2.

27

"Observe" al Client L2M2M per un ‘Object’, una ‘Object Instance’ o una ‘Resource’.

L'osservazione termina quando viene eseguito il comando "Cancel Observation".

Di seguito una breve descrizione dei comandi utilizzati su questa interfaccia.

OBSERVE. Con questo comando il Server LwM2M fa partire l’osservazione per eventuali

variazioni relative ad una Risorsa specifica o a Risorse di una ‘Object Instance’ o per tutte le

‘Object Instance’ di un ‘Object’ all’interno di un Client LwM2M.

Fino a quando il Client LwM2M non invia un nuovo messaggio “Register”, il server LwM2M

prevede che il Client LwM2M ricordi le richieste di osservazioni. Se un Client LwM2M dimentica

queste richieste, come avviene, ad esempio, in caso di un factory reset del dispositivo, esso deve

eseguire una nuova operazione “Register”.

NOTIFY. Questo comando viene inviato dal client LwM2M al server LwM2M durante un valido

periodo di osservazione su di una ‘Object Instance’ o su di una ‘Resource’. Nel messaggio è

contenuto il nuovo valore della ‘Object Instance’ o della ‘Resource’.

CANCEL OBSERVATION. Il comando “Cancel Observation” viene inviato dal Server LwM2M

al Client LwM2M per terminare le operazioni di osservazione.

Di seguito si riporta un esempio di flussi dei messaggi per questa interfaccia.

3.2 Modello delle risorse

Il protocollo LwM2M definisce un semplice modello delle risorse. Definiamo risorsa ogni tipo di

informazione utilizzabile dal LwM2M Client. Le risorse sono contenute negli oggetti ed ogni

risorsa ha un identificativo univoco all’interno dell’oggetto per permettere il suo riconoscimento.

28

Un client può avere un numero indeterminato di risorse ma ognuna di queste deve appartenere ad un

oggetto, anch’esso dotato di un identificativo univoco per essere riconosciuto.

Un oggetto specifica esclusivamente un raggruppamento di risorse pertanto va prima di tutto

istanziato dal client per poter usare le risorse collegate.

Una risorsa all'interno di un'istanza di oggetto può essere: un valore

un indirizzamento utilizzato dal server LwM2M per attivare un'azione nel client LwM2M.

La specifica dell’oggetto definisce le sue caratteristiche e quelle delle risorse ad esso correlate.

Le caratteristiche più importanti memorizzate all’interno della specifica sono: le operazioni (Read, Write, Execute) supportate individualmente dalle risorse appartenente a

tale oggetto.

la possibilità di dichiarare obbligatorie o facoltative determinate risorse. Una risorsa

specificata come obbligatoria all'interno di un oggetto deve essere istanziata in ogni istanza di tale

oggetto. Una risorsa specificata come opzionale all'interno di un oggetto può essere omessa da

alcune o anche tutte le istanze di tale oggetto.

La possibilità di avere più istanze di oggetti e risorse.

3.2.1 Creazione e istanziazione di un modello delle risorse

Nel descrivere descrivere al meglio questo tipo di operazioni è stato utilizzato il framework Leshan.

Al termine del capitolo verrà fatta una piccola descrizione su tale framework.

29

3.2.1.1 Creazione di un modello delle risorse

Gli oggetti, come visto in precedenza, sono una raccolta di risorse con un noto ObjectID che

rappresentano un particolare tipo di sensore fisico, attuatore, oggetto collegato o altra origine di

dati. Invece le risorse che costituiscono l'oggetto rappresentano le proprietà statiche e dinamiche

dell'oggetto fisico collegato e del software in esso installato.

La creazione di tale modello avviene attraverso l’utilizzo di un file XML.

Il documento XML che descrive il modello delle risorse deve seguire la seguente forma:

Linea 5 - Nome del device

Linea 6 - Descrizione del device

Linea 7 - ID dell’oggetto. Permette l’identificazione in modo univoco dell'oggetto nel client

LwM2M( un client non può avere due oggetti aventi lo stesso ID).

Linea 8 - Specifica della versione LWM2M da utilizzare per questo determinato oggetto (quando la

versione minima LwM2M che supporta l'oggetto è la versione iniziale del protocollo LwM2M (1.0)

queste informazioni possono essere omesse)

Linea 9 - Versione dell’oggetto (quando la versione Object è la versione iniziale di tale oggetto

(1.0), le informazioni sulla versione dell'oggetto possono essere omesse)

Linea 10 - URN dell’oggetto. L’URN (Uniform Resource Name) è un URI che identifica una

risorsa all'interno di un namespace, ma, a differenza del URL, non permette l'identificazione della

locazione della risorsa stessa. L’utilizzo del URN risulta essere necessario per facilitare le

modifiche sui modelli delle risorse. Infatti, in questi casi , l’objectID non viene modificato ma deve

essere utilizzato un nuovo URN . La costruzione del URN deve seguire le seguenti regole:

urn:oma:lwm2m:oma:44:2.4

30

urn:oma:lwm2m:oma - parte fissa

44 - Id dell’oggetto

2.4 - versione dell’oggetto

Linea 11 - Indica la presenza di istanze multiple ovvero se l’oggetto supporta più istanze di oggetto

o meno. Se questo campo è "Multiple", il numero di Instance Instance può variare da 0 a molti. Se

questo campo è "Single", il numero di Instance Instance può valere 0 o 1.

Linea 12 - Indica un possibile obbligo del client nei confronti dell’oggetto. Se questo campo è

"obbligatorio", allora il client LwM2M deve in ogni caso supportare questo oggetto. Se questo

campo è "Facoltativo", il client LwM2M potrebbe supportare tale oggetto.

Linea 13 - Inizio definizione delle risorse

Linea 14 - Specificazione dell’ID della risorsa. Il Resource ID identifica in modo univoco la risorsa

all'interno dell'oggetto. Tale ID risulta essere univoco per l’oggetto ma ovviamente può essere

riutilizzato da altri oggetti presenti nel Client.

Linea 15 - Nome della risorsa

Linea 16 - Indica quali operazioni dell’interfaccia "Device Management & Service Enablement"

sono supportate sulla risorsa. Questo campo può essere impostato su una combinazione di R (Read,

Observe, Discover, Write-Attributes) ed W (Write) oppure può essere impostato su E (Esegui). Può

anche avere un valore nullo, il che significa che su questa risorsa non è consentito accedere tramite

l'interfaccia di "Device Management & Service Enablement", ma è consentito l'accesso tramite

l'interfaccia di "Bootstrap".

Linea 17 - indica se questa risorsa supporta più istanze di risorse o meno. Analogamente alla linea

11, se il valore riportato è questo campo è "Multiple", il numero di istanze di risorse può variare da

0 a molti. Se il campo è "Single", possiamo avere solo 0 o 1 istanze di risorse

Linea 18 - se questo campo è "obbligatorio", allora il client LwM2M deve in ogni caso supportare

tale oggetto. Se questo campo è "Facoltativo", il client LwM2M dovrebbe supportare questo

oggetto.

Linea 19 - indica il tipo di valore della risorsa. Le risorse che supportano l'operazione "Esegui" non

deve avere alcun tipo di dato associato.

Linea 20 - questo campo limita il valore di Resource

Linea 21 - descrizione della risorsa

In seguito riportiamo due tabelle riassuntive che forniscono una visione generale su tutti i valori

inseribili sui campi presenti all’interno del modello delle risorse.

Definizione degli oggetti:

31

Definizione delle risorse

3.2.1.2 Istanziazione delle risorse Dopo aver definito il modello delle risorse il passo successivo ovviamente risulta essere

l’istanziazione dell’oggetto da parte dell’applicazione Client. Il programma di seguitoriportato è

stato effettuato attraverso l’utilizzo delle operazioni fornite dal framework Leshan. In tale

applicazione abbiamo deciso di voler stanziare cinque oggetti distinti: un sensore di potenza (ID 3312)

un sensore di controllo dell’illuminazione (ID 3311)

un sensore di controllo della temperatura(ID 3303)

un oggetto security (ID 0)

un oggetto server (ID 1)

Il codice necessario per eseguire tale operazione è il seguente.

COSTANTI

CODICE

La prima operazione da eseguire è il caricamento dei moduli XML che vanno a definire gli oggetti

che desideriamo controllare. Le funzioni che permettono tale tipo di operazioni sono le seguenti: public static List<ObjectModel> loadDefault()

public static List<ObjectModel> loadDdfResources(String[] paths)

public static List<ObjectModel> loadDdfResources(String path, String[] filenames)

32

La funzione loadDefault() effettua il caricamento dei modelli degli LwM2M Object già definiti dal

protocollo. Gli oggetti sono:

LwM2M Security (ID 0),

LwM2M Server (ID 1),

Access Control (ID 2),

Device (ID 3),

Connectivity Monitoring (ID 4),

Firmware (ID 5), Location (ID 6),

Connectivity Statistics (ID 7).

La funzione loadDdfResources(String path, String[] filenames) e loadDdfResources(String[]

paths)

permettono il caricamento dei modelli attraverso l’utilizzo di file XML presenti in un determinato

filepath (se espresso).I valori presenti presenti nel file XML, vengono memorizzati nella classe

ObjectModel.

La classe ObjectsInitializer si preoccupa dell’inizializzazione degli oggetti. I costruttori previsti da

tale modulo sono due: public ObjectsInitializer()

public ObjectsInitializer(LwM2mModel model)

Nel caso andassimo ad utilizzare il costruttore senza argomenti, come si può evincere dal codice,

viene invocato il costruttore successivo. Il costruttore ObjectsInitializer(LwM2mModel model) nel

caso in cui model sia null decide di caricare e utilizzare i modelli di default.

La classe LwM2mModel è una raccolta di definizioni di oggetti LWM2M e non contiene funzioni

membro di rilevante importanza per fini pratici.

Inizializzazione di un oggetto può avvenire utilizzando una classe oppure un'istanza di una classe.

Tali inizializzazioni vengono eseguite con le funzioni membro della classe ObjectInizializer: public void setClassForObject(int objectId, Class<? extends LwM2mInstanceEnabler>

clazz)

public void setInstancesForObject(int objectId, LwM2mInstanceEnabler... instances)

La prima istruzione permette l'istanziazione dell’oggetto attraverso l’utilizzo di una classe mentre la

seconda permette l’istanziazione dell’oggetto attraverso l’utilizzo di una istanza dell’oggetto. La

prima operazione permette l’istanziazione di un singolo oggetto a differenza della seconda che

permette l’istanziazione di più oggetti contemporaneamente, grazie all’utilizzo di un array.

33

Le istruzioni che sono state utilizzate per l'istanziazione degli oggetti sono presenti tra la linea 48 e

la linea 53 del codice.

L’istruzione initializer.setInstancesForObject(SECURITY, noSec(serverURI, 123));

viene utilizzata per istanziare l’oggetto di sicurezza,fondamentale poiché permette il collegamento

al server LwM2M. In tale codice è stato deciso di non utilizzare il bootstrap Server e il

PSK.L’istruzione public static Security noSec(String serverUri, int shortServerId), infatti,

restituisce una nuova istanza security (NoSec) per un server di device management.

L’istruzione presente nella linea 54

initializer.setInstancesForObject(SERVER, new Server(123, 30, BindingMode.U, false));

permette l'inizializzazione dell’oggetto Server. Tale oggetto ci va a definire le modalità di

collegamento con il server che verranno utilizzate dal Client. Il secondo parametro è il costruttore

della classe Server che il framework mette a disposizione:

public Server(int shortServerId, long lifetime, BindingMode binding, boolean notifyWhenDisable)

Di particolare interesse è il secondo parametro del costruttore. Il BindingMode ci permette di

decidere il protocollo a livello trasporto che il client ha intenzione di utilizzare per collegarsi con il

Server.

Le altre istruzioni permettono l’inizializzazione del device e degli altri oggetti. Dopo aver preparato

gli oggetti con tutte le informazioni necessarie con l’istruzione presente nelle linee 55-56 si può

passare alla creazione degli stessi. Tale istruzione richiede necessariamente tra i valori inseriti come

parametri di ingresso l’id 0. In caso di sua assenza il programma lancerà una eccezione runtime che

causerà l’arresto improvviso del programma.

3.2.2 Collegamento con il livello trasporto

In tale sezione andiamo ad analizzare come vengono implementati i protocolli descritti in

precedenza, sulle relative interfacce.

3.2.2.1 Bootstrap Interface

L'interfaccia bootstrap viene utilizzata per configurare un LwM2M client in modo tale che possa

registrarsi ad un determinato LwM2M server. L'operazione di bootstrap client viene eseguita

inviando una richiesta POST CoAP al server di bootstrap. Tale richiesta deve contenere l’Endpoint

Client Name come parametro della query.

Durante l’operazione di bootstrap, il Bootstrap-Server esegue una serie di operazioni di scrittura

(PUT), discovery (GET) e/o cancellazione (DELETE).

Il bootstrap server informa il client della terminazione di tale procedura con l’invio di un messaggio

bootstrap-finish (POST).

34

3.2.2.2 Registration Interface

L'interfaccia di registrazione viene utilizzata dal LwM2M client per registrarti ad un LwM2M

server, identificato da un URI. La registrazione viene eseguita inviando un messaggio CoAP

di POST all'URI del server con i parametri di registrazione passati come parametri della stringa

della query. Nel caso la registrazione venga eseguita con successo il server invia al client il

Location-Path. Il Location-Path indica il percorso da utilizzare per aggiornare o eliminare la

registrazione. L'aggiornamento della registrazione viene eseguito utilizzando un POST CoAP al Location-Path

restituito al client a seguito della registrazione. La disattivazione viene eseguita inviando un CoAP DELETE al Location-Path restituito al client a

seguito della registrazione.

35

Messaggio di richiesta registrazione

Messaggio di risposta

3.2.2.3 Device Management & Service Enablement Interface L'interfaccia di Device Management & Service viene utilizzata per accedere e gestire le risorse.

Un'istanza di oggetto viene identificata, come già visto in precedenza, dal percorso / {Oggetto ID} /

{OggettoID istanza}.

L'istanza o la risorsa di oggetto vengono letti inviando un GET CoAP al path corrispondente. La

risposta deve includere il valore richiesto nel formato corrispondente.

Un'istanza o una risorsa di oggetto viene scritta inviando un CoAP PUT o un CoAP POST al path

corrispondente. La richiesta comprende il valore da scrivere nel corrispondente formato.

Una Risorsa viene eseguita inviando un POST CoAP al path corrispondente. La richiesta può

includere un elenco di argomenti all’interno del payload, espressi in formato testo normale. Si

ricordi che iIl comportamento dell'operazione "Esegui" è specificato nella descrizione delle risorse

dell'oggetto.

36

Un'istanza di oggetto viene creata inviando un POST CoAP al path corrispondente. La richiesta

include il valore da scrivere nel corrispondente formato richiesto.

Un'istanza di oggetto viene eliminata inviando un CoAP DELETE al percorso corrispondente.

Messaggio di richiesta di lettura

37

3.2.2.4 Information Reporting Interface

L’interfaccia di Information Reporting Interface permette al client LwM2M di informare il server,

in maniera periodica e sistematica, di eventuali modifiche dei valori di una determinata risorsa.

L’implementazione di tale funzionalità avviene attraverso la CoAP Observation.

Questo semplice meccanismo viene attivato quando il server invia una richiesta GET con opzione

Observe pari a 0. Tale messaggio obbliga il client a informare il server di eventuali modifiche alla

risorsa che si desidera osservare.

Nei messaggi inviati dal client il token presente nell’header CoAP deve mantenere sempre il valore

indicato nel messaggio di Observation mandatoinviato dal server.

Il server LwM2M può annullare tale operazione inviando un messaggio RESET oppure con

messaggio GET con opzione Observe pari a 1.

Messaggio di richiesta di osservazione

38

Bibliografia

[1] OMA-TS-LightweightM2M-V1_0-20170208-A

[2] Ovidiu Vermensan, IoT-From Research and Innovation to Market Deploymentdel, River

Publishers, 2014

[3] Jan Holler,_Vlasios Tsiatsis, Catherine Mulligan, From Machine-to-Machine to the Internet

of Things Introduction to a New Age of Intelligence, Elsevier, 2014

[4] RFC 7252 CoAP

[5] RFC 7228 Terminology for Constrained-Node Networks