<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://mobinets.cn/site/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Minghang</id>
	<title>MobiNetS - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://mobinets.cn/site/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Minghang"/>
	<link rel="alternate" type="text/html" href="http://mobinets.cn/site/Special:Contributions/Minghang"/>
	<updated>2026-04-15T06:54:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.0</generator>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1226</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1226"/>
		<updated>2020-02-20T15:24:59Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 4. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The transmission power is 3 in this experiment. If you want to change it, change the argument in &amp;lt;code&amp;gt;sendonly/Makefile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent (if you want to change it, please change it in &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt;), whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-aetx.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX (by default, we send 10000 packets, number of windows is 5 and size is 4, w = 5, d = 4, definition of w and d, please refer to paper)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Please see the details of &amp;lt;code&amp;gt;cal-betx.py&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers/cal-betx.py&amp;lt;/code&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py 5 4 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1225</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1225"/>
		<updated>2020-02-20T15:14:01Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 5. Processing data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The transmission power is 3 in this experiment. If you want to change it, change the argument in &amp;lt;code&amp;gt;sendonly/Makefile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-aetx.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX (by default, we send 10000 packets, number of windows is 5 and size is 4, w = 5, d = 4, definition of w and d, please refer to paper)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Please see the details of &amp;lt;code&amp;gt;cal-betx.py&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers/cal-betx.py&amp;lt;/code&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py 5 4 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation (by default, we send 10000 packets)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we send 100000 packets&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py 100000&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1177</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1177"/>
		<updated>2020-02-15T14:17:19Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The transmission power is 3 in this experiment. If you want to change it, change the argument in &amp;lt;code&amp;gt;sendonly/Makefile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1176</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1176"/>
		<updated>2020-02-15T14:16:54Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 2. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
The transmission power is 3 in this experiment. If you want to change it, change the argument in &amp;lt;code&amp;gt;sendonly/Makefile&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1175</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1175"/>
		<updated>2020-02-15T14:09:17Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1174</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1174"/>
		<updated>2020-02-15T14:08:56Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occurs when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1173</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1173"/>
		<updated>2020-02-15T14:08:45Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Testbed usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1172</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1172"/>
		<updated>2020-02-15T13:55:57Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-excluding 3&lt;br /&gt;
$ all-collect-excluding 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-excluding 3&amp;lt;/code&amp;gt; will burn all nodes excluding node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-excluding 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1171</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1171"/>
		<updated>2020-02-15T13:53:07Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1170</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1170"/>
		<updated>2020-02-15T13:50:44Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1169</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1169"/>
		<updated>2020-02-15T13:45:04Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 5. Processing data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experimental data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1168</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1168"/>
		<updated>2020-02-15T13:44:29Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 5. Processing data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate correlation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-correl.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more details, you can see the scripts in &amp;lt;code&amp;gt;/opt/myscripts/tinyos-helpers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And the experiment data is archived in &amp;lt;code&amp;gt;/data/archived/tinyos/demos/correlation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1167</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1167"/>
		<updated>2020-02-15T13:14:53Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* dd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1166</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1166"/>
		<updated>2020-02-15T13:14:47Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
2. Q:&lt;br /&gt;
&lt;br /&gt;
====dd====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1165</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1165"/>
		<updated>2020-02-15T13:14:24Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* dd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
====dd====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1164</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1164"/>
		<updated>2020-02-15T13:14:00Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;br /&gt;
=====dd=====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1163</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1163"/>
		<updated>2020-02-15T13:13:16Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* 5. Parse data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Processing data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    A: $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1162</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1162"/>
		<updated>2020-02-15T13:12:33Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====3.=====&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====4.=====&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
=====5. Parse data=====&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    A: $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1161</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1161"/>
		<updated>2020-02-15T13:10:53Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
