无线传感器网络技术-实验二-CTP协议实验

【实验目的】

  1. 学习 CTP 的链路估计、路由引擎和转发引擎
  2. 掌握 CTP 三个组件的使用
  3. 理解程序代码,编程实现 CTP 协议及其应用。

 

【实验设备】

  1. 装有 VMware Ubuntu 虚拟机的宿主 PC 机一台;
  2. 下载器一个;
  3. 物联网实验综合箱一套(两个以上节点)。

 

【实验要求】

  1. 编写要求:编程实现 CTP 协议;
  2. 实现功能:网络中所有 node 节点通过多跳将数据汇聚至 root 节点;
  3. 实现现象:root 节点接收网络 node 节点汇聚的数据,并将该数据发回网关。

 

【实验原理】

CTP 是基于树的汇聚协议。网络中的一些节点将自己设为根节点,节点之间形成到根节点的树的集 合。CTP 是没有地址的,节点并不是向固定的根节点发送数据包,而是通过选择下一跳隐式地选择根节 点。

CTP 使用期望传输值(ETX,Expected Transmissions)作为路由梯度。根节点的 ETX 为 0,其它节 点的 ETX 为其父节点的 ETX 值加上到父节点链路的 ETX 值。这种相加的方法需要假设节点使用链路 层重传。给出一种有效的路由,CTP 选择 ETX 值最小的一种。

路由循环是可能在 CTP 网络中出现的问题之一。路由循环通常发生在节点选择的路由的 ETX 值比 原来的大的多的情况下,这可能是因为与侯选的节点失去连接造成的。如果它是新的路由选择的节点, 那就产生了路由循环。CTP 通过两种方法处理路由循环。第一种是每个 CTP 包含有当前节点的 ETX 值, 如果 CTP 接收到比自己的 ETX 值小的数据帧,则说明树中有不一致。CTP 通过广播一个信息帧以期解 决这种不一致性,希望发送这个数据帧的节点收到并相应地调整它的路由。如果 一部分节点被隔开, 那么它们会形成 ETX 值无限增大的死循环。CTP 的第二种机制是不考虑 ETX 值大于一个固定常量的 路由,这个值取决于实现。

包重复是 CTP 中可能发生的另外一个问题。包重复发生在节点收到一个数据帧,并回复一个 ACK, 但 ACK 中途丢失的情况。发送者将重传这个包,而接收者又将收到它。这在多跳中是灾难性的,因为 重复是指数级的。同时路由循环使重复抑制变得更复杂,因为路由循环可能使节点合法地收到一个包一 次或多次。如果仅仅根据源地址和顺序号,路由循环中的包可能被丢弃。因此,CTP 数据帧具有一个已 存活时间(THL,time has lived)字段,每过一跳都对该字段加 1。 链路层重传具有相同的 THL 值, 但路由循环中的包就不会如此了。 在 TinyOS 中,CTP 协议的实现由三个主要的子组件:

  1. 链路质量估计器,负责估计单跳的 ETX 值

   链路质量估计器使用两种机制来估计链路质量:周期性的 LEEP 包和数据包。其中 LEEP 包 作为信息帧,这些包中填入邻居节点地址和相应的 ETX 值。信息帧的发 送速率由一种与 trikle dissemination 协议类似的算法根据网络的状况动态地计算。

该实现通过数据传输改变对 LEEP 的链路估计。这是计算 ETX 最直接的方法。当数据通路 传输一个数据包时,它告知链路估计器传输的目的地和传输成功与否。估计器对每 5 次传输产生 一个 ETX 估计值,ETX 为 6 表示一次也没传成。

链路质量估计器通过指数权重的移动平均线合并信息帧的 ETX 值和数据估计产生的 ETX 值。 基于信息帧的估计会填充邻居表。期望的状况是在已稳定的网络中,较低的信息帧速率意味着对 选定的路由来来说,数据估计占的比重比信息帧估计的大。

此外,CTP 收集数据估计的速率与传输速率是成比例的,因此它可以快速地检测到断开的连 接并切换到新的侯选邻居节点。

  1. 路由引擎,它根据链路估计和网络层的信息(如拥塞情况)来决定哪个邻居节点作为路由的下一

路由引擎负责选择数据传输的下一跳。它记录了链路估计表中所维护节点的一个子集的路径 ETX 值。最小耗费的路由即路径 ETX 值和连接 ETX 值之和最小的那条。

  1. 转发引擎,它维护发送包队列,决定是否发送和发送的时机
  2. 转发引擎不仅要转发从其它节点过来的数据包,同时也要发送自己产生的数据包。 转发引擎具有以下 5 种职责:

