Contiki: Open
Source OS for the
Internet of Things
Adapted by Hongwei Zhang from Materials Online
Why Choose Contiki is an open source operating system for the
Contiki? Internet of Things.
Contiki connects tiny low-cost, low-power
microcontrollers to the Internet
Contiki is an open source operating system that
runs on tiny low-power microcontrollers
makes it possible to develop applications that make
efficient use of the hardware while providing
standardized low-power wireless communication
for a range of hardware platforms
The Contiki
Operating Contiki is used in numerous commercial and non-
System commercial systems
city sound monitoring, street lights
networked electrical power meters, industrial
monitoring
radiation monitoring, construction site monitoring
alarm systems, remote house monitoring, etc
http://www.contiki-os.org/
Get Started with
Contiki
http://www.contiki-os.org/start.html
Download Instant Contiki
http://sourceforge.net/projects/contiki/files/Instant
%20Contiki/
Install VMWare Player
https://my.vmware.com/web/vmware/free#deskto
p_end_user_computing/vmware_player/6_0
Register and reboot
Firstly
Start Instant Contiki
Start Instant Contiki by running
InstantContiki2.6.vmx. Wait for the virtual Ubuntu
Linux boot up.
Log into Instant Contiki. The password is user.
Boot Ubuntu
Log in
Step 2: Start Cooja
Cooja is a highly useful tool for Contiki
development as it allows developers to test their
code and systems long before running it on the
target hardware.
Developers regularly set up new simulations both
to debug their software and to verify the behavior
of their systems.
We will now compile and start Cooja, the Contiki
network simulator.
Starting the terminal
Open a
terminal
window
Start Cooja by
In the terminal window, go to the Cooja directory:
Start Cooja
Start Cooja with the command:
Running
Cooja
Cooja UI
Step 3: Run Contiki
in simulation
Click the File menu and click New simulation
Creating
Simulation
Create New Simulation:
Network
window (motes)
Simulation
Window
Timeline
Window->all
communications
Network window -Top left
-shows all motes in the simulated
area
Timeline window - At the bottom of screen
- Shows all communication
events in the simulation over
time
Simulation - very handy for understanding
what goes on in the network
windows Notes window - On the top right is where we can
put notes for our simulation.
Mote output window - on the right side of the screen
- shows all serial port printouts
from all the motes.
Simulation control -window is where we start, pause,
and reload our simulation
Before we can simulate our network, we must add
one or more motes.
We do this via the Motes menu, where we click on
Add motes....
Since this is the first mote we add, we must first
create a mote type to add.
Click Create new mote type... and select one of
Add mote to the available mote types.
the interface For this example, we click Sky mote... to create an
emulated Tmote Sky mote type.
Choose the hardware then install the firmware with
any functionality that you desire
Add mote to
the interface
Simulation
window
-Code
-explanation
-Cooja runnin’
-video
Blink Application
example
-Code
Blink
example
code
Code explanation
Declare a process.
PROCESS(name, strname ) PROCESS(blink_process, "Blink");
AUTOSTART_PROCESSES(&blink_process); Starting a process automatically
&blink_process
PROCESS_THREAD(name, -Define the body of a process
ev,data ) -The process is called whenever an event
occurs in the system
Code detail -Start with the PROCESS_BEGIN() macro -
Ends with the PROCESS_END() macro.
PROCESS_EXITHANDLER(handler ) -Specify an action when a process exits.
-Comes before declaring PROCESS_BEGIN()
-specify the beginning and the End of a
PROCESS_BEGIN( ) ,PROCESS_END() process
Code explanation
etimer et; -This structure is used for declaring a timer.
The timer must be set with etimer_set()
before it can be used.
PROCESS_WAIT_EVENT_UNTIL(c) Wait for an event to be posted to the process,
with an extra condition.
-This macro is similar to
PROCESS_WAIT_EVENT()
Code detail in that it blocks the currently running process
until the process receives an event.
PROCESS_WAIT_EVENT_UNTIL(etimer_expir -Check if an event timer has expired.
ed(&et)); -Parameters:
et :a pointer to the event timer.
-return true if the time expires
leds_on(LEDS_ALL); On the LEDS
leds_off(LEDS_ALL); Off the LEDs
Simple and important to communicate with the
user
The platform startup code initializes the LEDs
library by calling leds_init() initializes the API
ledv: is LED vector platform independent
#define LEDS_GREEN 1
#define LEDS_YELLOW 2
#define LEDS_RED 4
LED API #define LEDS_ALL 7
leds_on() takes a LEDs vector argument, ledv,
and switches on the LEDs set in the vector.
Led_off() takes the LED in ledv and switch it off.
leds_invert() inverts the current status of the
LEDs set in the argument ledv.
Cooja capture
Youtube http://www.youtube.com/watch?v=9WohGp8udO
Demo Q
APIs
PROCESS_BEGIN() -Define the beginning of a process
PROCESS_END()
-Define the end of a process.
-Wait for an event to be posted to the
PROCESS_WAIT_EVENT() process.
-blocks the currently running process until
the process receives an event.
PROCESS_WAIT_EVENT_UNTIL(c) Wait for an event to be posted to the
process, with an extra condition.
process PROCESS_WAIT_UNTIL(c) Wait for a condition to occur.
PROCESS_EXIT() Exit the currently running process.
Basic LED functions
LED leds_on() - turn LEDs on
functions leds_off() - turn LEDs off
leds_invert() - invert LEDs
leds_blink() - blink all LEDs
The Contiki kernel does not provide support for timed
events. Rather, an application that wants to use timers
needs to explicitly use the timer library.
Event Timer Callback timer Simple timer
-generates an -call a function -have to be actively
Timer event when the when the timer queried to check
timer expires expires when they have
functions expired
•etimer_expired() •ctimer_expired( •timer_expired()
•etimer_reset ) •timer_reset
•etimer_set() •ctimer_reset •timer_set()
•etimer_restart()
•ctimer_set() •timer_restart()
•ctimer_restart(
)
Contiki home: http://www.contiki-os.org/
Gett started: http://www.contiki-os.org/start.html
Resources: http://www.contiki-os.org/support.html
“Hands on Contiki OS and Cooja Simulator: Exercises (Part II)”: https://george.autonomic-
networks.ele.tue.nl/files/exercise_partII.pdf
Article: Adam Dunkels et al., “An adaptive communication architecture for wireless sensor
networks”, ACM SenSys’07 (http://dl.acm.org/citation.cfm?id=1322295)
Directory “examples\rime”: example-abc.c, example-unicast.c, example-runicast.c etc
Directory “core\net\rime”
Single-hop: abc.h/abc.c (anonymous broadcast), unicast.h/unicast.c (unicast),
References
runicast.h/runicast.c (reliable unicast), stunicast.h/stunicast.c
Multi-hop: multihop.c, rmh.c, collect.c, mesh.c, netflood.c etc
IETF standards-conforming implementation
core\net\mac\tsch, core\net\rpl, core\net\ipv6
Doxgen documentation: http://contiki.sourceforge.net/docs/2.6/
Rime communication stack: http://contiki.sourceforge.net/docs/2.6/a01798.html
uIP TCP/IP stack: http://contiki.sourceforge.net/docs/2.6/a01793.html
Contiki Tutorials: http://anrg.usc.edu/contiki/index.php/Contiki_tutorials
Troubleshooting: http://anrg.usc.edu/contiki/index.php/Troubleshooting
Community: http://www.contiki-os.org/community.html
Download and install Contiki
Gett started: http://www.contiki-os.org/start.html
Read the following and execute relevant simulation
experiments
“Hands on Contiki OS and Cooja Simulator: Exercises (Part II)”:
https://george.autonomic-networks.ele.tue.nl/files/exercise_partII.pdf
Article: Adam Dunkels et al., “An adaptive communication architecture for
wireless sensor networks”, ACM SenSys’07
Exercise (http://dl.acm.org/citation.cfm?id=1322295)
Directory “examples\rime”: example-abc.c, example-unicast.c, example-
runicast.c etc
Directory “core\net\rime”
Single-hop: abc.h/abc.c (anonymous broadcast), unicast.h/unicast.c (unicast),
runicast.h/runicast.c (reliable unicast), stunicast.h/stunicast.c
Multi-hop: multihop.c, rmh.c, collect.c, mesh.c, netflood.c etc
IETF standards-conforming implementation
core\net\mac\tsch, core\net\rpl, core\net\ipv6