=====1. Initiation=====&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
=====2.=====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    A: $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1160</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1160"/>
		<updated>2020-02-15T13:09:40Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    A: $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1159</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1159"/>
		<updated>2020-02-15T13:09:15Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java program such as &amp;lt;code&amp;gt;RadioCountToLeds&amp;lt;/code&amp;gt;&lt;br /&gt;
    A: $ source source /opt/myscripts/tinyos-helpers/tinyos-set-classpath&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1158</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1158"/>
		<updated>2020-02-15T13:07:28Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Testbed usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&lt;br /&gt;
&lt;br /&gt;
====Q&amp;amp;A====&lt;br /&gt;
1. Q: error occur when compile apps that contain java command&lt;br /&gt;
    A:&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1157</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1157"/>
		<updated>2020-02-15T13:04:35Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calculate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in &amp;lt;code&amp;gt;~/tinyos/612_mobinets&amp;lt;/code&amp;gt;. Make and burn app &amp;lt;code&amp;gt;sendonly&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;all-burn-exclude 3&amp;lt;/code&amp;gt; will burn all nodes exclude node(id 3) with app &amp;lt;code&amp;gt;receiveonly&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all-collect-exclude 3&amp;lt;/code&amp;gt; will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms.&lt;br /&gt;
&lt;br /&gt;
After transmission is done, go to the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To get bitmap&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ get-bitmap.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate a-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$  cal-aetx.py&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
To calculate b-ETX&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cal-betx.py&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1156</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1156"/>
		<updated>2020-02-15T12:51:00Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Anycast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calcuate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(~)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in ~/tinyos/data/612_mobinets. Make and burn app `sendonly` and `receiveonly`.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 36&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
`all-burn-exclude 3` will burn all nodes exclude node(id 3) with app `receiveonly`.&lt;br /&gt;
&lt;br /&gt;
`all-collect-exclude 3` will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms. After transmission is done, to go the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1155</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1155"/>
		<updated>2020-02-15T12:50:39Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calcuate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. Initiation&lt;br /&gt;
&lt;br /&gt;
Suppose you are in home directory(~)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in ~/tinyos/data/612_mobinets. Make and burn app `sendonly` and `receiveonly`.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 36&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
`all-burn-exclude 3` will burn all nodes exclude node(id 3) with app `receiveonly`.&lt;br /&gt;
&lt;br /&gt;
`all-collect-exclude 3` will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms. After transmission is done, to go the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1154</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1154"/>
		<updated>2020-02-15T12:49:55Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Demo Experiments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calcuate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. initiation&lt;br /&gt;
Suppose you are in home directory(~)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ tinyos-environment-init&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see apps in ~/tinyos/data/612_mobinets. Make and burn app `sendonly` and `receiveonly`.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd sendonly&lt;br /&gt;
$ make telosb&lt;br /&gt;
$ cd ../receiveonly&lt;br /&gt;
$ make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
If we want node(id 3) to send packets and other nodes to receive.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ all-burn-exclude 3&lt;br /&gt;
$ all-collect-exclude 36&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
`all-burn-exclude 3` will burn all nodes exclude node(id 3) with app `receiveonly`.&lt;br /&gt;
&lt;br /&gt;
`all-collect-exclude 3` will collect data generated by function printf and save it into files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then, open a new terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/tinyos/612_mobinets/sendonly&lt;br /&gt;
$ burn.py -s 3&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Totally, there are 10,000 packets to be sent, whose interval is 8ms. After transmission is done, to go the first terminal press key Ctrl+C to exit, then go to the second terminal&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ cd ~/data/tinyos&lt;br /&gt;
$ wc -l *.txt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You can see how many packets every node received.&lt;br /&gt;
&lt;br /&gt;
Suppose we find node 23, 32, 40, 55, 60 are what we want.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ mkdir raw&lt;br /&gt;
$ cp 23.txt 32.txt 40.txt 55.txt 60.txt raw&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1153</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1153"/>
		<updated>2020-02-15T12:22:03Z</updated>

		<summary type="html">&lt;p&gt;Minghang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Demo Experiments====&lt;br /&gt;
