Hands-on with CoAP
Embrace the Internet of Things!
Matthias Kovatsch
Julien Vermillard
Follow the slides
http://goo.gl/LLQ03w
Your devoted presenters :-)
Julien Vermillard / @vrmvrm
Software Engineer at Sierra Wireless
http://airvantage.net M2M Clo...
Your devoted presenters :-)
Matthias Kovatsch
Researcher at ETH Zurich, Switzerland
Focus on Web technology for the IoT
IE...
Agenda
Internet of things 101
What protocols should I use?
CoAP
What is CoAP?
CoAP live!
Californium
HANDS-ON!
More CoAP g...
What you will need
Eclipse IDE
Basic Java knowledge
Californium JARs
Firefox + Copper
Your brainzzz
Content of the USB stick
● Eclipse IDE for Windows, Linux and Mac
● Firefox and Copper .xpi
● Sample projects to be import...
Machine to machine?
Machine to machine?
Internet of things?
Technology that
supports
wired or wireless
communication
between devices
❝
Different needs, different protocols
Device Management
Radio statististics, device configuration, …
OMA-DM, TR-069, LWM2M…...
The Web of Things
Application layer interoperability
and usability for the IoT
Tiny resource-constrained devices
Class 1 devices
~100KiB Flash
~10KiB RAM
Target of less than 1$
Tiny resource-constrained devices
TCP and HTTP
are not a good fit
Low-power networks
Constrained Application Protocol
RESTful protocol designed from scratch
Transparent mapping to HTTP
Additional features of...
Constrained Application Protocol
Binary protocol
● Low parsing complexity
● Small message size
Options
● Numbers with IANA...
Observing resources
Observing resources - CON mode
RESTful Group Communication
GET /status/power
PUT /control/color
#00FF00
Resource discovery
Based on Web Linking (RFC5988)
Extended to Core Link Format (RFC6690)
Multicast Discovery
Resource Dire...
Alternative transports
Short Message Service (SMS)
Unstructured Supplementary
Service Data (USSD)
*101#
Addressable throug...
Security
Based on DTLS (TLS/SSL for Datagrams)
Focus on Elliptic Curve Cryptography (ECC)
Hardware acceleration for IoT de...
Status of CoAP
Proposed Standard since 15 Jul 2013
RFC 7252
Next working group documents in the queue
● Observing Resource...
Status of CoAP
In use by
● OMA Lightweight M2M
● IPSO Alliance
● ETSI M2M
● Device management for network operators
● Ligh...
CoAP live with Copper!
Browsing and bookmarking
of CoAP URIs
Interaction with resource like
RESTClient or Poster
Treat tin...
Copper (Cu) CoAP user-agent
CoAP live with Copper!
Dual color LED strip with microcoap
Connect on the “coap” wifi network
Password: “coapcoap”
coap://...
Californium (Cf) CoAP framework
Unconstrained CoAP implementation
● written in Java
● focus on scalability and usability
F...
Stages
● Decoupled with
message queues
● independent
concurrency models
● Adjusted statically for
platform/application
● S...
Web resources
● Optional thread pool
for each Web resource
● Inherited by parent
or transitive ancestor
● Protocol threads...
Clients with
response handlers
● Object API called from
main or user thread
● Synchronous:
Protocol threads
unblock API ca...
Encapsulate stages 1+2
Enable
● multiple channels
● stack variations for
different transports
Individual concurrency
model...
Implemented in
CoapEndpoint
Separation of
bookkeeping
and processing
Exchanges
carry state
Endpoints
CoapEndpoint
MessageI...
Paper on evaluation
at IoT 2014
Matthias Kovatsch,
Martin Lanter, and
Zach Shelby.
Scalable Cloud Services
for the Interne...
Let’s get concrete!
Project structure
Five repositories on GitHub
● https://github.com/eclipse/californium
Core library and example projects
●...
Maven
Maven artifacts will be available at
https://repo.eclipse.org/content/repositories/californium-snapshots/
https://re...
Code structure
https://github.com/eclipse/californium
● Libraries (“californium-” prefix)
○ californium-core CoAP, client,...
Code structure
https://github.com/eclipse/californium
● Libraries
● Example code
○ cf-api-demo API call snippets
● Example...
Code structure
https://github.com/eclipse/californium
● Libraries
● Example code
● Example projects
○ cf-helloworld-client...
Server API
Important classes (see org.eclipse.californium.core)
● CoapServer
● CoapResource
● CoapExchange
● Implement cus...
Server API - resources
import static org.eclipse.californium.core.coap.CoAP.ResponseCode.*; // shortcuts
public class MyRe...
Server API - creation
public static void main(String[] args) {
CoapServer server = new CoapServer ();
server.add(new MyRes...
Client API
Important classes
● CoapClient
● CoapHandler
● CoapResponse
● CoapObserveRelation
● Instantiate CoapClient with...
Client API - synchronous
public static void main(String[] args) {
CoapClient client1 = new CoapClient("coap://iot.eclipse....
Client API - asynchronous
public static void main(String[] args) {
CoapClient client = new CoapClient("coap://iot.eclipse....
Client API - observe
public static void main(String[] args) {
CoapClient client = new CoapClient("coap://iot.eclipse.org:5...
Advanced API
Get access to internal objects with
advanced() on
CoapClient, CoapResponse, CoapExchange
Use clients in resou...
HANDS-ON!
Getting started
● Launch Eclipse
● Import projects contained on the USB
stick
○ File > Import… > Existing projects into
wo...
Step 1
The mandatory Hello world CoAP server!
1. Complete the code:
Add “hello” resource with a custom message
Run the CoA...
Step 2
Improve the server by adding:
1. A “subpath/another” hello world
2. Current time in milliseconds
3. A writable reso...
Step 3
Hello world CoAP client
1. Complete the code for reading the
previous “helloworld” values
2. Connect your client wi...
More fun
Connect with the LED strip
Read the sensors
Change the color
Have fun!
Where is the code?
Tutorial steps
https://github.com/jvermillard/hands-on-coap
Californium
https://github.com/eclipse?quer...
Hands-off
Questions?
Photo Credit:oskay
Going further with CoAP
Going further with CoAP
Scandium (Sc)
DTLS (TLS/SSL for UDP) for adding
security
Californium (Cf) Proxy
HTTP/CoAP proxy
Ca...
Going further
Contiki OS
Connects tiny, low-power MCU to the
Internet
http://contiki-os.org
Microcoap
CoAP for arduino
htt...
OMA Lightweight M2M
An device management protocol
Created by the Open Mobile Alliance
Configure, monitor, upgrade your dev...
OMA Lightweight M2M
The specification
http://technical.openmobilealliance.org
C client library (future eclipse wakaama)
ht...
Thanks!
More questions? Feel free to contact us!
Matthias Kovatsch
kovatsch@inf.ethz.ch
Julien Vermillard
@vrmvrm
jvermill...
Hands on with CoAP and Californium
Upcoming SlideShare
Loading in...5
×

Hands on with CoAP and Californium

4,411

Published on

The Internet of Things if growing, but how can you build your own connected objects?
Together with MQTT, CoAP is one of the popular IoT protocols. It provides answers to the typical IoT constraints: it is bandwidth efficient and fits in constrained embedded environment while providing friendly and discoverable RESTful API.

This tutorial aims at giving you a hands-on experience with CoAP by showing you the power and simplicity of the Eclipse Californium library for developing real world IoT application.

Agenda:
- Introduction to CoAP
- Live discovery of connected CoAP objects using the Copper plugin for Firefox
- Presentation of more advanced CoAP topics (proxy, resource directory, device management with LWM2M)
- Presentation of Eclipse Californium, a CoAP library for Java
- Exercise: complete the provided Java code to create your own Internet of Things... thing!

Published in: Technology

Hands on with CoAP and Californium

  1. 1. Hands-on with CoAP Embrace the Internet of Things! Matthias Kovatsch Julien Vermillard
  2. 2. Follow the slides http://goo.gl/LLQ03w
  3. 3. Your devoted presenters :-) Julien Vermillard / @vrmvrm Software Engineer at Sierra Wireless http://airvantage.net M2M Cloud Apache member, Eclipse committer on Californium and Wakaama More IoT stuff: https://github.com/jvermillard
  4. 4. Your devoted presenters :-) Matthias Kovatsch Researcher at ETH Zurich, Switzerland Focus on Web technology for the IoT IETF contributor in CoRE and LWIG Author of Californium (Cf), Erbium (Er), and Copper (Cu) http://people.inf.ethz.ch/mkovatsc
  5. 5. Agenda Internet of things 101 What protocols should I use? CoAP What is CoAP? CoAP live! Californium HANDS-ON! More CoAP goodies
  6. 6. What you will need Eclipse IDE Basic Java knowledge Californium JARs Firefox + Copper Your brainzzz
  7. 7. Content of the USB stick ● Eclipse IDE for Windows, Linux and Mac ● Firefox and Copper .xpi ● Sample projects to be imported in your workspace + Californium JAR file ● Completed projects
  8. 8. Machine to machine?
  9. 9. Machine to machine? Internet of things?
  10. 10. Technology that supports wired or wireless communication between devices ❝
  11. 11. Different needs, different protocols Device Management Radio statististics, device configuration, … OMA-DM, TR-069, LWM2M… Local sensor networks Transmit sensor data, usually over RF or PLC Zigbee, X10, Bluetooth Smart, … End-user applications Display sensor data on mobile app, dashboards, HTTP, Websockets, ...
  12. 12. The Web of Things
  13. 13. Application layer interoperability and usability for the IoT
  14. 14. Tiny resource-constrained devices Class 1 devices ~100KiB Flash ~10KiB RAM Target of less than 1$
  15. 15. Tiny resource-constrained devices TCP and HTTP are not a good fit Low-power networks
  16. 16. Constrained Application Protocol RESTful protocol designed from scratch Transparent mapping to HTTP Additional features of M2M scenarios GET, POST, PUT, DELETE URIs and media types Deduplication Optional retransmissions
  17. 17. Constrained Application Protocol Binary protocol ● Low parsing complexity ● Small message size Options ● Numbers with IANA registry ● Type-Length-Value ● Special option header marks payload if present
  18. 18. Observing resources
  19. 19. Observing resources - CON mode
  20. 20. RESTful Group Communication GET /status/power PUT /control/color #00FF00
  21. 21. Resource discovery Based on Web Linking (RFC5988) Extended to Core Link Format (RFC6690) Multicast Discovery Resource Directories </config/groups>;rt="core.gp";ct=39, </sensors/temp>;rt="ucum.Cel";ct="0 50";obs, </large>;rt="block";sz=1280 ;title="Large resource" GET /.well-known/core
  22. 22. Alternative transports Short Message Service (SMS) Unstructured Supplementary Service Data (USSD) *101# Addressable through URIs coap+sms://+12345/bananas/temp* Could power up subsystems for IP connectivity after SMS signal * illustration only, +12345 unfortunately not allowed by URI RFC
  23. 23. Security Based on DTLS (TLS/SSL for Datagrams) Focus on Elliptic Curve Cryptography (ECC) Hardware acceleration for IoT devices
  24. 24. Status of CoAP Proposed Standard since 15 Jul 2013 RFC 7252 Next working group documents in the queue ● Observing Resources ● Group Communication ● Blockwise Transfers ● Resource Directory ● HTTP Mapping Guidelines
  25. 25. Status of CoAP In use by ● OMA Lightweight M2M ● IPSO Alliance ● ETSI M2M ● Device management for network operators ● Lighting systems for smart cities
  26. 26. CoAP live with Copper! Browsing and bookmarking of CoAP URIs Interaction with resource like RESTClient or Poster Treat tiny devices like normal RESTful Web services CoAP protocol handler for Mozilla Firefox
  27. 27. Copper (Cu) CoAP user-agent
  28. 28. CoAP live with Copper! Dual color LED strip with microcoap Connect on the “coap” wifi network Password: “coapcoap” coap://192.168.1.252:5683/ A more complex sandbox coap://192.168.1.100:5683/ or with Internet coap://vs0.inf.ethz.ch:5683/ coap://coap.me:5683/
  29. 29. Californium (Cf) CoAP framework Unconstrained CoAP implementation ● written in Java ● focus on scalability and usability For ● IoT cloud services ● Stronger IoT devices (Java SE Embedded or special JVMs)
  30. 30. Stages ● Decoupled with message queues ● independent concurrency models ● Adjusted statically for platform/application ● Stage 1 depends on OS and transport ● Stage 2 usually one thread per core 3-stage architecture Exchange Store Blockwise Layer Observe Layer Token Layer Reliability Layer Matching & Deduplication Message Serialization Transport (socket I/O) Stage1Stage2:Protocol(CoAP)Stage3:Logic Network A1 A2 B2 B1 A B Root
  31. 31. Web resources ● Optional thread pool for each Web resource ● Inherited by parent or transitive ancestor ● Protocol threads used if none defined Stage 3: server role Exchange Store Blockwise Layer Observe Layer Token Layer Reliability Layer Matching & Deduplication Message Serialization Transport (socket I/O) Stage1Stage2:Protocol(CoAP)Stage3:Logic Network A1 A2 B2 B1 A B Root
  32. 32. Clients with response handlers ● Object API called from main or user thread ● Synchronous: Protocol threads unblock API calls ● Asynchronous: Optional thread pools for response handling (e.g., when observing) Stage 3: client role Exchange Store Blockwise Layer Observe Layer Token Layer Reliability Layer Matching & Deduplication Message Serialization Transport (socket I/O) Stage1Stage2:Protocol(CoAP)Stage3:Logic Network Client for B Client for A Async. Client main
  33. 33. Encapsulate stages 1+2 Enable ● multiple channels ● stack variations for different transports Individual concurrency models, e.g., for DTLS Endpoints Stack UDP Stage1Stage2:Protocol(CoAP)Stage3:Logic A1 A2 B2 B1 A B Root Stack DTLS Stack ...
  34. 34. Implemented in CoapEndpoint Separation of bookkeeping and processing Exchanges carry state Endpoints CoapEndpoint MessageInterceptorMessageInterceptor Matcher MessageInterceptor Deduplicator Message Exchange Message Message Message Message Message Exchange Message Exchange Message Exchange Message Exchange CoapStack Blockwise Layer Observe Layer Token Layer Reliability Layer Connector Exchange Forwarder (Impl) Data Serializer RawData Channel (Impl) Data Parser MessageDelivererStackTopAdapter DataData
  35. 35. Paper on evaluation at IoT 2014 Matthias Kovatsch, Martin Lanter, and Zach Shelby. Scalable Cloud Services for the Internet of Things. In Proc. IoT, Cambridge, MA, USA, 2014. http://www.iot-conference.org/iot2014/ Requestspersecond Without Keep-Alive
  36. 36. Let’s get concrete!
  37. 37. Project structure Five repositories on GitHub ● https://github.com/eclipse/californium Core library and example projects ● https://github.com/eclipse/californium.element-connector Abstraction for modular network stage (Connectors) ● https://github.com/eclipse/californium.scandium DTLS 1.2 implementation for network stage (DtlsConnector) ● https://github.com/eclipse/californium.tools Stand-alone CoAP tools such as console client or RD ● https://github.com/eclipse/californium.actinium App server for server-side JavaScript* *not yet ported to new implementation and using deprecated CoAP draft version
  38. 38. Maven Maven artifacts will be available at https://repo.eclipse.org/content/repositories/californium-snapshots/ https://repo.eclipse.org/content/repositories/californium-releases/ once migration to Eclipse is complete If release version is required use old ch.ethz.inf.vs artifacts from https://github.com/mkovatsc/maven
  39. 39. Code structure https://github.com/eclipse/californium ● Libraries (“californium-” prefix) ○ californium-core CoAP, client, server ○ californium-osgi OSGi wrapper ○ californium-proxy HTTP cross-proxy ● Example code ● Example projects (“cf-” prefix)
  40. 40. Code structure https://github.com/eclipse/californium ● Libraries ● Example code ○ cf-api-demo API call snippets ● Example projects
  41. 41. Code structure https://github.com/eclipse/californium ● Libraries ● Example code ● Example projects ○ cf-helloworld-client basic GET client ○ cf-helloworld-server basic server ○ cf-plugtest-checker tests Plugtest servers ○ cf-plugtest-client tests client functionality ○ cf-plugtest-server tests server functionality ○ cf-benchmark performance tests ○ cf-secure imports Scandium (DTLS) ○ cf-proxy imports californium-proxy
  42. 42. Server API Important classes (see org.eclipse.californium.core) ● CoapServer ● CoapResource ● CoapExchange ● Implement custom resources by extending CoapResource ● Add resources to server ● Start server
  43. 43. Server API - resources import static org.eclipse.californium.core.coap.CoAP.ResponseCode.*; // shortcuts public class MyResource extends CoapResource { @Override public void handleGET(CoapExchange exchange) { exchange.respond("hello world"); // reply with 2.05 payload (text/plain) } @Override public void handlePOST(CoapExchange exchange) { exchange.accept(); // make it a separate response if (exchange.getRequestOptions()....) { // do something specific to the request options } exchange.respond(CREATED); // reply with response code only (shortcut) } }
  44. 44. Server API - creation public static void main(String[] args) { CoapServer server = new CoapServer (); server.add(new MyResource("hello")); server.start(); // does all the magic }
  45. 45. Client API Important classes ● CoapClient ● CoapHandler ● CoapResponse ● CoapObserveRelation ● Instantiate CoapClient with target URI ● Use offered methods get(), put(), post(), delete(), observe(), validate(), discover(), or ping() ● Optionally define CoapHandler for asynchronous requests and observe
  46. 46. Client API - synchronous public static void main(String[] args) { CoapClient client1 = new CoapClient("coap://iot.eclipse.org:5683/multi-format"); String text = client1.get().getResponseText(); // blocking call String xml = client1.get(APPLICATION_XML).getResponseText(); CoapClient client2 = new CoapClient("coap://iot.eclipse.org:5683/test"); CoapResponse resp = client2.put("payload", TEXT_PLAIN); // for response details System.out.println( resp.isSuccess() ); System.out.println( resp.getOptions() ); client2.useNONs(); // use autocomplete to see more methods client2.delete(); client2.useCONs().useEarlyNegotiation(32).get(); // it is a fluent API }
  47. 47. Client API - asynchronous public static void main(String[] args) { CoapClient client = new CoapClient("coap://iot.eclipse.org:5683/separate"); client.get(new CoapHandler() { // e.g., anonymous inner class @Override public void onLoad(CoapResponse response) { // also error resp. System.out.println( response.getResponseText() ); } @Override public void onError() { // I/O errors and timeouts System.err.println("Failed"); } }); }
  48. 48. Client API - observe public static void main(String[] args) { CoapClient client = new CoapClient("coap://iot.eclipse.org:5683/obs"); CoapObserveRelation relation = client.observe(new CoapHandler() { @Override public void onLoad(CoapResponse response) { System.out.println( response.getResponseText() ); } @Override public void onError() { System.err.println("Failed"); } }); relation.proactiveCancel(); }
  49. 49. Advanced API Get access to internal objects with advanced() on CoapClient, CoapResponse, CoapExchange Use clients in resource handlers with createClient(uri); Define your own concurrency models with ConcurrentCoapResource and CoapClient.useExecutor() / setExecutor(exe)
  50. 50. HANDS-ON!
  51. 51. Getting started ● Launch Eclipse ● Import projects contained on the USB stick ○ File > Import… > Existing projects into workspace
  52. 52. Step 1 The mandatory Hello world CoAP server! 1. Complete the code: Add “hello” resource with a custom message Run the CoAP server 2. Test with Copper
  53. 53. Step 2 Improve the server by adding: 1. A “subpath/another” hello world 2. Current time in milliseconds 3. A writable resource 4. A removable resource
  54. 54. Step 3 Hello world CoAP client 1. Complete the code for reading the previous “helloworld” values 2. Connect your client with your server
  55. 55. More fun Connect with the LED strip Read the sensors Change the color Have fun!
  56. 56. Where is the code? Tutorial steps https://github.com/jvermillard/hands-on-coap Californium https://github.com/eclipse?query=californium
  57. 57. Hands-off Questions?
  58. 58. Photo Credit:oskay Going further with CoAP
  59. 59. Going further with CoAP Scandium (Sc) DTLS (TLS/SSL for UDP) for adding security Californium (Cf) Proxy HTTP/CoAP proxy Californium (Cf) RD CoAP resource directory
  60. 60. Going further Contiki OS Connects tiny, low-power MCU to the Internet http://contiki-os.org Microcoap CoAP for arduino https://github.com/1248/microcoap
  61. 61. OMA Lightweight M2M An device management protocol Created by the Open Mobile Alliance Configure, monitor, upgrade your device using CoAP over UDP and SMS In a RESTful way!
  62. 62. OMA Lightweight M2M The specification http://technical.openmobilealliance.org C client library (future eclipse wakaama) http://github.com/01org/liblwm2m Java server implementation http://github.com/jvermillard/leshan/
  63. 63. Thanks! More questions? Feel free to contact us! Matthias Kovatsch kovatsch@inf.ethz.ch Julien Vermillard @vrmvrm jvermillard@sierrawireless.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×