① 向下一跳传递包,并根据是否收到 ACK 向链路估计器传递相应信息;

② 决定何时向下一跳传递包;

③ 检测路由中的不一致性,并通知路由引擎;

④ 维护需要传输的包队列,它混杂了本地产生的包和需要转发的包;

⑤ 检测由于丢失 ACK 引起的单跳重复传输。 转发的四个关键函数为包接收(SubReceive.receive()),包转发(forward()),包传输(SendTask())和传输 完成事件(SubSend.sendDone())。

 

【实验步骤】

1、 完成硬件连接;

2、 打开虚拟机,进入到 VScode 显示 opt/tinyos-2.x/apps/cc2530_app/net-ctp 目录下创建项目目录, 并新建应用程序文件,包括配置文件 Makefile,配线组件 CTPAppC.nc 和模块组件 CTPC.nc

 

 

 

 

tinyos-2.x /tos/platforms/cc2530zn/PlatformLedsC.nc 文件中修改为对 应的值(具体在 69-72 行)。然后,仍然在该文件的上方(具体在 55-57 行),可以看到三个灯被创建 为 ReverseGPIOC()组件,此处根据自己的板子上 LED 灯的情况更改:如果 LED 灯为高电平亮、低电 平灭,即 1 亮 0 灭,则此处不需要更改;如果 LED 灯为低电平亮、高电平灭,即 0 亮 1 灭,此处将三 个灯的 ReverseGPIOC()都更改为 CC2530GpioC()即可(此处区分大小写!),如下图:

 

3、 编辑 root 节点的 Makefile 文件,修改如下内容:

 

 

 

 

4、 编译程序 执行 make cc2530zn,编译成功,如图:

 

 

 

 

项目目录/build/cc2530zn 目录下生成应用程序对应的可执行文件 app.hex,通过 make cc2530zn install 一键烧录。如下图:

 

 

 

 

 

5、 重复3-4,编写node节点

编写makefile文件:

 

 

 

 

编译:

 

 

 

 

烧录:

 

 

 

 

6.观察现象:两个节点的led0都每隔2s左右同时闪烁亮灭。

 

 

 

 

 

【实验现象】

Sniffer抓包:

 

 

 

 

 

 

 

 

 

通过 root 节点和电脑相连进行串口数据接收,如图:

 

 

 

 

 

【思考、测试、回答】

  1. CTP 是什么,简要回答原理;

答:CTP 是基于树的汇聚协议。通过将网络中的一些节点设为根节点,其它节点根据路由梯度形成到根节点的路由,从而形成到根节点的汇聚树网络。节点并不是向固定的根节点发送数据包,而是通过选择父节点作为下一跳隐式地选择根节点。CTP 提供了到根节点的尽力的多跳的数据传输,它具有保证传输可靠性的路由选择机制。此外,CTP 检查包重复,抑制重复传输和路由循环。

 

  1. LED 什么情况下点亮和熄灭?

答:在node 节点每次发送数据后,root 节点每收到一次数据 LED闪烁一次。

 

  1. 尝试改变 LED 闪烁的频率。

答:改变节点发送信息的频率即可实现LED闪烁频率的改变。改变如下:

 

 

 

 

本来设置2000ms,将其改成想要的时间即可。

 

  1. AM_BLINKTORADIO 是什么意思?

答:AM_BLINKTORADIO相当于一个指定发送到radio的端口。

 

  1. 尝试将 Node 节点的芯片温度传给 root,再串口传给 PC。

答:

先按照指导书把tinyos-2.x/tos/chips/cc2530/adc/AdcP.nc 文件进行更改,在不同文件夹添加下面代码。最主要的是给node里添加读取adc和将adc数值发送给root的代码,而在root中则需添加接收node发送的adc数值。

部分代码修改截图如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最终实验截图:

Sniffer抓包:

 

 

 

 

 

串口输出:

 

 

 

 

 

 

 

【实验总结】

通过这次实验,了解了CTP的工作原理,学习了链路估计、路由引擎和转发引擎,当然前面的实验也较为简单,照着指导书做就行,但是思考题还是有点难度,不去仔细了解代码就难以搞懂。当然在这过程中也或多或少碰到了一些问题,比如说忘记添加Adc的头文件,导致报错,再比如void enable()选错了,导致得到几千度的温度等等。但总体来说还是完成了,也加深了我对这次实验的了解。

 

posted @ 2022-12-06 19:51  安良  阅读(755)  评论(0编辑  收藏  举报