This demo shows a simple way to calcuate ETX and correlation.&lt;br /&gt;
&lt;br /&gt;
1. initiation&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1152</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1152"/>
		<updated>2020-02-15T12:17:35Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Multi-hop networks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1035</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1035"/>
		<updated>2019-10-08T08:42:00Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Useful parse scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. sjava.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;when we use java, the commad is too long,&lt;br /&gt;
just like java net. ... -comm serial@/dev/ttyUSB0:115200,&lt;br /&gt;
but with sjava.py, we can just type `sjava.py 1 Class'&lt;br /&gt;
here, 1 is the node's id, and Class is a specific java class.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. output_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to sjava.py, when we just want to see exactly one node's printf message in terminal,&lt;br /&gt;
say the node's id is 1, then type `output_data.py 1'&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1034</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1034"/>
		<updated>2019-10-08T08:28:18Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Remote configuration via web */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
You can visit our server via ssh, then control the motes.&lt;br /&gt;
&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1033</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1033"/>
		<updated>2019-10-08T08:26:53Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Useful parse scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
For details you can see /opt/myscripts/tinyos-helpers&lt;br /&gt;
&lt;br /&gt;
1. collect_data.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;similar to burn.py, collect_data.py will redirect the printf message from terminal to files.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. get-bitmap.py&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;say collect_data.py provides us the raw data, get-bitmap.py will parse it to bitmap.&amp;lt;nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1032</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1032"/>
		<updated>2019-10-08T08:16:48Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Batch burn of multiple network nodes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
1. burn multiple nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;usage: burn.py [-s] ids&lt;br /&gt;
burn.py -s 1    , node with TOS_NODE_ID = 1 will be burned&lt;br /&gt;
burn.py -s 5 3 2    , TOS_NODE_ID = 5, 3, 2 will be burned&lt;br /&gt;
burn.py 23 55    , TOS_NODE_ID from 23 to 55 will be burned&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. burn all nodes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;all-burn&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1022</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1022"/>
		<updated>2019-09-27T14:20:13Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Data collection using USB cables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
// in function, fell free to use printf()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#define NEW_PRINTF_SEMANTICS&lt;br /&gt;
#include &amp;quot;printf.h&amp;quot;&lt;br /&gt;
...&lt;br /&gt;
implementation {&lt;br /&gt;
    components PrintfC;&lt;br /&gt;
    components SerialStartC;&lt;br /&gt;
    ...&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Makefile&lt;br /&gt;
&lt;br /&gt;
add following code&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;CFLAGS += -I$(TOSDIR)/lib/printf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run&lt;br /&gt;
&lt;br /&gt;
in our exvironments, type the following command:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB1:telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1021</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1021"/>
		<updated>2019-09-27T14:04:43Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Data collection using USB cables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1020</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1020"/>
		<updated>2019-09-27T14:04:33Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Data collection using USB cables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
1. Use Printf&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1019</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1019"/>
		<updated>2019-09-27T14:04:01Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Data collection using USB cables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_TinyOS_printf_Library here].&lt;br /&gt;
&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1018</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1018"/>
		<updated>2019-09-27T13:20:47Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Useful parse scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;br /&gt;
