= 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). [[PageOutline(2-3,Table of Contents,inline)]] == 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 [wiki:NativeGateway 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 the`libEXI`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:. }}} {{{ #!comment In this example tos is installed in $HOME/tos export TOSROOT=$HOME/tos export TOSDIR=$TOSROOT/tos export CLASSPATH=$TOSROOT/support/sdk/java/tinyos.jar:$TOSROOT/support/sdk/java/ export MAKERULES=$TOSROOT/support/make/Makerules export PATH=$PATH:/opt/msp430/bin }}} 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 [wiki:NativeGateway 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 [wiki:NodeTinyOS-dwl 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 }}} 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 http://where_you_want_to_recieve_requests 0 time_in_milliseconds 0 }}} 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 }}}