<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://anrg.usc.edu/contiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jiahaoli</id>
		<title>Contiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://anrg.usc.edu/contiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jiahaoli"/>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php/Special:Contributions/Jiahaoli"/>
		<updated>2026-10-10T02:49:13Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=EE_652_projects&amp;diff=1668</id>
		<title>EE 652 projects</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=EE_652_projects&amp;diff=1668"/>
				<updated>2014-12-22T14:52:12Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;EE 652 2014 Projects&lt;br /&gt;
&lt;br /&gt;
== Scheduling algorithms for IEEE 802.15.4e networks - Pedro ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039;: http://neptune.usc.edu:8081/pdasilva/tsch-schedulers/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;How to compile&amp;#039;&amp;#039;: gcc -std=gnu99 -o Scheduling util/*.c graphs/*.c mcc/*.c tasa/*.c main.c&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;How to execute&amp;#039;&amp;#039;: ./Scheduling &amp;lt;sink_id&amp;gt; &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where: 	&amp;lt;sink_id&amp;gt; = Sink identification (starting at 0) and &amp;lt;algorithm&amp;gt; = 0 if MCC and 1 if TASA&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Output&amp;#039;&amp;#039;: you will find files ext_schedule.h and topology.c, which should be used according to the project report&lt;br /&gt;
&lt;br /&gt;
The execution will consider data/prr55.txt file as input for PRR statistics. You need to create the file with tree description before running TASA. You can easily do that first running MCC for a given sink id (e.g. 3) and then running TASA for the same sink id.&lt;br /&gt;
&lt;br /&gt;
== Heat Diffusion Routing Algorithm Contiki Implementation - Pradipta ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039;: http://neptune.usc.edu:8081/pradipta/heat-diffusion.git&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
This is a contiki implementation of the Heat Diffusion algorithm proposed by Reza Banirazi, Edmond A. Jonckheere, Bhaskar Krishnamachari in &amp;#039;&amp;#039;&amp;#039;“Heat-Diffusion: Pareto optimal dynamic routing for time-varying wireless networks“, International Conference on Computer Communications (INFOCOM), 2014&amp;#039;&amp;#039;&amp;#039;. Heat Diffusion routing is a new multi-hop wireless network routing protocol which is similar to Back-Pressure routing based on concepts of heat diffusion in classical physics&lt;br /&gt;
&lt;br /&gt;
== Backpressure Control Protocol on IPv6 stack of Contiki - Mrunal and Chhavi ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039;: https://github.com/chhavikapoor/EE652_Final&lt;br /&gt;
&lt;br /&gt;
Use the branch final_project from the repository.&lt;br /&gt;
&lt;br /&gt;
Follow the README-BCP in the final_project repository to simulate the implementation of BCP on IPv6 stack in COOJA.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;: &lt;br /&gt;
&lt;br /&gt;
BCP is an implementation of dynamic backpressure routing in which the routing and forwarding decisions are made on per packet basis that takes into consideration the backpressure weight of each of its neighbors. The ubiquitous use of TCP/IP protocol suite in web applications, peer to peer networking over the internet etc motivated us to implement the Backpressure Collection Protocol on the IPv6 Stack of Contiki. We implemented a functional version of BCP on the IPv6 stack of Contiki OS.&lt;br /&gt;
In our implementation, BCP Sink by default has the node_id = 1.&lt;br /&gt;
&lt;br /&gt;
== Modifications to RPL for Mobility - Pratyush Deshpande, Gopi Marella and Abhilash Hegde ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039;: https://github.com/pratyush18/contiki-new.git&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
Routing Protocol for Low power and lossy networks (RPL) has been recently adopted  IETF routing protocol standard for low power  wireless sensor networks and Internet of Things applications. Originally RPL is designed for static networks with no support for mobility. But, several IoT applications involve mobile nodes and thus there is a need to modify RPL for supporting mobile node scenarios. In RPL, routing takes place by formationof Destination Oriented Acyclic Graph (DODAG). Several control messages like DODAG Information Objects (DIOs), DODAG Information Solicitation and DODAG Advertisement Objects (DAOs) are exchanged for the DODAG formation. These control messages propagate throughout the network and collaboratively work to form the DODAG. The &lt;br /&gt;
control messages in RPL are controlled by several timers. These control message timers need to be modified for mobile node scenarios. The timers need to be optimized based on mobility of nodes in the network. In this paper we have modified the existing implementation of RPL protocol in Contiki Operating system to improve its performance for scenarios where mobile nodes are involved. We have also developed a test-bed for simulating mobile nodes in COOJA simulator and evaluating performance metrics like Packet delivery ratio, Power consumption and Average latency per packet.&lt;br /&gt;
&lt;br /&gt;
== LOADng for Contiki- Jiahao Liang, Zhikun Liu and Haimo Bai ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Repository&amp;#039;&amp;#039;&amp;#039;: https://github.com/jiahaoliang/EE652_LOADng&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
The LLN On-demand Ad hoc Distance-vector Routing Protocol - Next Generation (LOADng) is a routing protocol, derived from AODV and extended for use in Low power Lossy Networks (LLNs). A reactive protocol, the basic operations of LOAD include generation of Route Requests (RREQs) by a router (originator) for when discovering a route to a destination, forwarding of such RREQs until they reach the destination router, generation of Route Replies (RREPs) upon receipt of a RREQ by the destination, and forwarding of these RREPs towards the originator.&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=RPL_UDP&amp;diff=1526</id>
		<title>RPL UDP</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=RPL_UDP&amp;diff=1526"/>
				<updated>2014-11-09T14:13:21Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: /* RPL Basics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
RPL is the IPv6 Routing Protocol for Low-power and Lossy Networks (LLNs).  LLNs are a class of network in which both the routers and their interconnect are constrained.  LLN routers typically operate with constraints on processing power, memory, and energy. RPL provides a mechanism whereby multipoint-to-point traffic from devices inside the LLN towards a central control point as well  as point-to-multipoint traffic from the central control point to the devices inside the LLN are supported.  Support for point-to-point traffic is also available.&lt;br /&gt;
&lt;br /&gt;
In this example, UDP is implemented on top of RPL. A LLN is comprised of a UDP server, which accepts available packets, and several UDP clients, which send packets periodically to server through single-hop or multi-hops.&lt;br /&gt;
&lt;br /&gt;
== You Will Learn ==&lt;br /&gt;
&lt;br /&gt;
Through this tutorial, you will learn the basic idea of RPL and operate UDP communications with ease without manipulating lower layer functions.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/examples/ipv6/rpl-udp/udp-server.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/examples/ipv6/rpl-udp/udp-client.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/core/net/tcpip.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/core/net/tcpip.h&lt;br /&gt;
&lt;br /&gt;
== RPL Basics ==&lt;br /&gt;
&lt;br /&gt;
[[File:contiki_stacks.jpg|200px|right|frame|Contiki Layers]]&lt;br /&gt;
&lt;br /&gt;
RPL was designed with the objective to meet the requirements spelled out in [https://tools.ietf.org/html/rfc5867 RFC5867], [https://tools.ietf.org/html/rfc5826 RFC5826], [https://tools.ietf.org/html/rfc5673 RFC5673], and [https://tools.ietf.org/html/rfc5548 RFC5548].&lt;br /&gt;
&lt;br /&gt;
In order to be useful in a wide range of LLN application domains, RPL separates packet processing and forwarding from the routing optimization objective.  Examples of such objectives includes minimizing energy, minimizing latency, or satisfying constraints. A RPL implementation, in support of a particular LLN application, will include the necessary Objective Function(s) as required by the application.&lt;br /&gt;
&lt;br /&gt;
RPL operations require bidirectional links.  In some LLN scenarios, those links may exhibit asymmetric properties.  It is required that the reachability of a router be verified before the router can be used as a parent.  RPL expects an external mechanism to be triggered during the parent selection phase in order to verify link properties and neighbor reachability.  &lt;br /&gt;
&lt;br /&gt;
RPL also expects an external mechanism to access and transport some control information, referred to as the &amp;quot;RPL Packet Information&amp;quot;, in data packets.   RPL provides a mechanism to disseminate information over the  dynamically formed network topology.  This dissemination enables minimal configuration in the nodes, allowing nodes to operate mostly  autonomously.  &lt;br /&gt;
&lt;br /&gt;
In particular, RPL may disseminate IPv6 Neighbor Discovery (ND) information such as the [https://tools.ietf.org/html/rfc4861 RFC4861] Prefix Information Option (PIO) and the [https://tools.ietf.org/html/rfc4191 RFC4191] Route Information Option (RIO).  ND information that is  disseminated by RPL conserves all its original semantics for router to host, with limited extensions for router to router, though it is not to be confused with routing advertisements and it is never to be  directly redistributed in another routing protocol.  A RPL node often combines host and router behaviors.  As a host, it will process the options as specified in [https://tools.ietf.org/html/rfc4191 RFC4191], [https://tools.ietf.org/html/rfc4861 RFC4861], [https://tools.ietf.org/html/rfc4862 RFC4862], and  [https://tools.ietf.org/html/rfc6275 RFC6275].  As a router, the RPL node may advertise the information from the options as required for the specific link.&lt;br /&gt;
&lt;br /&gt;
For further information, please refer to [https://tools.ietf.org/html/rfc6550 &amp;#039;&amp;#039;&amp;#039;RFC 6550&amp;#039;&amp;#039;&amp;#039;], &amp;quot;RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== UDP Server ==&lt;br /&gt;
[[File:udp_server.jpg|200px|right|thumb|Flow chart for UDP server]]&lt;br /&gt;
In the example, UDP server does three tasks primarily. &lt;br /&gt;
&lt;br /&gt;
1. Initializes RPL DAG;&lt;br /&gt;
&lt;br /&gt;
2. Sets up UPD connection;&lt;br /&gt;
&lt;br /&gt;
3. Waits for packets from client, receives and print them on stdout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initialize RPL DAG===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// check whether the ADDR_MANUAL was set succefuly or not&lt;br /&gt;
uip_ds6_addr_add(&amp;amp;ipaddr, 0, ADDR_MANUAL); &lt;br /&gt;
root_if = uip_ds6_addr_lookup(&amp;amp;ipaddr);&lt;br /&gt;
if(root_if != NULL) {&lt;br /&gt;
  rpl_dag_t *dag;&lt;br /&gt;
  //set the ip adress of server as the root of initial DAG &lt;br /&gt;
  dag = rpl_set_root(RPL_DEFAULT_INSTANCE,(uip_ip6addr_t *)&amp;amp;ipaddr);&lt;br /&gt;
  uip_ip6addr(&amp;amp;ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);&lt;br /&gt;
  rpl_set_prefix(dag, &amp;amp;ipaddr, 64);&lt;br /&gt;
  PRINTF(&amp;quot;created a new RPL dag\n&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
  PRINTF(&amp;quot;failed to create a new RPL DAG\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===create UDP connection ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//create new UDP connection to client&amp;#039;s port&lt;br /&gt;
server_conn = udp_new(NULL, UIP_HTONS(UDP_CLIENT_PORT), NULL);&lt;br /&gt;
if(server_conn == NULL) {&lt;br /&gt;
  PRINTF(&amp;quot;No UDP connection available, exiting the process!\n&amp;quot;);&lt;br /&gt;
  PROCESS_EXIT();&lt;br /&gt;
}&lt;br /&gt;
//bing the connection to server&amp;#039;s local port&lt;br /&gt;
udp_bind(server_conn, UIP_HTONS(UDP_SERVER_PORT));&lt;br /&gt;
&lt;br /&gt;
PRINTF(&amp;quot;Created a server connection with remote address &amp;quot;);&lt;br /&gt;
PRINT6ADDR(&amp;amp;server_conn-&amp;gt;ripaddr);&lt;br /&gt;
PRINTF(&amp;quot; local/remote port %u/%u\n&amp;quot;, UIP_HTONS(server_conn-&amp;gt;lport),&lt;br /&gt;
       UIP_HTONS(server_conn-&amp;gt;rport));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===receives and processes incoming packet ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
  PROCESS_YIELD();&lt;br /&gt;
  //if there is packet available&lt;br /&gt;
  if(ev == tcpip_event) {&lt;br /&gt;
    tcpip_handler();&lt;br /&gt;
  } else if (ev == sensors_event &amp;amp;&amp;amp; data == &amp;amp;button_sensor) {&lt;br /&gt;
    PRINTF(&amp;quot;Initiaing global repair\n&amp;quot;);&lt;br /&gt;
    rpl_repair_root(RPL_DEFAULT_INSTANCE);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//call this function if packet available&lt;br /&gt;
static void&lt;br /&gt;
tcpip_handler(void)&lt;br /&gt;
{&lt;br /&gt;
  char *appdata;&lt;br /&gt;
&lt;br /&gt;
  if(uip_newdata()) {&lt;br /&gt;
    appdata = (char *)uip_appdata;&lt;br /&gt;
    appdata[uip_datalen()] = 0;&lt;br /&gt;
    //print the data of packet&lt;br /&gt;
    PRINTF(&amp;quot;DATA recv &amp;#039;%s&amp;#039; from &amp;quot;, appdata);&lt;br /&gt;
    PRINTF(&amp;quot;%d&amp;quot;,&lt;br /&gt;
           UIP_IP_BUF-&amp;gt;srcipaddr.u8[sizeof(UIP_IP_BUF-&amp;gt;srcipaddr.u8) - 1]);&lt;br /&gt;
    PRINTF(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UDP Client ==&lt;br /&gt;
&lt;br /&gt;
[[File:udp_client.png|200px|right|thumb|Flow chart for UDP client]]&lt;br /&gt;
In the example, UDP server does two tasks primarily. &lt;br /&gt;
&lt;br /&gt;
1. Sets up UPD connection;&lt;br /&gt;
&lt;br /&gt;
2. Sends packet to UDP server periodically.&lt;br /&gt;
&lt;br /&gt;
=== Sets up UPD connection ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* new connection with remote host */&lt;br /&gt;
client_conn = udp_new(NULL, UIP_HTONS(UDP_SERVER_PORT), NULL); &lt;br /&gt;
if(client_conn == NULL) {&lt;br /&gt;
  PRINTF(&amp;quot;No UDP connection available, exiting the process!\n&amp;quot;);&lt;br /&gt;
  PROCESS_EXIT();&lt;br /&gt;
}&lt;br /&gt;
udp_bind(client_conn, UIP_HTONS(UDP_CLIENT_PORT)); &lt;br /&gt;
&lt;br /&gt;
PRINTF(&amp;quot;Created a connection with the server &amp;quot;);&lt;br /&gt;
PRINT6ADDR(&amp;amp;client_conn-&amp;gt;ripaddr);&lt;br /&gt;
PRINTF(&amp;quot; local/remote port %u/%u\n&amp;quot;,&lt;br /&gt;
UIP_HTONS(client_conn-&amp;gt;lport), UIP_HTONS(client_conn-&amp;gt;rport));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sends packet ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//set time interval by SEND_INTERVAL&lt;br /&gt;
etimer_set(&amp;amp;periodic, SEND_INTERVAL);&lt;br /&gt;
while(1) {&lt;br /&gt;
  PROCESS_YIELD();&lt;br /&gt;
  if(ev == tcpip_event) {&lt;br /&gt;
    tcpip_handler();&lt;br /&gt;
  }&lt;br /&gt;
  //send packet every SEND_INTERVAL&lt;br /&gt;
  if(etimer_expired(&amp;amp;periodic)) {&lt;br /&gt;
    etimer_reset(&amp;amp;periodic);&lt;br /&gt;
    ctimer_set(&amp;amp;backoff_timer, SEND_TIME, send_packet, NULL);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void&lt;br /&gt;
send_packet(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  static int seq_id;&lt;br /&gt;
  char buf[MAX_PAYLOAD_LEN];&lt;br /&gt;
&lt;br /&gt;
  seq_id++;&lt;br /&gt;
  PRINTF(&amp;quot;DATA send to %d &amp;#039;Hello %d&amp;#039;\n&amp;quot;,&lt;br /&gt;
         server_ipaddr.u8[sizeof(server_ipaddr.u8) - 1], seq_id);&lt;br /&gt;
  sprintf(buf, &amp;quot;Hello %d from the client&amp;quot;, seq_id);&lt;br /&gt;
  //send packet through client_conn to UDP server&lt;br /&gt;
  uip_udp_packet_sendto(client_conn, buf, strlen(buf),&lt;br /&gt;
                        &amp;amp;server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cooja Simulation ==&lt;br /&gt;
The DGRM model is used.&lt;br /&gt;
The following are the steps to form a new simulation:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; You can refer to [[Cooja Simulator]] for an introduction to Cooja.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Run Cooja&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Go to your Contiki folder(contiki-2.7) and then go to /tools/cooja directory&amp;lt;br&amp;gt; Run the command sudo ant run to open up a cooja GUI.&amp;lt;br&amp;gt;&lt;br /&gt;
 $ cd contiki-2.7/tools/cooja&lt;br /&gt;
 $ sudo ant run&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Open an existing simulation file&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
In the GUI, select File-&amp;gt;Open simulation-&amp;gt;Browse..&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the dialogue shows up, Open home/contiki-2.7/examples/ipv6/rpl-udp/rpl-udp.csc&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;: If compile error shows up, please run&lt;br /&gt;
 $ cd contiki-2.7/examples/ipv6/rpl-udp&lt;br /&gt;
 $ make&lt;br /&gt;
&lt;br /&gt;
[[File:opensim.png|center|border|500px|Open an existing simulation]]&lt;br /&gt;
&lt;br /&gt;
You are suppose to see the simulation showing up like this.&lt;br /&gt;
&lt;br /&gt;
[[File:siminterface.png|center|border|500px|Simulation interface]]&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Run Simulation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Run the simulation by using the &amp;#039;&amp;#039;Start&amp;#039;&amp;#039; option in the &amp;#039;&amp;#039;Simulation Control&amp;#039;&amp;#039; window. This will initiate the motes and allocate all with a new Rime address and other initialization processes. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Watch Output&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
The motes output and debug messages can be seen in the &amp;#039;&amp;#039;Motes Output&amp;#039;&amp;#039; window. You can filter the output based on the node &amp;#039;&amp;#039;ID:node_id&amp;#039;&amp;#039; to watch a particular node. You can also watch particular debug messages by filtering them. The other useful functions of the &amp;#039;&amp;#039;Motes Output&amp;#039;&amp;#039; are &amp;#039;&amp;#039;File, Edit&amp;#039;&amp;#039; and &amp;#039;&amp;#039;View&amp;#039;&amp;#039;. The &amp;#039;&amp;#039;File&amp;#039;&amp;#039; option helps in saving the output to a file. The &amp;#039;&amp;#039;Edit&amp;#039;&amp;#039; has the option of copying the output - either full or a particular selected messages. You can also clear the messages using the &amp;#039;&amp;#039;Clear all messages&amp;#039;&amp;#039; option.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use these messages saved in file to make observations and plot graphs according to the objective of your experiment.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:simioutput.png|center|border|500px|Simulation output]]&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
*[https://tools.ietf.org/html/rfc6550 &amp;#039;&amp;#039;&amp;#039;RFC 6550&amp;#039;&amp;#039;&amp;#039;], &amp;quot;RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=RPL_UDP&amp;diff=1525</id>
		<title>RPL UDP</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=RPL_UDP&amp;diff=1525"/>
				<updated>2014-11-09T14:09:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: Created page with &amp;quot;== Introduction ==  RPL is the IPv6 Routing Protocol for Low-power and Lossy Networks (LLNs).  LLNs are a class of network in which both the routers and their interconnect are...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
RPL is the IPv6 Routing Protocol for Low-power and Lossy Networks (LLNs).  LLNs are a class of network in which both the routers and their interconnect are constrained.  LLN routers typically operate with constraints on processing power, memory, and energy. RPL provides a mechanism whereby multipoint-to-point traffic from devices inside the LLN towards a central control point as well  as point-to-multipoint traffic from the central control point to the devices inside the LLN are supported.  Support for point-to-point traffic is also available.&lt;br /&gt;
&lt;br /&gt;
In this example, UDP is implemented on top of RPL. A LLN is comprised of a UDP server, which accepts available packets, and several UDP clients, which send packets periodically to server through single-hop or multi-hops.&lt;br /&gt;
&lt;br /&gt;
== You Will Learn ==&lt;br /&gt;
&lt;br /&gt;
Through this tutorial, you will learn the basic idea of RPL and operate UDP communications with ease without manipulating lower layer functions.&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/examples/ipv6/rpl-udp/udp-server.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/examples/ipv6/rpl-udp/udp-client.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/core/net/tcpip.c&lt;br /&gt;
&lt;br /&gt;
~/contiki-2.7/core/net/tcpip.h&lt;br /&gt;
&lt;br /&gt;
== RPL Basics ==&lt;br /&gt;
&lt;br /&gt;
[[File:contiki_stacks.jpg|200px|right|frame|Contiki Layers]]&lt;br /&gt;
&lt;br /&gt;
RPL was designed with the objective to meet the requirements spelled out in [RFC5867], [RFC5826], [RFC5673], and [RFC5548].&lt;br /&gt;
&lt;br /&gt;
In order to be useful in a wide range of LLN application domains, RPL separates packet processing and forwarding from the routing optimization objective.  Examples of such objectives includes minimizing energy, minimizing latency, or satisfying constraints. A RPL implementation, in support of a particular LLN application, will include the necessary Objective Function(s) as required by the application.&lt;br /&gt;
&lt;br /&gt;
RPL operations require bidirectional links.  In some LLN scenarios, those links may exhibit asymmetric properties.  It is required that the reachability of a router be verified before the router can be used as a parent.  RPL expects an external mechanism to be triggered during the parent selection phase in order to verify link properties and neighbor reachability.  &lt;br /&gt;
&lt;br /&gt;
RPL also expects an external mechanism to access and transport some control information, referred to as the &amp;quot;RPL Packet Information&amp;quot;, in data packets.   RPL provides a mechanism to disseminate information over the  dynamically formed network topology.  This dissemination enables minimal configuration in the nodes, allowing nodes to operate mostly  autonomously.  &lt;br /&gt;
&lt;br /&gt;
In particular, RPL may disseminate IPv6 Neighbor Discovery (ND) information such as the [RFC4861] Prefix Information Option (PIO) and the [RFC4191] Route Information Option (RIO).  ND information that is  disseminated by RPL conserves all its original semantics for router to host, with limited extensions for router to router, though it is not to be confused with routing advertisements and it is never to be  directly redistributed in another routing protocol.  A RPL node often combines host and router behaviors.  As a host, it will process the options as specified in [RFC4191], [RFC4861], [RFC4862], and  [RFC6275].  As a router, the RPL node may advertise the information from the options as required for the specific link.&lt;br /&gt;
&lt;br /&gt;
For further information, please refer to [https://tools.ietf.org/html/rfc6550 &amp;#039;&amp;#039;&amp;#039;RFC 6550&amp;#039;&amp;#039;&amp;#039;], &amp;quot;RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== UDP Server ==&lt;br /&gt;
[[File:udp_server.jpg|200px|right|thumb|Flow chart for UDP server]]&lt;br /&gt;
In the example, UDP server does three tasks primarily. &lt;br /&gt;
&lt;br /&gt;
1. Initializes RPL DAG;&lt;br /&gt;
&lt;br /&gt;
2. Sets up UPD connection;&lt;br /&gt;
&lt;br /&gt;
3. Waits for packets from client, receives and print them on stdout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initialize RPL DAG===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// check whether the ADDR_MANUAL was set succefuly or not&lt;br /&gt;
uip_ds6_addr_add(&amp;amp;ipaddr, 0, ADDR_MANUAL); &lt;br /&gt;
root_if = uip_ds6_addr_lookup(&amp;amp;ipaddr);&lt;br /&gt;
if(root_if != NULL) {&lt;br /&gt;
  rpl_dag_t *dag;&lt;br /&gt;
  //set the ip adress of server as the root of initial DAG &lt;br /&gt;
  dag = rpl_set_root(RPL_DEFAULT_INSTANCE,(uip_ip6addr_t *)&amp;amp;ipaddr);&lt;br /&gt;
  uip_ip6addr(&amp;amp;ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);&lt;br /&gt;
  rpl_set_prefix(dag, &amp;amp;ipaddr, 64);&lt;br /&gt;
  PRINTF(&amp;quot;created a new RPL dag\n&amp;quot;);&lt;br /&gt;
} else {&lt;br /&gt;
  PRINTF(&amp;quot;failed to create a new RPL DAG\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===create UDP connection ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//create new UDP connection to client&amp;#039;s port&lt;br /&gt;
server_conn = udp_new(NULL, UIP_HTONS(UDP_CLIENT_PORT), NULL);&lt;br /&gt;
if(server_conn == NULL) {&lt;br /&gt;
  PRINTF(&amp;quot;No UDP connection available, exiting the process!\n&amp;quot;);&lt;br /&gt;
  PROCESS_EXIT();&lt;br /&gt;
}&lt;br /&gt;
//bing the connection to server&amp;#039;s local port&lt;br /&gt;
udp_bind(server_conn, UIP_HTONS(UDP_SERVER_PORT));&lt;br /&gt;
&lt;br /&gt;
PRINTF(&amp;quot;Created a server connection with remote address &amp;quot;);&lt;br /&gt;
PRINT6ADDR(&amp;amp;server_conn-&amp;gt;ripaddr);&lt;br /&gt;
PRINTF(&amp;quot; local/remote port %u/%u\n&amp;quot;, UIP_HTONS(server_conn-&amp;gt;lport),&lt;br /&gt;
       UIP_HTONS(server_conn-&amp;gt;rport));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===receives and processes incoming packet ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
while(1) {&lt;br /&gt;
  PROCESS_YIELD();&lt;br /&gt;
  //if there is packet available&lt;br /&gt;
  if(ev == tcpip_event) {&lt;br /&gt;
    tcpip_handler();&lt;br /&gt;
  } else if (ev == sensors_event &amp;amp;&amp;amp; data == &amp;amp;button_sensor) {&lt;br /&gt;
    PRINTF(&amp;quot;Initiaing global repair\n&amp;quot;);&lt;br /&gt;
    rpl_repair_root(RPL_DEFAULT_INSTANCE);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//call this function if packet available&lt;br /&gt;
static void&lt;br /&gt;
tcpip_handler(void)&lt;br /&gt;
{&lt;br /&gt;
  char *appdata;&lt;br /&gt;
&lt;br /&gt;
  if(uip_newdata()) {&lt;br /&gt;
    appdata = (char *)uip_appdata;&lt;br /&gt;
    appdata[uip_datalen()] = 0;&lt;br /&gt;
    //print the data of packet&lt;br /&gt;
    PRINTF(&amp;quot;DATA recv &amp;#039;%s&amp;#039; from &amp;quot;, appdata);&lt;br /&gt;
    PRINTF(&amp;quot;%d&amp;quot;,&lt;br /&gt;
           UIP_IP_BUF-&amp;gt;srcipaddr.u8[sizeof(UIP_IP_BUF-&amp;gt;srcipaddr.u8) - 1]);&lt;br /&gt;
    PRINTF(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UDP Client ==&lt;br /&gt;
&lt;br /&gt;
[[File:udp_client.png|200px|right|thumb|Flow chart for UDP client]]&lt;br /&gt;
In the example, UDP server does two tasks primarily. &lt;br /&gt;
&lt;br /&gt;
1. Sets up UPD connection;&lt;br /&gt;
&lt;br /&gt;
2. Sends packet to UDP server periodically.&lt;br /&gt;
&lt;br /&gt;
=== Sets up UPD connection ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* new connection with remote host */&lt;br /&gt;
client_conn = udp_new(NULL, UIP_HTONS(UDP_SERVER_PORT), NULL); &lt;br /&gt;
if(client_conn == NULL) {&lt;br /&gt;
  PRINTF(&amp;quot;No UDP connection available, exiting the process!\n&amp;quot;);&lt;br /&gt;
  PROCESS_EXIT();&lt;br /&gt;
}&lt;br /&gt;
udp_bind(client_conn, UIP_HTONS(UDP_CLIENT_PORT)); &lt;br /&gt;
&lt;br /&gt;
PRINTF(&amp;quot;Created a connection with the server &amp;quot;);&lt;br /&gt;
PRINT6ADDR(&amp;amp;client_conn-&amp;gt;ripaddr);&lt;br /&gt;
PRINTF(&amp;quot; local/remote port %u/%u\n&amp;quot;,&lt;br /&gt;
UIP_HTONS(client_conn-&amp;gt;lport), UIP_HTONS(client_conn-&amp;gt;rport));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sends packet ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//set time interval by SEND_INTERVAL&lt;br /&gt;
etimer_set(&amp;amp;periodic, SEND_INTERVAL);&lt;br /&gt;
while(1) {&lt;br /&gt;
  PROCESS_YIELD();&lt;br /&gt;
  if(ev == tcpip_event) {&lt;br /&gt;
    tcpip_handler();&lt;br /&gt;
  }&lt;br /&gt;
  //send packet every SEND_INTERVAL&lt;br /&gt;
  if(etimer_expired(&amp;amp;periodic)) {&lt;br /&gt;
    etimer_reset(&amp;amp;periodic);&lt;br /&gt;
    ctimer_set(&amp;amp;backoff_timer, SEND_TIME, send_packet, NULL);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void&lt;br /&gt;
send_packet(void *ptr)&lt;br /&gt;
{&lt;br /&gt;
  static int seq_id;&lt;br /&gt;
  char buf[MAX_PAYLOAD_LEN];&lt;br /&gt;
&lt;br /&gt;
  seq_id++;&lt;br /&gt;
  PRINTF(&amp;quot;DATA send to %d &amp;#039;Hello %d&amp;#039;\n&amp;quot;,&lt;br /&gt;
         server_ipaddr.u8[sizeof(server_ipaddr.u8) - 1], seq_id);&lt;br /&gt;
  sprintf(buf, &amp;quot;Hello %d from the client&amp;quot;, seq_id);&lt;br /&gt;
  //send packet through client_conn to UDP server&lt;br /&gt;
  uip_udp_packet_sendto(client_conn, buf, strlen(buf),&lt;br /&gt;
                        &amp;amp;server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cooja Simulation ==&lt;br /&gt;
The DGRM model is used.&lt;br /&gt;
The following are the steps to form a new simulation:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; You can refer to [[Cooja Simulator]] for an introduction to Cooja.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Run Cooja&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Go to your Contiki folder(contiki-2.7) and then go to /tools/cooja directory&amp;lt;br&amp;gt; Run the command sudo ant run to open up a cooja GUI.&amp;lt;br&amp;gt;&lt;br /&gt;
 $ cd contiki-2.7/tools/cooja&lt;br /&gt;
 $ sudo ant run&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Open an existing simulation file&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
In the GUI, select File-&amp;gt;Open simulation-&amp;gt;Browse..&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the dialogue shows up, Open home/contiki-2.7/examples/ipv6/rpl-udp/rpl-udp.csc&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;: If compile error shows up, please run&lt;br /&gt;
 $ cd contiki-2.7/examples/ipv6/rpl-udp&lt;br /&gt;
 $ make&lt;br /&gt;
&lt;br /&gt;
[[File:opensim.png|center|border|500px|Open an existing simulation]]&lt;br /&gt;
&lt;br /&gt;
You are suppose to see the simulation showing up like this.&lt;br /&gt;
&lt;br /&gt;
[[File:siminterface.png|center|border|500px|Simulation interface]]&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Run Simulation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Run the simulation by using the &amp;#039;&amp;#039;Start&amp;#039;&amp;#039; option in the &amp;#039;&amp;#039;Simulation Control&amp;#039;&amp;#039; window. This will initiate the motes and allocate all with a new Rime address and other initialization processes. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Watch Output&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
The motes output and debug messages can be seen in the &amp;#039;&amp;#039;Motes Output&amp;#039;&amp;#039; window. You can filter the output based on the node &amp;#039;&amp;#039;ID:node_id&amp;#039;&amp;#039; to watch a particular node. You can also watch particular debug messages by filtering them. The other useful functions of the &amp;#039;&amp;#039;Motes Output&amp;#039;&amp;#039; are &amp;#039;&amp;#039;File, Edit&amp;#039;&amp;#039; and &amp;#039;&amp;#039;View&amp;#039;&amp;#039;. The &amp;#039;&amp;#039;File&amp;#039;&amp;#039; option helps in saving the output to a file. The &amp;#039;&amp;#039;Edit&amp;#039;&amp;#039; has the option of copying the output - either full or a particular selected messages. You can also clear the messages using the &amp;#039;&amp;#039;Clear all messages&amp;#039;&amp;#039; option.&amp;lt;br&amp;gt;&lt;br /&gt;
You can use these messages saved in file to make observations and plot graphs according to the objective of your experiment.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:simioutput.png|center|border|500px|Simulation output]]&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
*[https://tools.ietf.org/html/rfc6550 &amp;#039;&amp;#039;&amp;#039;RFC 6550&amp;#039;&amp;#039;&amp;#039;], &amp;quot;RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Udp_client.png&amp;diff=1524</id>
		<title>File:Udp client.png</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Udp_client.png&amp;diff=1524"/>
				<updated>2014-11-09T14:09:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Simioutput.png&amp;diff=1523</id>
		<title>File:Simioutput.png</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Simioutput.png&amp;diff=1523"/>
				<updated>2014-11-09T14:06:05Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Siminterface.png&amp;diff=1522</id>
		<title>File:Siminterface.png</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Siminterface.png&amp;diff=1522"/>
				<updated>2014-11-09T14:01:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Opensim.png&amp;diff=1521</id>
		<title>File:Opensim.png</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Opensim.png&amp;diff=1521"/>
				<updated>2014-11-09T13:50:33Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Udp_server.jpg&amp;diff=1520</id>
		<title>File:Udp server.jpg</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Udp_server.jpg&amp;diff=1520"/>
				<updated>2014-11-09T12:49:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=File:Contiki_stacks.jpg&amp;diff=1519</id>
		<title>File:Contiki stacks.jpg</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=File:Contiki_stacks.jpg&amp;diff=1519"/>
				<updated>2014-11-09T12:04:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	<entry>
		<id>http://anrg.usc.edu/contiki/index.php?title=Contiki_tutorials&amp;diff=454</id>
		<title>Contiki tutorials</title>
		<link rel="alternate" type="text/html" href="http://anrg.usc.edu/contiki/index.php?title=Contiki_tutorials&amp;diff=454"/>
				<updated>2014-10-22T22:51:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jiahaoli: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Main_Page | Back to Main Page]]&lt;br /&gt;
&lt;br /&gt;
== List of Tutorials ==&lt;br /&gt;
&lt;br /&gt;
Completed&lt;br /&gt;
# [[Installation]]&lt;br /&gt;
# [[Hello World]]&lt;br /&gt;
# [[Broadcast Example]]&lt;br /&gt;
# [[Collect View]]&lt;br /&gt;
# [[Contiki build system]]&lt;br /&gt;
# [[Interfacing with Python]]&lt;br /&gt;
# [[Sensor acquisition]] (light, temperature, humidity)&lt;br /&gt;
&lt;br /&gt;
Need review&lt;br /&gt;
# [[Timers]] Tim, Leo&lt;br /&gt;
# [[CFS-Coffee]] Kevin&lt;br /&gt;
&lt;br /&gt;
Starting&lt;br /&gt;
# [[Tutornet]] Pedro, Kwame&lt;br /&gt;
# [[Cooja Simulator]] (Getting started, debugging) Pedro&lt;br /&gt;
# [[Protocols stack]]&lt;br /&gt;
# [[CSMA]] Tim, Leo&lt;br /&gt;
# [[RSS measurement]]&lt;br /&gt;
# [[RPL objective function modification and simulation in cooja  ]] Ashwini Telang&lt;br /&gt;
# [[RPL UDP]] Jiahao Liang&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[Processes]] Yash --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;Be sure to include references in your tutorials, especially if you quote material from other sites!&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jiahaoli</name></author>	</entry>

	</feed>