1. bitmap.py&lt;br /&gt;
&lt;br /&gt;
Say mote A sends 1000 packets, numbered from 1 ~ 1000,&lt;br /&gt;
then we want to know how many packets mote B receives,&lt;br /&gt;
and what there numbers are.&lt;br /&gt;
&lt;br /&gt;
A bitmap is like &amp;quot;001100101010...&amp;quot;, where &amp;quot;0&amp;quot; means B does&lt;br /&gt;
not receive the packet and &amp;quot;1&amp;quot; means B receives the packet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/usr/bin/env python&lt;br /&gt;
def raw2bit(src_file, dest_file, total_bit):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    @brief      get bitmap from raw data&lt;br /&gt;
    &lt;br /&gt;
    @param      src_file   The source file path (raw data generated by tinyos printf function)&lt;br /&gt;
    @param      dest_file  The destination file path (bitmap file as output)&lt;br /&gt;
    @param      total_bit  The total bits of the package (size of bitmap)&lt;br /&gt;
    &lt;br /&gt;
    @return&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(src_file,'rb') as fr:&lt;br /&gt;
        fw = open(dest_file,'w')&lt;br /&gt;
        line_1 = fr.readline().strip()#除去换行符号'\n'&lt;br /&gt;
        receive = 0 #总的收包个数&lt;br /&gt;
        count = 1   #上一个收到的包的序列号加1&lt;br /&gt;
        if len(line_1) &amp;lt; 24:&lt;br /&gt;
            pass    #第一行的固定前缀有23个字符&lt;br /&gt;
        else:&lt;br /&gt;
            start = int(line_1[23:])&lt;br /&gt;
            for i in range(start - 1):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = start + 1&lt;br /&gt;
        for line in fr:&lt;br /&gt;
            for j in range(int(line) - count):&lt;br /&gt;
                fw.write('0')&lt;br /&gt;
            fw.write('1')&lt;br /&gt;
            receive += 1&lt;br /&gt;
            count = int(line) + 1&lt;br /&gt;
        for k in range(total_bit - count + 1):&lt;br /&gt;
            fw.write('0')&lt;br /&gt;
        fw.close()&lt;br /&gt;
    fr.close()&lt;br /&gt;
    &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1009</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1009"/>
		<updated>2019-09-26T07:56:36Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Routing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1008</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1008"/>
		<updated>2019-09-26T07:54:24Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Routing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;AM_BROADCAST_ADDR&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
'''AM_BROADCAST_ADDR''' is a MACRO. Using this ADDRESS, a mote will boradcast the packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Unicast====&lt;br /&gt;
When load the binary to the mote, we can set the '''TOS_NODE_ID''', so we can set the '''ADDRESS''' to &lt;br /&gt;
a specific '''TOS_NODE_ID''', such as 1 to unicast a packet.&lt;br /&gt;
For exmaple, if we want to set '''TOS_NODE_ID = 1''' in /dev/ttyUSB2&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install,1 bsl,/dev/ttyUSB2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1003</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1003"/>
		<updated>2019-09-26T07:17:29Z</updated>

		<summary type="html">&lt;p&gt;Minghang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
