490 likes | 684 Views
TinyOS Tutorial, Part I. Phil Levis et al. MobiSys 2003. Goals. Deploy a (small) sensor network See, modify, and install some nesC code Write a simple application. TinyOS Applications. Application specific images Top-level configuration tinyos-1.x/apps/. TinyDB.
E N D
TinyOS Tutorial, Part I Phil Levis et al. MobiSys 2003
Goals • Deploy a (small) sensor network • See, modify, and install some nesC code • Write a simple application MobiSys 2003
TinyOS Applications • Application specific images • Top-level configuration • tinyos-1.x/apps/ MobiSys 2003
TinyDB • Data collection and aggregation • SQL-like queries • Ad-hoc multi-hop routing MobiSys 2003
Two Steps • Prepare PC-side application • Install TinyDB on two or more motes MobiSys 2003
Building Java Tools • cd tinyos-1.x/tools/java • make MobiSys 2003
TinyDB Java Application • cd tinyos-1.x/tools/java • cd net/tinyos/tinydb • java –jar tinydb.jar • After you run this, close it MobiSys 2003
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 MobiSys 2003
Build a TinyDB Base Station • Plug in a new mote • cd apps/TinyDB • make mica install.0 • Make sure serial cable is connected MobiSys 2003
Running the Application • Plug in (and turn on) base station • Turn on TinyDB mote • Run TinyDB PC application MobiSys 2003
A Simple Query • Report light at one Hz • Look at data output MobiSys 2003
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 MobiSys 2003
Applications • TinyOS applications have a top-level configuration • Wires application components to boot sequence, etc. • Some applications have no app-specific modules MobiSys 2003
Example Configuration MobiSys 2003
A Simple App: CntToLeds • CntToLeds • Displays bottom 3 bits of a counter on LEDs • apps/CntToLeds MobiSys 2003
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;} MobiSys 2003
Step By Step(apps/CntToLeds/CntToLeds.nc) • This is a configuration (wiring) • Named CntToLeds (CntToLeds.nc) configuration CntToLeds {} MobiSys 2003
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; MobiSys 2003
Step By Step(apps/CntToLeds/CntToLeds.nc) • Connect Main’s 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; MobiSys 2003
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")]; MobiSys 2003
Finally….(apps/CntToLeds/CntToLeds.nc) • Wire the counter output to the LEDs Counter.IntOutput -> IntToLeds.IntOutput; MobiSys 2003
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;} MobiSys 2003
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 MobiSys 2003
Install CntToLeds • cd apps/CntToLeds • make mica install • Watch the mote blink MobiSys 2003
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 MobiSys 2003
Simulating CntToLeds • Syntax: main.exe <number of nodes> • Sample command line options • -h: help • -x <floating point>: Scale simulated time to real world time (2.0 = twice as fast) • -r <simple|static|lossy>: Radio models • Running CntToLeds • build/pc/main.exe –x 1.0 1 MobiSys 2003
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 MobiSys 2003
TinyViz Screenshot MobiSys 2003
Adding Debugging Output tinyos-1.x/tos/lib/Counter.nc: export dbg=led,usr3 make pc build/pc/main.exe –x 1.0 1 event result_t Timer.fired() { state++; dbg(DBG_USR3, “Counter: %i.\n”, state); return call IntOutput.output(state); } MobiSys 2003
Simple Messaging • Build a CntToRfm mote • Build a RfmToLeds mote • One mote displays the other’s counter MobiSys 2003
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;} MobiSys 2003
RfmToLeds (apps/RfmToLeds/RfmToLeds.nc) configuration RfmToLeds {}implementation { components Main, RfmToInt, IntToLeds; Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> RfmToInt.StdControl; RfmToInt.IntOutput -> IntToLeds.IntOutput;} MobiSys 2003
Sensing • Instead of a counter, display sensor reading on LEDs • See what sensing code looks like • Install SenseToRfm on CntToRfm node MobiSys 2003
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;} MobiSys 2003
Sensing, Continued • Build a new application • Goals • Have two motes sense • Each displays other’s reading on LEDs • Starting blocks • SenseToRfm • RfmToLeds MobiSys 2003
Making a New Application • Create a new application directory • Create the Makefile • Write the code MobiSys 2003
Directory • mkdir tinyos-1.x/apps/SenseExchange • cd tinyos-1.x/apps/SenseExchange MobiSys 2003
Makefile • Create and edit Makefile: COMPONENT=SenseExchangeinclude ../Makerules MobiSys 2003
Application File • What components do we need? • Main • Photo • SenseToInt • IntToRfm • RfmToInt • IntToLeds • ClockC MobiSys 2003
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; MobiSys 2003
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; MobiSys 2003
Wiring It Up: Input Connections (apps/SenseExchange/SenseExchange.nc) Main.StdControl -> IntToLeds.StdControl; Main.StdControl -> RfmToInt.StdControl; RfmToInt.IntOutput -> IntToLeds.IntOutput; MobiSys 2003
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; } MobiSys 2003
Running SenseExchange • Compile and run on two motes • Cover one light sensor • Cover the other MobiSys 2003
Conclusion of Part I • Deployed a small sensor network • Installed simple applications • Used TOSSIM • Wrote SenseExchange • Part II: Communication, actuation MobiSys 2003
Questions MobiSys 2003
SerialForwarder • Sensor network proxy • Connects to serial port • Provides TCP socket interface java net.tinyos.sf.SerialForward & MobiSys 2003