CoAP for Contiki OS over Sparrow


The goal of this project is to create a flexible platform for developing Wireless Sensor Networks applications using the Sparrow sensor nodes. The key objectives of this project include porting the open-source operating system, Contiki, to Sparrow sensor nodes and porting CoAP network protocol to Contiki-running Sparrow nodes.

Network Topology

The system consists of 2 interconnected networks: the first network, formed by the Sparrow nodes, is connected to an external network through a border router. Once data reaches the external network, it can be stored in a database and/or sent to user devices.

 Network Topology

One of the Sparrow nodes is chosen to be the border router that communicates with a host using a tool called tunslip6. Tunslip6 creates a virtual network interface(tun0) and uses SLIP (Serial Line Internet Protocol) to encapsulate the traffic on the serial line. The border router will receive the address aaaa::1 and it will form a network with the other Sparrow nodes, by passing the prefix received from the host to all nodes. The other Sparrow nodes will run Contiki with a CoAP server as the main application. Those nodes will acquire data using different sensors and will pass the data to the CoAP client in the external network.



Contiki is an operating system for memory constrained systems, optimized for low-power microcontrollers. A list of available hardware platforms on which Contiki has been ported can be found at Contiki's kernel is event-driven, but a library can be optionally linked to provide multi-threading capabilities.


Sensor nodes are devices capable of acquiring information from the environment using different types of sensors attached to them. Those sensors perform measurements and return information such as the value of the temperature, the quality of air, the value of the humidity in the air, etc. The microcontroller communicates with the sensors and retrieves the data gathered by them to process/analyze/send it further. The transmission of the data from the sensors to the microcontroller is done using a common language (communication protocol) that enforces a set of communication rules to allow the exchange of information. Similarly, to transmit the data from the sensor node to a different device (a laptop, a phone, a different node, etc.) a protocol must be established between the entities that wish to communicate. Actually, multiple protocols are usually used to allow communication between devices, each one of them governing a different communication level/layer. The scheme of protocols for sensor nodes communication used in this project is depicted in the following diagram.

 Communication Protocols

CoAP is an application layer protocol used for message transfer on devices with very strict memory constraints. Since CoAP is based on the REST model, obtaining data from the nodes using CoAP is similar to performing HTTP requests. For each sensor attached to the Sparrow nodes a resource object can be created, to store information about the data provided by the sensor and to associate a handler for each request that can be made on that sensor. For example, if a GET operation is possible for a sensor, a “get” handler will be linked to the resource. The CoAP client will perform a GET operation on the path at which the resource is found. The CoAP server is responsible for associating a path with the object that represents that resource.

coapclient -o REQUEST -p PATH

where “REQUEST” can be one of the following: GET|PUT|POST|DELETE|DISCOVER|OBSERVE and PATH is the path where the resource is found on the server. For example, here is a command that requests the temperature value from the server:

coapclient -o GET -p coap://[aaaa::11:22:33:44]:5683/sensors/temperature

In the above command, aaaa::11:22:33:44 is the ip address of the CoAP server running on the Sparrow node and 5683 is the port. ”/sensors/temperature” is the path at which the resource can be found.


The components needed to setup the system are:

  1. One Sparrow node that will play the role of the border router.
  2. One or more Sparrow nodes that will run CoAP servers and will gather data.
  3. A device(e.g. laptop) that will run a CoAP client that will make requests to the CoAP server. Optionally, this device can also send the data received form the CoAP server in cloud.

The following steps need to be followed to setup the system:

git clone
git checkout sparrow

Then follow the instructions from to finish configuration and install missing tools needed for Contiki.

Border Router

To make and upload the border-router application to the Sparrow node

cd examples/ipv6/rpl-border-router
make TARGET=sparrow savetarget

WITH_SLIP=1 enables SLIP communication between the Sparrow node and the host that will run the CoAP client(the laptop). The border-router can optionally host a mini webserver which can be disabled using WITH_WEBSERVER=0 option. /dev/ttyUSB0 should be replaced with the corresponding path on which the Sparrow node is connected.

To bridge the Sparrow nodes network and the host's networt, the tunslip6 tool is used.

cd tools
make tunslip6
cd examples/ipv6/rpl-border-router
sudo ../../../tools/tunslip6 aaaa::1/64 -s /dev/ttyUSB0 -B 38400 -v6

You should see something similar to the following output:

ifconfig tun0 inet `hostname` up 
ifconfig tun0 add aaaa::1/64 
ifconfig tun0 
tun0 Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00             
     inet addr:  P-t-P:  Mask:           
     inet6 addr: aaaa::1/64 Scope:Global           
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0           
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0           
     collisions:0 txqueuelen:500    RX bytes:0 (0.0 B)     TX bytes:0 (0.0 B) 
tun0 Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00             
     inet addr:  P-t-P:  Mask:           
     inet6 addr: aaaa::1/64 Scope:Global           
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0           
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0           
     collisions:0 txqueuelen:500            
     RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B) 

Autostart other processes
RPL-Border router started 
*** Address:aaaa::1 => aaaa:0000:0000:0000

SIN: 10
Got configuration message of type P 
Setting prefix aaaa:: created a new RPL dag
Server IPv6 addresses:

CoAP Server

To make and upload the CoAP server on a different Sparrow node:

cd examples/er-rest-example
make upload WITH_COAP=1 AVRDUDE_PORT=/dev/ttyUSB1
make login AVRDUDE_PORT=/dev/ttyUSB1

The ip address of the CoAP server should be printed in the console.

CoAP Client

From Github, clone the open source CoAP client (implemented in Python). Example of running the client:

python -o GET -p coap://[aaaa::11:22ff:fe33:4403]:5683/sensors/temperature


Firebase is an application development platform that offers services such as realtime database, cloud messaging, analytics, etc. It can be used to store the data gathered by the Sparrow nodes and it's easy to integrate it with mobile application, so that users can receive notifications about data evolution directly ontheir phones.

I order to setup Firebase, firstly, go to Firebase console and create a new project. Then, install Node.js and from the terminal, run the following commands:

npm install -g firebase-tools
firebase login

Login with your google account and initialize Firebase:

firebase init

If you want to link Firebase with a mobile phone application, you should also initialize the cloud functions:

firebase init functions

A file named “database.rules.json” should be created. Edit this file to change the permissions for your database. For example, the following code allows only authenticated users to read and write from/to the database:

"rules": {
   ".read": "auth != null",
   ".write": "auth != null"

To store the information gathered from the sensors in the database, follow these steps:

  1. From Firebase console Project settings → Service accounts → Generate new provate key. Download the file generated locally - this will be used to allow access to firebase from your laptop.
  2. Go to Firebase console, copy the url of your project. It should be something similar to '', where projectID can be found in Project settings → Your project.
  3. Send the information received by the CoAP client running on the laptop to Firebase. Below, is an example of a python code that sends the value of the temperature in cloud:
import firebase_admin                                                                                                                       
from firebase_admin import credentials
from firebase_admin import db

firebase_url = ''
cred = credentials.Certificate("./PrivateKeyGeneratedInTheFirstStep.json")
firebase_admin.initialize_app(cred, {
         'databaseURL': firebase_url

ref = db.reference('sensors')
data_ref = ref.child('Temperature/')
    'title' : 'Temperature',
    'body' : TemperatureValue,
iothings/proiecte/2018/temp.txt · Last modified: 2021/12/06 18:05 by dan.tudose
CC Attribution-Share Alike 3.0 Unported Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0