Manage all the things,
small and big,
with open source
LwM2M implementations
Benjamin Cabé* – Eclipse Foundation
* many thanks to Julien Vermillard for most of the slides!
Device Management
● Configure the device
○ Reboot
○ Update APN, current date/time, …
● Update the software (and firmware)
● Manage the software
○ Change settings
○ Access logs
● Monitor and gather connectivity statistics
○ Amount of sent/received data
○ Number of SMS received/sent
2
Device Management
3
Device Management server
(not necessarily the server used for
IoT application data)
● Has security credentials for
devices on the field (X.509
certificate, public key, …)
● Provides high-level API for
batch updates
● May integrate with IT backendIoT Device
● Runs a device management
agent, usually in the firmware
● Embeds a private/public key
pair to cipher communication
● Has DM server’s public key to
authenticate it is talking to
intended server
D.M. standards protocols
● Usual suspects:
○ TR-069
○ OMA-DM
○ Lightweight M2M
● Goals: provide a way to manage fleets of
devices that is application-agnostic
4
Lightweight M2M
● A new Open Mobile Alliance standard
● An OMA-DM successor for M2M targets
● Built on top of CoAP
○ much lighter than OMA-DM or TRS-069
○ enables the use of SMS for wakeup (or any REST
interaction really!)
5
Lightweight M2M (LwM2M)
● An Open Mobile Alliance standard
● A « reboot » of OMA-DM for M2M
● Built on top of CoAP
○ much lighter than OMA-DM or TRS-069
○ enables the use of SMS for wakeup (or any
REST interaction really!)
● REST API for Device Management
● Standard objects for Security, Location,
Firmware, …
○ and also: IPSO Smart Objects, 3rd
party, …
LWM2M features
● Firmware upgrade (in band or over HTTP)
● Device monitoring and configuration
● Server provisioning (bootstraping)
7
LWM2M: standard objects
● Device
● Server
● Connectivity monitoring
● Connectivity statistics
● Location
● Firmware
LwM2M objects have a numerical identifier
(Device = 3, Location = 6, …)
8
LWM2M URIs
URLs:
/{object}/{instance}/{resource}
Example:
/6/0 = whole position object (binary TLV)
/6/0/2 = only the altitude value
9
Leshan
Open-source Lightweight M2M for Java
Leshan
A Java library for implementing LwM2M servers
(and clients)
Friendly for any Java developer (no framework,
few dependencies)
But also a Web UI for discovering and testing the
protocol
Features
Client initiated bootstrap
Registration/Deregistration
Read, Write, Create objects
TLV encoding/decoding
OSGi-friendly
Features (cont’d)
DTLS Pre shared key
DTLS Raw public key
Standalone web-UI for testing
Server
Simple Java library
Build using “mvn install”
Based on Californium and Scandium
Under refactoring for accepting other CoAP lib
Server API example
public void start() {
// Build LWM2M server
LeshanServerBuilder builder = new LeshanServerBuilder();
lwServer = builder.build();
lwServer.getClientRegistry().addListener(new ClientRegistryListener() {
@Override
public void registered(Client client) {
System.out.println("New registered client with endpoint: " +
client.getEndpoint());
}
@Override
public void updated(Client clientUpdated) {
System.out.println("Registration updated");
}
@Override
public void unregistered(Client client) {
System.out.println("Registration deleted");
}
});
// start
lwServer.start();
System.out.println("Demo server started");
}
Server API example
// prepare the new value
LwM2mResource currentTimeResource = new LwM2mResource(13,
Value.newDateValue(new Date()));
// send a write request to a client
WriteRequest writeCurrentTime = new WriteRequest(client, 3, 0, 13,
currentTimeResource, ContentFormat.TEXT, true);
ClientResponse response = lwServer.send(writeCurrentTime);
System.out.println("Response to write request from client " +
client.getEndpoint() + ": " + response.getCode());
Client
Under construction! API will probably change
Create objects, answer to server requests
DTLS supported in master
Check out: leshan-client-example
Next steps
Eclipse.org migration
X.509 DTLS
CoAP shim, CoAP TCP
Stable API for June (inc. client polishing)
And also:
JSON content-type
SMS
Server initiated bootstrap
Eclipse Wakaama
Lightweight M2M implementation in C
Photo credits: https://www.flickr.com/photos/30126248@N00/2890986348
Wakaama
A C client and server implementation of LwM2M
Not a shared library (.so/.dll)
POSIX compliant and embedded friendly
Plug your own IP stack and DTLS implementation
Features
Register, registration update, deregister
Read, write resources
Read, write, create, delete object instances
TLV or plain text
Observe
lwm2m_object_t * get_object_device()
{
lwm2m_object_t * deviceObj;
deviceObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
if (NULL != deviceObj)
{
memset(deviceObj, 0, sizeof(lwm2m_object_t));
deviceObj->objID = 3;
deviceObj->readFunc = prv_device_read;
deviceObj->writeFunc = prv_device_write;
deviceObj->executeFunc = prv_device_execute;
deviceObj->userData = lwm2m_malloc(sizeof(device_data_t));
if (NULL != deviceObj->userData)
{
((device_data_t*)deviceObj->userData)->time = 1367491215;
strcpy(((device_data_t*)deviceObj->userData)->time_offset, "+01:00");
}
else
{
lwm2m_free(deviceObj);
deviceObj = NULL;
}
}
return deviceObj;
}
Create obje
objArray[0] = get_object_device();
if (NULL == objArray[0])
{
fprintf(stderr, "Failed to create Device objectrn");
return -1;
}
objArray[1] = get_object_firmware();
if (NULL == objArray[1])
{
fprintf(stderr, "Failed to create Firmware objectrn");
return -1;
}
objArray[2] = get_test_object();
if (NULL == objArray[2])
{
fprintf(stderr, "Failed to create test objectrn");
return -1;
}
lwm2mH = lwm2m_init(prv_connect_server, prv_buffer_send, &data);
if (NULL == lwm2mH)
{
fprintf(stderr, "lwm2m_init() failedrn");
return -1;
}
result = lwm2m_configure(lwm2mH, "testlwm2mclient", BINDING_U, NULL,
OBJ_COUNT, objArray);
...
result = lwm2m_start(lwm2mH);
Configure
Wakaama
while (0 == g_quit)
{
struct timeval tv;
tv.tv_sec = 60;
tv.tv_usec = 0;
/*
* This function does two things:
* - first it does the work needed by liblwm2m (eg. (re)sending some packets).
* - Secondly it adjust the timeout value (default 60s) depending on the
* state of the transaction (eg. retransmission) and the
* time between the next operation
*/
result = lwm2m_step(lwm2mH, &tv);
if (result != 0)
{
fprintf(stderr, "lwm2m_step() failed: 0x%Xrn", result);
return -1;
}
}
Active loop
Next?
Device initiated bootstrap
More examples:
https://github.com/kartben/Wakaama-mbed
Server?
Block transfer?
Hack it into real devices!
… DEMO TIME!
Spark Core
● Cortex-M3 STM32,
● RAM/ROM 20/128k, 72MHz
● WiFi
Wakaama + TinydTLS-0.5
Functions: dTLS (PSK)
LwM2M Objects: device
Footprint:
“empty”-App: 75.6 KB Flash / 13.1 KB RAM
simple-lwm2m: 107 KB Flash / 15.2 KB RAM (overhead = 32KB / 3.1kB!)
U-blox MBed.org
● Cortex-M3 (NXP LPC1768),
● RAM/ROM 20/128k, 96MHz
● GPRS
Functions: observe, attribute:
Objects: server, security, device, conn_m, firmware, location
Footprint (RTOS + commandline + lwm2m stack): 84 KB Flash / 22 KB RAM
Arduino Mega
● ATmega2560
● RAM/ROM 8/256k, 16MHz
● Ethernet
Functions: observe, attribute
Objects: server, security, device, conn_m, firmware, location
Footprint (C++ wrapper + simulator + lwm2m stack): 67 KB Flash / 5 KB RAM
Lua binding
https://github.com/sbernard31/lualwm2m
With DTLS support using:
https://github.com/sbernard31/luadtls
binding on top of TinyDTLS (http://tinydtls.sf.net)
How to help?
Use it! Report bugs, issue, missing features
Write documentation
Talk about Wakaama and Leshan, they are cool!
Contribute code
Questions?
https://dev.eclipse.org/mailman/listinfo/leshan-dev
https://dev.eclipse.org/mailman/listinfo/wakaama-dev
Thanks!
benjamin@eclipse.org
@kartben
http://iot.eclipse.org

Manage all the things, small and big, with open source LwM2M implementations - FOSDEM 2015

  • 1.
    Manage all thethings, small and big, with open source LwM2M implementations Benjamin Cabé* – Eclipse Foundation * many thanks to Julien Vermillard for most of the slides!
  • 2.
    Device Management ● Configurethe device ○ Reboot ○ Update APN, current date/time, … ● Update the software (and firmware) ● Manage the software ○ Change settings ○ Access logs ● Monitor and gather connectivity statistics ○ Amount of sent/received data ○ Number of SMS received/sent 2
  • 3.
    Device Management 3 Device Managementserver (not necessarily the server used for IoT application data) ● Has security credentials for devices on the field (X.509 certificate, public key, …) ● Provides high-level API for batch updates ● May integrate with IT backendIoT Device ● Runs a device management agent, usually in the firmware ● Embeds a private/public key pair to cipher communication ● Has DM server’s public key to authenticate it is talking to intended server
  • 4.
    D.M. standards protocols ●Usual suspects: ○ TR-069 ○ OMA-DM ○ Lightweight M2M ● Goals: provide a way to manage fleets of devices that is application-agnostic 4
  • 5.
    Lightweight M2M ● Anew Open Mobile Alliance standard ● An OMA-DM successor for M2M targets ● Built on top of CoAP ○ much lighter than OMA-DM or TRS-069 ○ enables the use of SMS for wakeup (or any REST interaction really!) 5
  • 6.
    Lightweight M2M (LwM2M) ●An Open Mobile Alliance standard ● A « reboot » of OMA-DM for M2M ● Built on top of CoAP ○ much lighter than OMA-DM or TRS-069 ○ enables the use of SMS for wakeup (or any REST interaction really!) ● REST API for Device Management ● Standard objects for Security, Location, Firmware, … ○ and also: IPSO Smart Objects, 3rd party, …
  • 7.
    LWM2M features ● Firmwareupgrade (in band or over HTTP) ● Device monitoring and configuration ● Server provisioning (bootstraping) 7
  • 8.
    LWM2M: standard objects ●Device ● Server ● Connectivity monitoring ● Connectivity statistics ● Location ● Firmware LwM2M objects have a numerical identifier (Device = 3, Location = 6, …) 8
  • 9.
    LWM2M URIs URLs: /{object}/{instance}/{resource} Example: /6/0 =whole position object (binary TLV) /6/0/2 = only the altitude value 9
  • 10.
  • 11.
    Leshan A Java libraryfor implementing LwM2M servers (and clients) Friendly for any Java developer (no framework, few dependencies) But also a Web UI for discovering and testing the protocol
  • 12.
    Features Client initiated bootstrap Registration/Deregistration Read,Write, Create objects TLV encoding/decoding OSGi-friendly
  • 13.
    Features (cont’d) DTLS Preshared key DTLS Raw public key Standalone web-UI for testing
  • 14.
    Server Simple Java library Buildusing “mvn install” Based on Californium and Scandium Under refactoring for accepting other CoAP lib
  • 15.
    Server API example publicvoid start() { // Build LWM2M server LeshanServerBuilder builder = new LeshanServerBuilder(); lwServer = builder.build(); lwServer.getClientRegistry().addListener(new ClientRegistryListener() { @Override public void registered(Client client) { System.out.println("New registered client with endpoint: " + client.getEndpoint()); } @Override public void updated(Client clientUpdated) { System.out.println("Registration updated"); } @Override public void unregistered(Client client) { System.out.println("Registration deleted"); } }); // start lwServer.start(); System.out.println("Demo server started"); }
  • 16.
    Server API example //prepare the new value LwM2mResource currentTimeResource = new LwM2mResource(13, Value.newDateValue(new Date())); // send a write request to a client WriteRequest writeCurrentTime = new WriteRequest(client, 3, 0, 13, currentTimeResource, ContentFormat.TEXT, true); ClientResponse response = lwServer.send(writeCurrentTime); System.out.println("Response to write request from client " + client.getEndpoint() + ": " + response.getCode());
  • 17.
    Client Under construction! APIwill probably change Create objects, answer to server requests DTLS supported in master Check out: leshan-client-example
  • 18.
    Next steps Eclipse.org migration X.509DTLS CoAP shim, CoAP TCP Stable API for June (inc. client polishing) And also: JSON content-type SMS Server initiated bootstrap
  • 19.
    Eclipse Wakaama Lightweight M2Mimplementation in C Photo credits: https://www.flickr.com/photos/30126248@N00/2890986348
  • 20.
    Wakaama A C clientand server implementation of LwM2M Not a shared library (.so/.dll) POSIX compliant and embedded friendly Plug your own IP stack and DTLS implementation
  • 21.
    Features Register, registration update,deregister Read, write resources Read, write, create, delete object instances TLV or plain text Observe
  • 22.
    lwm2m_object_t * get_object_device() { lwm2m_object_t* deviceObj; deviceObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t)); if (NULL != deviceObj) { memset(deviceObj, 0, sizeof(lwm2m_object_t)); deviceObj->objID = 3; deviceObj->readFunc = prv_device_read; deviceObj->writeFunc = prv_device_write; deviceObj->executeFunc = prv_device_execute; deviceObj->userData = lwm2m_malloc(sizeof(device_data_t)); if (NULL != deviceObj->userData) { ((device_data_t*)deviceObj->userData)->time = 1367491215; strcpy(((device_data_t*)deviceObj->userData)->time_offset, "+01:00"); } else { lwm2m_free(deviceObj); deviceObj = NULL; } } return deviceObj; } Create obje
  • 23.
    objArray[0] = get_object_device(); if(NULL == objArray[0]) { fprintf(stderr, "Failed to create Device objectrn"); return -1; } objArray[1] = get_object_firmware(); if (NULL == objArray[1]) { fprintf(stderr, "Failed to create Firmware objectrn"); return -1; } objArray[2] = get_test_object(); if (NULL == objArray[2]) { fprintf(stderr, "Failed to create test objectrn"); return -1; } lwm2mH = lwm2m_init(prv_connect_server, prv_buffer_send, &data); if (NULL == lwm2mH) { fprintf(stderr, "lwm2m_init() failedrn"); return -1; } result = lwm2m_configure(lwm2mH, "testlwm2mclient", BINDING_U, NULL, OBJ_COUNT, objArray); ... result = lwm2m_start(lwm2mH); Configure Wakaama
  • 24.
    while (0 ==g_quit) { struct timeval tv; tv.tv_sec = 60; tv.tv_usec = 0; /* * This function does two things: * - first it does the work needed by liblwm2m (eg. (re)sending some packets). * - Secondly it adjust the timeout value (default 60s) depending on the * state of the transaction (eg. retransmission) and the * time between the next operation */ result = lwm2m_step(lwm2mH, &tv); if (result != 0) { fprintf(stderr, "lwm2m_step() failed: 0x%Xrn", result); return -1; } } Active loop
  • 25.
    Next? Device initiated bootstrap Moreexamples: https://github.com/kartben/Wakaama-mbed Server? Block transfer?
  • 26.
    Hack it intoreal devices! … DEMO TIME!
  • 27.
    Spark Core ● Cortex-M3STM32, ● RAM/ROM 20/128k, 72MHz ● WiFi Wakaama + TinydTLS-0.5 Functions: dTLS (PSK) LwM2M Objects: device Footprint: “empty”-App: 75.6 KB Flash / 13.1 KB RAM simple-lwm2m: 107 KB Flash / 15.2 KB RAM (overhead = 32KB / 3.1kB!)
  • 28.
    U-blox MBed.org ● Cortex-M3(NXP LPC1768), ● RAM/ROM 20/128k, 96MHz ● GPRS Functions: observe, attribute: Objects: server, security, device, conn_m, firmware, location Footprint (RTOS + commandline + lwm2m stack): 84 KB Flash / 22 KB RAM
  • 29.
    Arduino Mega ● ATmega2560 ●RAM/ROM 8/256k, 16MHz ● Ethernet Functions: observe, attribute Objects: server, security, device, conn_m, firmware, location Footprint (C++ wrapper + simulator + lwm2m stack): 67 KB Flash / 5 KB RAM
  • 30.
    Lua binding https://github.com/sbernard31/lualwm2m With DTLSsupport using: https://github.com/sbernard31/luadtls binding on top of TinyDTLS (http://tinydtls.sf.net)
  • 31.
    How to help? Useit! Report bugs, issue, missing features Write documentation Talk about Wakaama and Leshan, they are cool! Contribute code Questions? https://dev.eclipse.org/mailman/listinfo/leshan-dev https://dev.eclipse.org/mailman/listinfo/wakaama-dev
  • 32.