您的位置:首页 > 编程语言 > PHP开发

CTP源码分析2 CTP链路质量估计层结构及源码分析(一)----LEEP协议的LEEP帧

2016-08-10 12:36 691 查看
TinyOS使用的是nesC基于模块编程,总体的语法和C语言和相似。看总体结构图:

链路质量估计层做了什么

可以看到,根节点一些系统底层的发送接口,和接收接口,还有随机数接口。他使用这些接口,来实现自己的接口。链路质量估计层提供一系列接口供上层调用。主要是BeaconSend和BeaconReceive,当这两个接口和路由引擎的路由帧发送接收有关。因为路由引擎的路由帧是链路质量估计层LEEP帧的payload,所以每次进行发送的时候都要为路由帧加上LEEP帧的帧头和帧尾(header and footer),而这个帧头帧尾的添加以及发送工作就是由链路质量估计层完成的。此外当收到路由帧的时候,链路估计层只关注路由帧(对于链路估计层这个帧叫做LEEP帧)的LEEP帧头和帧尾,LEEP帧的帧头和帧尾包含了链路质量估计相关的信息,链路质量估计层要通过这个信息来更新链路质量。过程大概是这样的:



节点使用LEEP帧去估计并且和邻居节点交换有关连接质量的信息。

这就是链路质量层所属的位置,和他大概的工作,下面将会展开详细内容。

LEEP协议---LEEP帧

CTP通过广播LEEP帧来进行链路质量估计的工作。节点使用LEEP帧去估计并且和邻居节点交换有关连接质量的信息。在CTP中连接质量分为两种,出站质量和入站质量。我们先说如何获得入站质量。

以A、B两个节点为例,B会不断广播LEEP帧,LEEP帧中有一个序号,代表这是B发送的第几个LEEP帧,A中也存着一个一个序号,这个序号是上一次接收到B的LEEP帧的时候,LEEP帧所带的序号,这两个序号相减就可以算出没有收到的LEEP帧的个数。通过对应节点已收到的LEEP帧个数和没有收到的LEEP帧个数就可以计算出A对于B节点的入站链路质量。B的入站质量也是同理。

那么出站质量是如何计算的呢。首先A的入站质量就是B的出站质量,所以B想要获得出站质量,只要A告诉B A的入站质量就可以了。所以在LEEP帧的帧尾记录了A的链路质量估计表中所有的节点的入站链路质量,B看到A的LEEP帧中对应自己的入站质量也就知道了自己在BA这条链路上的出站质量,同理A也可以获得AB这条链路上的出站质量。这样子入站和出站都获得了,那么双向链路质量也就可以获得了。

LEEP帧的结构:



PayLoad实际上就是要放路由帧的地方。

LEEPHeader的结构:



nentry表达了一共有多少个Entry,Entry里面包含了广播接收方的出站链路质量信息(也就是LEEP帧发送节点的链路质量估计表的所有节点及其对应的入站质量)。seqno表达了当前LEEP帧的序号,rsrvd是保留字段全部设为0。

LEEP帧entry的结构:



包括了节点的名字和发送放对应这个节点的入站质量。因为是广播帧,只要接收到这个广播帧的节点遍历LEEP帧的所有Entry,一旦找到了自己的node id就可以获得自己和广播源头之间的这条链路上的出站质量,再结合已有的对应入站质量,就可以得出这条链路的单跳双向质量的。

在拓扑结构形成的初期,每个节点都可以通过这种方式获得和所有邻居的连接质量估计值。这些值都会保存在链路质量估计表中。

LEEP帧的广播并不是定时广播,它的发送时间间隔遵从Trickle算法,将在下一篇展开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息