实验说明
本实验主要通过cooja模拟器,完成对rpl协议的仿真
实验平台
VMware中InstantContiki3.0(使用Cooja模拟器)
实验过程
- 打开cooja模拟器
- 在cooja模拟器中,点击File打开rpl工程
- 出现窗口,Simulation control窗口可以控制仿真实验开始结束;Network窗口可以看到节点的状态数量以及通信的过程;Radio messages窗口可以看到数据包的发送接收;Mote output窗口可以看到节点的接入情况。
- 如图,可以看到一共有30个节点,其中节点1为汇聚节点,其余节点为普通节点。
- 点击start,仿真开始。
- 查看Mote output窗口,可以看到在开始阶段,各节点在进行ipv6地址的分配,并且与server节点(汇聚节点1)建立通信连接,能够互相发送udp数据包。
- 查看Radio messages窗口,可以看到节点发送DIS数据包,用于发现它们的邻居节点并请求邻居节点的DIO数据包。
- 根节点(节点1)发出DIO数据包回应它的邻居节点,由图中可知节点23、节点5、节点14和节点20都在根节点的通信范围内。
同样的道理,对于节点5来说,节点1、节点23、节点24、节点30、节点14都是它的一跳邻居。
- 对于节点1在00:08.292时刻发送给节点14的DIO包,
在00:10.627时刻,节点14发送给节点1一个DAO包,表示节点14告诉节点1它将把节点1作为它的父节点,下一个时刻,节点1发送给节点14一个ACK应答帧,表示接受节点14作为其子节点。从而建立起从节点14到根节点(节点1)的路径。
- 对于节点30而言,根节点不在其通信范围内,节点30将在自己的邻居节点24、节点10和节点5之中,选择它的根节点。节点30发送DAO包给邻居节点,根据目标度量函数,节点5的rank最小,选择节点5作为其父节点,节点5返回ACK帧,表接收节点30作为其子节点。
- 1分钟后,路由路径已经形成,叶子节点可以向根节点发送数据包了。
可以看到,01:04.959时刻开始,节点29开始发送UDP数据包到根节点。
- 节点29发送UDP数据包,它的下一跳节点7收到了它的数据包。
- 节点7发送UDP数据包,它的下一跳节点26收到数据包。
- 节点26发送UDP数据包,它的下一跳节点20收到数据包,节点20发送数据包,它的下一跳节点(根节点)收到了数据包。至此,完成从节点29到节点1的数据包发送过程。
RPL组网过程
- 节点加入网络,首先发送DIS包,征集邻居节点信息。
- 邻居点接收到DIS开始发送DIO包。
- 收到DIO包的节点更新自身邻居表,并选择合适的节点发送数据包。
- 同时节点会向选中的父节点(选择的机制一般是ETX)发送DAO包,告知其是子节点。
- 父节点更新了自身的路由表后,再向父节点的父节点发DAO,最后到达sink点后双向链路最终形成。
部分通信源码解析
- udp-server.c
根节点和其余节点建立udp连接,绑定端口,当发生tcp/ip事件时,调用handler在Mote output窗口打印出数据的接收/发送情况;当发生sensors事件,rpl结构需要重新建立。
2. udp-client.c
节点与节点建立udp连接,绑定端口,当发生tcp/ip事件时,调用handler在Mote output窗口打印出数据的接收/发送情况;当计时器过期时,需要重置。