Sensei Node Cookbook
This document includes a short description and instructions on how to install and run the SENSEI native-island node software on a sample WSN platform (telosb).
Table of Contents
Outline
SENSEI native nodes include a full IPv6-based protocol stack to demonstrate a sample of future Internet communication. Communication with the SENSEI native-island nodes is available also through standard HTTP/REST RAI calls using the SENSEI Native Gateway.
The implementation is based upon a modified version of a TinyOS 6LowPAN module named 6lowpan
.
SENSEI native node stack is composed by:
- Modified
6lowpan
component - CoAP component, implementing client/server capabilities
- RPI component
- RAI component
- libEXI library
- Sensor resources components: Light (Visible and IR), Temperature, Humidity, User button
- System parameter resource component: Battery
- Actuator resources components: various Leds (0,1,2)
- Subscription component: handling RAI resource subscription
CoAP - Module implements a CoAP server and client that are used to communicate with the rest of the network. Native node resources receive requests using REST methods ( GET, PUT, POST, DELETE ) and provide responses through the CoAP component/protocol.
RPI - Resource Publication Interface takes care of node publication on SENSEI upper layers.
RAI - Resource Access Interface is in charge of handling resource access request, route it to the requested resource component or to the subscription component when a Subscribe message is received. RAI component encodes content received by the resources using the appropriate XML schema in EXI format using thelibEXI
library.
Resources - Each resource offers specific functions based on the REST method involved, directly operate on the lower-level resource, handles the received content (if applicable) and initiate a response with the data involved in the exchange.
Subscription - Handles with a local soft state every subscribe request received by starting a local pooling thread on the subscribed resource. When notification conditions are met, the component will activate a CoAPClient session to push data to the subscriber.
Installation steps: Ubuntu 10.04
Setup TinyOS
To install the software on telosb motes need a tinyOS 2.1 working copy see: http://www.tinyos.net for informations on tinyOS installation.
Add the following line to /etc/apt/sources.list
deb http://tinyos.stanford.edu/tinyos/dists/ubuntu lucid main
sudo apt-get update sudo apt-get install tinyos-2.1.1 sudo apt-get install subversion
Set up your .bashrc variables to enable tinyos compilation toolchain:
# add the following lines at the end of the file source /opt/tinyos-2.1.1/tinyos.sh CLASSPATH=$TOSROOT/support/sdk/java/tinyos.jar:.
To use tinyOS's java utilities you need sun java6: enable PARTNER repository: menu->system->administration->Software sources
install java6
sudo apt-get install sun-java6-jdk # setting sun-java as default java provider sudo update-alternatives --set java /usr/lib/jvm/java-6-sun/jre/bin/java sudo update-alternatives --set javac /usr/lib/jvm/java-6-sun/bin/javac # sudo tos-install-jni
Install SENSEI software
To test the software you will need 3 things:
- one or many nodes equipped with node-tinyos software
- the SENSEI Native Gateway running on a local machine
- a bridge program that connects your sensei node with your local machine using another mote compiled with BaseStation? App
The TinyOS native-island package is available here.
Extract the sensei_tinyos.tar.gz package, containing gateway and node-tinyos folders:
$ tar xfz sensei_tinyos.tar.gz
Compile and install the bridge
# you have to be root to do this sudo -i # you need tinyos paths for a short while source /opt/tinyos-2.1.1/tinyos.sh apt-get install build-essential automake cd /opt/tinyos-2.1.1/support/sdk/c/sf/ ./bootstrap ./configure make cd /opt/tinyos-2.1.1/support/sdk/c/6lowpan/serial_tun/ make exit
now you should have a working copy of "serial_tun"
Compile SENSEI gateway
The steps to compile the gateway are quite straightforward
# move to gateway folder $ cd gateway/ sudo apt-get install g++ libssl-dev libxml2-dev # Install socket++ library gateway$ cd lib/Socket-2.3.7 gateway/lib/Sockets-2.3.7$ make clean gateway/lib/Sockets-2.3.7$ make gateway/lib/Sockets-2.3.7$ sudo make install # compile the gateway gateway/lib/Sockets-2.3.7$ cd ../../ gateway$ make
Usage:
Launch the bridge
To test the software you have to equip a node with BaseStation? App that can be found in:
$ cd node-tinyos/BaseStation node-tinyos/BaseStation$ make telosb install.0 bsl,/dev/ttyUSB0
Now you can create the Bridge
$ sudo /opt/tinyos-2.1.1/support/sdk/c/6lowpan/serial_tun/serial_tun /dev/ttyUSB0 telosb
Start the Gateway
To start the SENSEI gateway you have to:
$ cd gateway # start the gateway gateway$ ./bin/sensei-gateway
Compile SENSEI tinyOS-node
To compile and install the node App on as many nodes as you like:
$ cd node-tinyos/node node-tinyos/node$ make install.NODE_ADDRESS bsl,NODE_USB_DEVICE
Test It!
If nothing went wrong you can visit http://localhost:8000 to see the list of available nodes
GET request example
To get the temperature from a node just visit the corresponding url: http://localhost:8000/0000-0000-fffe-0005/s/temp
PUT request example
Using the PUT HTTP/CoAP method you can actuate on mote's leds.
If you send a PUT request to a node using for example http://localhost:8000/0000-0000-fffe-0005/a/led0
And using this XML in the request body
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:res="urn:sensei:rai"> <res:LED rdf:about="0" res:hasBooleanValue=1/> </rdf:RDF>
This will turn led0 On
POST request example
To test the Subscription Module you have to issue a post request to a resource url (i.e. http://localhost:8000/0000-0000-fffe-0005/s/temp ) with a body that similar to this one:
<?xml version="1.0" encoding="UTF-8"?> <sub:Subscription xmlns:sub="subscription"> <sub:URL>http://where_you_want_to_recieve_requests</sub:URL> <sub:ID>0</sub:ID> <sub:Period>time_in_milliseconds</sub:Period> <sub:OnlyOnChange>0</sub:OnlyOnChange> </sub:Subscription>
The node will recieve the request and answer with a 200 OK status code.
Exploiting IP loopback functionality, the node issues a local GET request to the subscribed resource and forwards the received content by POST'ing the content to the subscriber URL.
Content is encoded using the appropriate schema for the resource. Example:
<?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:res="urn:sensei:rai"> <res:Temperature rdf:about="0" res:hasDecimalValue="VALUE"/> </rdf:RDF>