TinyOS Tutorial, Part I Phil Levis et al. MobiSys 2003
5/5/2003MobiSys Goals Deploy a (small) sensor network See, modify, and install some nesC code Write a simple application
5/5/2003MobiSys TinyOS Applications Application specific images Top-level configuration tinyos-1.x/apps/
5/5/2003MobiSys TinyDB Data collection and aggregation SQL-like queries Ad-hoc multi-hop routing
5/5/2003MobiSys Two Steps Prepare PC-side application Install TinyDB on two or more motes
5/5/2003MobiSys Building Java Tools cd tinyos-1.x/tools/java make
5/5/2003MobiSys TinyDB Java Application cd tinyos-1.x/tools/java cd net/tinyos/tinydb java –jar tinydb.jar After you run this, close it
5/5/2003MobiSys Installing TinyDB cd tinyos-1.x/apps/tinydb make mica –Make sure application builds properly Plug in programming board make mica install.1 –Installs application with mote ID 1
5/5/2003MobiSys Build a TinyDB Base Station Plug in a new mote cd apps/TinyDB make mica install.0 Make sure serial cable is connected
5/5/2003MobiSys Running the Application Plug in (and turn on) base station Turn on TinyDB mote Run TinyDB PC application
5/5/2003MobiSys A Simple Query Report light at one Hz Look at data output
5/5/2003MobiSys Multi-Mote Network Close TinyDB PC application Turn off motes Install TinyDB on more motes –make install.2 –make install.3 Run TinyDB PC application Send query again
5/5/2003MobiSys Applications TinyOS applications have a top-level configuration Wires application components to boot sequence, etc. Some applications have no app-specific modules
5/5/2003MobiSys Example Configuration
5/5/2003MobiSys A Simple App: CntToLeds CntToLeds Displays bottom 3 bits of a counter on LEDs apps/CntToLeds
5/5/2003MobiSys CntToLeds Configuration ( apps/CntToLeds/CntToLeds.nc ) configuration CntToLeds { } implementation { components Main, Counter, IntToLeds, TimerC; Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> Counter.StdControl; Main.StdControl -> TimerC.StdControl; Counter.Timer -> TimerC.Timer[unique("Timer")]; Counter.IntOutput -> IntToLeds.IntOutput; }
5/5/2003MobiSys Step By Step ( apps/CntToLeds/CntToLeds.nc ) This is a configuration (wiring) Named CntToLeds (CntToLeds.nc) configuration CntToLeds { }
5/5/2003MobiSys Step By Step ( apps/CntToLeds/CntToLeds.nc ) This is the implementation block – As this is a configuration, implementation is wiring This wiring uses these components –There can be more than one components statement –Component order unimportant implementation { components Main, Counter, IntToLeds, TimerC;
5/5/2003MobiSys Step By Step ( apps/CntToLeds/CntToLeds.nc ) Connect Mains StdControl (uses) to the StdControl interfaces (provides) of three components In the boot sequence, Main will call these components init() and start() Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> Counter.StdControl; Main.StdControl -> TimerC.StdControl;
5/5/2003MobiSys Step By Step ( apps/CntToLeds/CntToLeds.nc ) Wire counter to a unique TimerC timer Counter.Timer.startTimer() will call TimerC.Timer[x].startTimer TimerC.Timer[x].fired() will call Counter.Timer.fired() Counter.Timer -> TimerC.Timer[unique("Timer")];
5/5/2003MobiSys Finally…. ( apps/CntToLeds/CntToLeds.nc ) Wire the counter output to the LEDs Counter.IntOutput -> IntToLeds.IntOutput;
5/5/2003MobiSys CntToLeds, Revisited ( apps/CntToLeds/CntToLeds.nc ) configuration CntToLeds { } implementation { components Main, Counter, IntToLeds, TimerC; Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> Counter.StdControl; Main.StdControl -> TimerC.StdControl; Counter.Timer -> TimerC.Timer[unique("Timer")]; Counter.IntOutput -> IntToLeds.IntOutput; }
5/5/2003MobiSys How it Works On boot, Main initializes components When Counter starts, it starts its Timer When Timer fires, Counter increments is value, then calls IntToLeds IntToLeds displays bottom three bits
5/5/2003MobiSys Install CntToLeds cd apps/CntToLeds make mica install Watch the mote blink
5/5/2003MobiSys Simulation TinyOS has a simulator, TOSSIM Builds directly from TinyOS code –make pc –build/pc/main.exe –h Configurable output –export DBG=led Scalable to thousands of nodes
5/5/2003MobiSys Simulating CntToLeds Syntax: main.exe Sample command line options –-h: help –-x : Scale simulated time to real world time (2.0 = twice as fast) –-r : Radio models Running CntToLeds –build/pc/main.exe –x 1.0 1
5/5/2003MobiSys TinyViz GUI for visualization and actuation Connects directly to TOSSIM build/pc/main.exe –gui 4 cd tinyos-1.x/tools/java/ java net.tinyos.sim.TinyViz
5/5/2003MobiSys TinyViz Screenshot
5/5/2003MobiSys Adding Debugging Output tinyos-1.x/tos/lib/Counter.nc: export dbg=led,usr3 make pc build/pc/main.exe –x event result_t Timer.fired() { state++; dbg(DBG_USR3, Counter: %i.\n, state); return call IntOutput.output(state); }
5/5/2003MobiSys Simple Messaging Build a CntToRfm mote Build a RfmToLeds mote One mote displays the others counter
5/5/2003MobiSys CntToRfm ( apps/CntToRfm/CntToRfm.nc ) configuration CntToRfm { } implementation { components Main, Counter, IntToRfm, TimerC; Main.StdControl -> Counter.StdControl; Main.StdControl -> IntToRfm.StdControl; Counter.Timer -> TimerC.Timer[unique("Timer")]; Counter.IntOutput -> IntToRfm.IntOutput; }
5/5/2003MobiSys RfmToLeds ( apps/RfmToLeds/RfmToLeds.nc ) configuration RfmToLeds { } implementation { components Main, RfmToInt, IntToLeds; Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> RfmToInt.StdControl; RfmToInt.IntOutput -> IntToLeds.IntOutput; }
5/5/2003MobiSys Sensing Instead of a counter, display sensor reading on LEDs See what sensing code looks like Install SenseToRfm on CntToRfm node
5/5/2003MobiSys Sensing: SenseToRfm ( apps/SenseToRfm/SenseToRfm.nc ) configuration SenseToRfm { // this module does not provide any interface } implementation { components Main, SenseToInt, IntToRfm, ClockC, Photo; Main.StdControl -> SenseToInt; Main.StdControl -> IntToRfm; SenseToInt.Clock -> ClockC; SenseToInt.ADC -> Photo; SenseToInt.ADCControl -> Photo; SenseToInt.IntOutput -> IntToRfm; }
5/5/2003MobiSys Sensing, Continued Build a new application Goals –Have two motes sense –Each displays others reading on LEDs Starting blocks –SenseToRfm –RfmToLeds
5/5/2003MobiSys Making a New Application Create a new application directory Create the Makefile Write the code
5/5/2003MobiSys Directory mkdir tinyos-1.x/apps/SenseExchange cd tinyos-1.x/apps/SenseExchange
5/5/2003MobiSys Makefile Create and edit Makefile : COMPONENT=SenseExchange include../Makerules
5/5/2003MobiSys Application File What components do we need? –Main –Photo –SenseToInt –IntToRfm –RfmToInt –IntToLeds –ClockC
5/5/2003MobiSys Wiring It Up: The Components ( apps/SenseExchange/SenseExchange.nc ) configuration SenseExchange { // this module does not provide any interfaces } implementation { components Main; // The output part components SenseToInt, IntToRfm, ClockC, Photo; // The input part components RfmToInt, IntToLeds;
5/5/2003MobiSys Wiring It Up: Output Connections ( apps/SenseExchange/SenseExchange.nc ) Main.StdControl -> SenseToInt; Main.StdControl -> IntToRfm; SenseToInt.Clock -> ClockC; SenseToInt.ADC -> Photo; SenseToInt.ADCControl -> Photo; SenseToInt.IntOutput -> IntToRfm;
5/5/2003MobiSys Wiring It Up: Input Connections ( apps/SenseExchange/SenseExchange.nc ) Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> RfmToInt.StdControl; RfmToInt.IntOutput -> IntToLeds.IntOutput;
5/5/2003MobiSys Wiring It Up: Result ( apps/SenseExchange/SenseExchange.nc ) configuration SenseExchange { // this module does not provide any interfaces } implementation { components Main; components SenseToInt, IntToRfm, ClockC, Photo; components RfmToInt, IntToLeds; Main.StdControl -> SenseToInt; Main.StdControl -> IntToRfm; SenseToInt.Clock -> ClockC; SenseToInt.ADC -> Photo; SenseToInt.ADCControl -> Photo; SenseToInt.IntOutput -> IntToRfm; Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> RfmToInt.StdControl; RfmToInt.IntOutput -> IntToLeds.IntOutput; }
5/5/2003MobiSys Running SenseExchange Compile and run on two motes Cover one light sensor Cover the other
5/5/2003MobiSys Conclusion of Part I Deployed a small sensor network Installed simple applications Used TOSSIM Wrote SenseExchange Part II: Communication, actuation
5/5/2003MobiSys Questions
5/5/2003MobiSys SerialForwarder Sensor network proxy Connects to serial port Provides TCP socket interface java net.tinyos.sf.SerialForward &