|
|
|
= IoT Wireless !
|
|
|
|
Apostolos rootApostolos@swarmlab.io
|
|
|
|
// Metadata:
|
|
|
|
:description: IoT
|
|
|
|
:keywords: iot, swarm
|
|
|
|
:data-uri:
|
|
|
|
:toc: right
|
|
|
|
:toc-title: Πίνακας περιεχομένων
|
|
|
|
:toclevels: 4
|
|
|
|
:source-highlighter: highlight
|
|
|
|
:icons: font
|
|
|
|
:sectnums:
|
|
|
|
|
|
|
|
include::header.adoc[]
|
|
|
|
|
|
|
|
|
|
|
|
{empty} +
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Contiki
|
|
|
|
|
|
|
|
Contiki is a state-of-the-art, open
|
|
|
|
source operating system for sensor networks and other networked embedded
|
|
|
|
devices
|
|
|
|
|
|
|
|
|
|
|
|
More Info:
|
|
|
|
https://en.wikipedia.org/wiki/Contiki[^]
|
|
|
|
|
|
|
|
|
|
|
|
== Start Instant Contiki
|
|
|
|
|
|
|
|
|
|
|
|
.Start VMware and load Instant Contiki.
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
unzip InstantContiki2.7.zip
|
|
|
|
vmplayer
|
|
|
|
Start image
|
|
|
|
----
|
|
|
|
|
|
|
|
== Log In
|
|
|
|
When the login screen appears, log in to Instant Contiki:
|
|
|
|
|
|
|
|
.Log In usermode
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Username: user
|
|
|
|
Password: user
|
|
|
|
----
|
|
|
|
|
|
|
|
.Log In sudo
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
sudo apt update
|
|
|
|
Password: user
|
|
|
|
----
|
|
|
|
|
|
|
|
== Open a Terminal
|
|
|
|
|
|
|
|
After logging in, click on the terminal icon to start a terminal window.
|
|
|
|
|
|
|
|
== System test
|
|
|
|
|
|
|
|
|
|
|
|
.compile hello-world
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
cd contiki/examples/hello-world/
|
|
|
|
make TARGET=native
|
|
|
|
----
|
|
|
|
|
|
|
|
.Run the Hello World program in Contiki:
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
./hello-world.native
|
|
|
|
----
|
|
|
|
|
|
|
|
The program should print the words *“Hello, world”* on the screen and then appear to hang.
|
|
|
|
|
|
|
|
In reality, Contiki is still running correctly, but will not produce any output because the Hello World program has finished.
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Press Ctrl+C on the keyboard to quit.
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
== Simulating Contiki with COOJA
|
|
|
|
|
|
|
|
=== Start COOJA
|
|
|
|
|
|
|
|
.start
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
cd contiki/tools/cooja/
|
|
|
|
ant run
|
|
|
|
----
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
.INFO
|
|
|
|
====
|
|
|
|
COOJA compiles, and after a few seconds the simulator appears.
|
|
|
|
|
|
|
|
All COOJA simulations are controlled using plugins: small Java programs that interact with simulations and simulated nodes.
|
|
|
|
|
|
|
|
When COOJA is started, no simulation is loaded and no plugins are started.
|
|
|
|
====
|
|
|
|
|
|
|
|
=== Create a simulation
|
|
|
|
|
|
|
|
A new simulation is created via the menu.
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
File > New > Simulation
|
|
|
|
----
|
|
|
|
|
|
|
|
- Enter a Simulation title, and click Create.
|
|
|
|
|
|
|
|
We have now created our first simulation in COOJA. However, the simulation does not contain any nodes yet.
|
|
|
|
|
|
|
|
To add nodes we need to first create a node type, and then add nodes to the simulation.
|
|
|
|
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
====
|
|
|
|
- The *Network* window, at the top left of the screen, shows all the motes in the simulated network
|
|
|
|
- The *Timeline* window, at the bottom of the screen, shows all communication events in the simulation over time
|
|
|
|
- The *Mote* output window, on the right side of the screen, shows all serial port printouts from all the motes.
|
|
|
|
- The *Notes* window on the top right is where you can put notes for your simulation.
|
|
|
|
- And the *Simulation* control window is where you start, pause, and reload your simulation.
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=== Create a node type
|
|
|
|
|
|
|
|
Any simulated node in COOJA belongs to a node type.
|
|
|
|
|
|
|
|
The node type determines, among others, which Contiki applications to simulate.
|
|
|
|
|
|
|
|
|
|
|
|
Click menu item
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Motes > Add Motes > Create new mote type > Sky mote.
|
|
|
|
----
|
|
|
|
|
|
|
|
You have selected to emulate Tmote Sky nodes, and now need to select what Contiki program to simulate.
|
|
|
|
|
|
|
|
- Enter a Description.
|
|
|
|
- *Click Browse*, and navigate to *contiki/examples/hello-world/hello-world.c*
|
|
|
|
- *Click Compile* to start compiling the Contiki program
|
|
|
|
- *Click Create* when complication finishes.
|
|
|
|
|
|
|
|
You will be asked to enter the number of motes of your simulation.
|
|
|
|
|
|
|
|
Once you are done, click the Start button in the Simulation control window to start the simulation.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=== Save, Load and Reload in Cooja
|
|
|
|
|
|
|
|
Cooja allows for saving and loading simulation configurations.
|
|
|
|
When a simulation is saved, all active plugins are also stored with the configuration.
|
|
|
|
|
|
|
|
.save your current simulation
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
File > Save simulation
|
|
|
|
----
|
|
|
|
|
|
|
|
.Open simulation
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
File > Open simulation > Browse...
|
|
|
|
----
|
|
|
|
|
|
|
|
Select a simulation configuration.
|
|
|
|
|
|
|
|
When a simulation is loaded, all simulated Contiki applications are recompiled.
|
|
|
|
|
|
|
|
|
|
|
|
.reload your current simulation:
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
File > Reload simulation
|
|
|
|
or press
|
|
|
|
Ctrl+R
|
|
|
|
----
|
|
|
|
|
|
|
|
.Reminder
|
|
|
|
[NOTE]
|
|
|
|
====
|
|
|
|
Reloading can be used to reset the simulation – to restart all nodes.
|
|
|
|
|
|
|
|
More importantly, reloading a simulation will recompile all Contiki code, useful while developing Contiki programs.
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=== Add simulated nodes
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Motes > Add motes > [your type description]
|
|
|
|
----
|
|
|
|
|
|
|
|
Enter the number of nodes you want to simulate (e.g., 5), and press Add.
|
|
|
|
|
|
|
|
|
|
|
|
=== Show properties
|
|
|
|
|
|
|
|
Go to the *“Network”* window, click the *view* menu, and choose the properties you want to show for the nodes.
|
|
|
|
|
|
|
|
|
|
|
|
==== Radio model in Cooja
|
|
|
|
|
|
|
|
From the Network window, click on the
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
View > Radio Environment (UDGM)
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
If you now left-click on one of the nodes, you will see a green circle around the selected node.
|
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
====
|
|
|
|
The green circle presents the transmission range of the node, i.e. the selected node can communicate with all other nodes within that circle.
|
|
|
|
|
|
|
|
You may also see a grey circle around the green circle.
|
|
|
|
A node in the grey area cannot receive packets correctly
|
|
|
|
====
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
=== Extend the hello-world example
|
|
|
|
|
|
|
|
- Create a folder
|
|
|
|
- Copy+paste the *contiki/examples/hello-world* folder in your new folder.
|
|
|
|
|
|
|
|
==== Sensors, LEDs and Button
|
|
|
|
|
|
|
|
We will extend the Hello World program to let it print sensor data and toggle the leds when the button is pressed.
|
|
|
|
|
|
|
|
.ADD
|
|
|
|
----
|
|
|
|
#include "dev/button-sensor.h"
|
|
|
|
#include "dev/light-sensor.h"
|
|
|
|
#include "dev/leds.h"
|
|
|
|
#include <stdio.h> /* For printf() */
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sensors needs to be activated in the main process:
|
|
|
|
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
SENSORS_ACTIVATE(button_sensor);
|
|
|
|
SENSORS_ACTIVATE(light_sensor);
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
To print out the current light sensor value:
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
printf("Light: \%u\n", light_sensor.value(0));
|
|
|
|
----
|
|
|
|
|
|
|
|
To wait for an event and check if this event is a button press:
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
PROCESS_WAIT_EVENT_UNTIL(ev == sensors_even && data == &button_sensor);
|
|
|
|
----
|
|
|
|
|
|
|
|
To toggle LEDs:
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
leds_toggle(LEDS_AL
|
|
|
|
----
|
|
|
|
|
|
|
|
=== Create an IPv6 network
|
|
|
|
|
|
|
|
|
|
|
|
The border router will setup the IPv6 prefix of the network and will initiate the creation of the RPL routing tree.
|
|
|
|
|
|
|
|
The code of the border-router is in contiki/examples/ipv6/rpl-border-router/border-router.c+.
|
|
|
|
|
|
|
|
|
|
|
|
==== Copy and paste the folder in your project folder.
|
|
|
|
|
|
|
|
- Start Cooja and create a new simulation.
|
|
|
|
- Create a new mote type, browse to your project folder where the rpl-border-router is located and compile it.
|
|
|
|
- Once the border-router node has been added to the simulation, you then need to populate your network with more motes.
|
|
|
|
- For this, we use the code in ipv6/sky-websense/sky-websense.c
|
|
|
|
.
|
|
|
|
|
|
|
|
The sky-websense application generates sensing data and provides access to the latest data via built-in webserver.
|
|
|
|
|
|
|
|
|
|
|
|
From the Network window, right click on the border-router and select
|
|
|
|
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Mote tools for sky -> Serial socket (SERVER)
|
|
|
|
----
|
|
|
|
|
|
|
|
A new window should appear saying that the border-router node is listening on local port 60001.
|
|
|
|
|
|
|
|
At this point, your simulation is ready to start. *Click on the start button*
|
|
|
|
|
|
|
|
|
|
|
|
cd to your project folder where the rpl-border-router is located
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
make connect-router-Cooja TARGET=sky
|
|
|
|
----
|
|
|
|
|
|
|
|
You should see something like
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
ifconfig tun0 inet ‘hostname‘ up
|
|
|
|
ifconfig tun0 add aaaa::1/64
|
|
|
|
ifconfig tun0 add fe80::0:0:0:1/64
|
|
|
|
ifconfig tun0
|
|
|
|
tun0 Link encap:UNSPEC HWaddr 00-00-00
|
|
|
|
----
|
|
|
|
|
|
|
|
----
|
|
|
|
http://[‘‘webserver-ipv6-addr’’]
|
|
|
|
----
|
|
|
|
|
|
|
|
in your web browser to see the available readings.
|
|
|
|
|
|
|
|
----
|
|
|
|
e.g.
|
|
|
|
Current readings
|
|
|
|
Light: 65
|
|
|
|
Temperature: 24C
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
http://[aaaa::212:7401:1:101]/
|
|
|
|
----
|
|
|
|
|
|
|
|
And see the following:
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
Neighbors
|
|
|
|
fe80::c30c:0:0:9e
|
|
|
|
Routes
|
|
|
|
aaaa::c30c:0:0:9e/128 (via fe80::c30c:0:0:9e)
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
Now try to access the light service
|
|
|
|
|
|
|
|
- with l for ’light’
|
|
|
|
- with t for ’temperature’
|
|
|
|
|
|
|
|
[source,bash]
|
|
|
|
----
|
|
|
|
http://[aaaa::212:7403:3:303]/l
|
|
|
|
----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:hardbreaks:
|
|
|
|
|
|
|
|
{empty} +
|
|
|
|
{empty} +
|
|
|
|
{empty}
|
|
|
|
|
|
|
|
:!hardbreaks:
|
|
|
|
|
|
|
|
'''
|