&lt;br /&gt;
====Code template====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1002</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=1002"/>
		<updated>2019-09-26T07:15:43Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Code template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if (call AMSend.send(ADDRESS, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
    locked = TRUE;&lt;br /&gt;
    // the packet is being sent&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
we can change '''ADDRESS''' to implement different protocols.&lt;br /&gt;
&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=947</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=947"/>
		<updated>2019-09-25T08:54:27Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Payload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation&lt;br /&gt;
    // in this example, msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=946</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=946"/>
		<updated>2019-09-25T08:53:34Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Payload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important!!!&lt;br /&gt;
    // variable declaration must be present before operation, in this example&lt;br /&gt;
    // msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=940</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=940"/>
		<updated>2019-09-25T08:47:21Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Payload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    msg_t *msg;&lt;br /&gt;
    // important variable declaration must be present before operation, in this example&lt;br /&gt;
    // msg is present before `if (locked)'&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=933</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=933"/>
		<updated>2019-09-25T08:40:44Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Payload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    msg_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // important variable declaration must be present before operation, in this example&lt;br /&gt;
   // msg is present before `counter++'&lt;br /&gt;
    ++counter;&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=931</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=931"/>
		<updated>2019-09-25T08:20:26Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ++counter;&lt;br /&gt;
    msg_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call Timer0.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=930</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=930"/>
		<updated>2019-09-25T08:18:03Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Payload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ++counter;&lt;br /&gt;
    msg_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call MilliTimer.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=929</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=929"/>
		<updated>2019-09-25T08:17:08Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ++counter;&lt;br /&gt;
    mst_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
        call AMControl.start();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    event void AMControl.startDone(error_t err) {&lt;br /&gt;
        if (err == SUCCESS) {&lt;br /&gt;
            call MilliTimer.startPeriodic(250);&lt;br /&gt;
        } else {&lt;br /&gt;
            call AMControl.start();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=928</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=928"/>
		<updated>2019-09-25T08:15:12Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Footer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ++counter;&lt;br /&gt;
    mst_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
event void AMControl.stopDone(error_t err) {&lt;br /&gt;
     // do nothing&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=927</id>
		<title>Tutorial:ZigBee</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=Tutorial:ZigBee&amp;diff=927"/>
		<updated>2019-09-25T08:13:44Z</updated>

		<summary type="html">&lt;p&gt;Minghang: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page shows the tutorial for experiments with ZigBee communications and the testbed. &lt;br /&gt;
[[File:Testbed.jpg|thumb|The ZigBee Testbed in B1-612, Main Building|link=]]&lt;br /&gt;
&lt;br /&gt;
Useful links: &lt;br /&gt;
* [https://blog.csdn.net/leansmall/article/details/78703633 TinyOS intro (Chinese)]&lt;br /&gt;
* [https://blog.csdn.net/liuruiqun/article/details/45504035 Programming model of TinyOS (Chinese)]&lt;br /&gt;
* [http://tinyos.stanford.edu/tinyos-wiki/index.php/Main_Page TinyOS main site and official tutorials]&lt;br /&gt;
&lt;br /&gt;
===The simplest example===&lt;br /&gt;
This example shows &lt;br /&gt;
&lt;br /&gt;
1) how the event-driven programming works,&lt;br /&gt;
&lt;br /&gt;
2) how to burn a program to a TelosB node.&lt;br /&gt;
&lt;br /&gt;
for details you can see [http://tinyos.stanford.edu/tinyos-wiki/index.php/The_simplest_TinyOS_program simplest tinyos program]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Configuration file, SimpleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
configuration SimpleAppC{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{ &lt;br /&gt;
    components SimpleC, MainC;&lt;br /&gt;
    SimpleC.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
this file will link two components &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. SimpleC.nc&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;module SimpleC{&lt;br /&gt;
    uses interface Boot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
implementation{&lt;br /&gt;
    event void Boot.booted() {&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When system starts, it will call interface booted in &amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt;, but this interface is not implemented.&lt;br /&gt;
&lt;br /&gt;
So &amp;lt;code&amp;gt;SimpleC&amp;lt;/code&amp;gt; implements it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MainC&amp;lt;/code&amp;gt; in nesC is just like main function in C.&lt;br /&gt;
&lt;br /&gt;
In this example, it does nothing, so it is just like following code in C:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;int main () {&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Makefile&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPONENT=SimpleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with &amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt; we can compile the code by typing&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. install&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;make telosb install bsl,/dev/ttyUSB0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Measurement===&lt;br /&gt;
To measure various information from received packets. &lt;br /&gt;
&lt;br /&gt;
Details is [http://tinyos.stanford.edu/tinyos-wiki/index.php/Mote-mote_radio_communication here]&lt;br /&gt;
====Code template====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// extract info upon receiving a packet.&lt;br /&gt;
event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {&lt;br /&gt;
    if (len != sizeof(msg_t)) {&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    } else {&lt;br /&gt;
        msg_t* msg = (msg_t*)payload;&lt;br /&gt;
        // msg is the info, we can do something upon it.&lt;br /&gt;
        // write your code with msg here, for example, we show it by led&lt;br /&gt;
        call Leds.set(msg-&amp;gt;counter);&lt;br /&gt;
        return bufPtr;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Payload====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// following code is the implementation&lt;br /&gt;
// to send a packet, we should create a packet at first.&lt;br /&gt;
message_t packet; // packet is a container of payload.&lt;br /&gt;
bool locked; // when it is sending a packet, sender is locked.&lt;br /&gt;
uint16_t counter = 0; // the payload in this example&lt;br /&gt;
&lt;br /&gt;
event void Timer0.fired() {&lt;br /&gt;
    if (locked) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ++counter;&lt;br /&gt;
    mst_t *msg = (msg_t*) call Packet.getPayload(&amp;amp;packet, sizeof(msg_t));&lt;br /&gt;
    // suppose msg contains payload `counter`&lt;br /&gt;
    msg-&amp;gt;counter = counter;&lt;br /&gt;
    // if there is other payload in msg, do assignment.&lt;br /&gt;
    // to send this packet&lt;br /&gt;
    if (call AMSend.send(AM_BROADCAST_ADDR, &amp;amp;packet, sizeof(msg_t)) == SUCCESS) {&lt;br /&gt;
        locked = TRUE;&lt;br /&gt;
        // the packet is being sent&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
====Header====&lt;br /&gt;
&lt;br /&gt;
ExampleC.h&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#ifndef EXAMPLE_H&lt;br /&gt;
#define EXAMPLE_H&lt;br /&gt;
&lt;br /&gt;
typedef nx_struct example_msg {&lt;br /&gt;
  nx_uint16_t counter;&lt;br /&gt;
} msg_t;&lt;br /&gt;
&lt;br /&gt;
enum {&lt;br /&gt;
    AM_MSG = 6, // mesage group&lt;br /&gt;
};&lt;br /&gt;
#endif&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleAppC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
configuration ExampleAppC {}&lt;br /&gt;
implementation {&lt;br /&gt;
    components MainC, ExampleC as App, LedsC;&lt;br /&gt;
    components new AMSenderC(AM_MSG);&lt;br /&gt;
    components new AMReceiverC(AM_MSG);&lt;br /&gt;
    components new TimerMilliC() as Timer0;&lt;br /&gt;
    components ActiveMessageC;&lt;br /&gt;
  &lt;br /&gt;
    App.Boot -&amp;gt; MainC.Boot;&lt;br /&gt;
  &lt;br /&gt;
    App.Receive -&amp;gt; AMReceiverC;&lt;br /&gt;
    App.AMSend -&amp;gt; AMSenderC;&lt;br /&gt;
    App.AMControl -&amp;gt; ActiveMessageC;&lt;br /&gt;
    App.Leds -&amp;gt; LedsC;&lt;br /&gt;
    App.Timer0 -&amp;gt; Timer0;&lt;br /&gt;
    App.Packet -&amp;gt; AMSenderC;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#include &amp;quot;Timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Example.h&amp;quot;&lt;br /&gt;
module ExampleC @safe() {&lt;br /&gt;
    uses {&lt;br /&gt;
        interface Leds;&lt;br /&gt;
        interface Boot;&lt;br /&gt;
        interface Receive;&lt;br /&gt;
        interface AMSend;&lt;br /&gt;
        interface Timer&amp;lt;TMilli&amp;gt; as Timer0;&lt;br /&gt;
        interface SplitControl as AMControl;&lt;br /&gt;
        interface Packet;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
implementation {&lt;br /&gt;
    // ... see in other sections: code example, payload&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Footer====&lt;br /&gt;
&lt;br /&gt;
ExampleC.nc&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// to unlock&lt;br /&gt;
event void AMSend.sendDone(message_t* bufPtr, error_t error) {&lt;br /&gt;
    if (&amp;amp;packet == bufPtr) {&lt;br /&gt;
        locked = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Makefile====&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;COMPONENT=ExampleAppC&lt;br /&gt;
include $(MAKERULES)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====RSSI====&lt;br /&gt;
====Byte-level RSSI====&lt;br /&gt;
&lt;br /&gt;
===Routing===&lt;br /&gt;
====Code template====&lt;br /&gt;
====Broadcast====&lt;br /&gt;
====Unicast====&lt;br /&gt;
====Anycast====&lt;br /&gt;
&lt;br /&gt;
===Testbed usage===&lt;br /&gt;
====Data collection using USB cables====&lt;br /&gt;
====Batch burn of multiple network nodes====&lt;br /&gt;
====Remote configuration via web====&lt;br /&gt;
====Multi-hop networks====&lt;br /&gt;
====Useful parse scripts====&lt;/div&gt;</summary>
		<author><name>Minghang</name></author>
	</entry>
</feed>