2.3 链路选择
当系统布设完毕进入稳定状态后,Sink节点开始广播HELL0消息,其格式如图2所示。
该数据包共16个字节,其各字段含义如下:
NOP:用来标识采用何种协议,包括协议的名称代码、版本号等信息;
TID:HELLo消息的来源,因为系统中往往不止一个节点可直接向Sink发送数据;
NOT:该数据包被转发的次数,Sink节点广播此消息时该字段为O,每转发一次,该字段值加1,终节点发送时此字段值为1;
TRID:发出该数据包的节点ID;
EREM:发出该数据包的节点的当前剩余能量;
HELL0:消息内容;
HOT:发送该消息的节点“热度”;
0NM:用来标记每次建立路由,在一次建立路由过程中,消息编码固定,Sink节点移动位置或其他情况下需要重建路由时,修改该字段;
SP:用来填补该数据包的空余,该字段值为O。
当某个节点收到此消息后,完成下面动作:
(1)检测数据帧,检测步骤如下:
①查看数据包的消息代码字段,检查与上次接收到的协议编号是否相同(首次接收到判为不同);若相同转步骤③;否则转步骤②;
②清除邻居列表信息,重新建表;
③查看HELLO消息数据包的转发节点ID字段,若该节点已包括在后向邻居列表中,则丢弃该包;
④将转发节点ID添加到前向邻居列表。
(2)发送一个名为“COUNTERSIGN”的确认消息数据包,消息格式如图3所示:
该数据包共有16个字节,各字段含义如下:
NOP:与HELLO消息的相应字段相同;
TRID:产生并发送该消息的节点ID;
COUNTERSIGN:消息内容;
REIDL:该字段包含了需接收该消息的全部节点ID;
SP:与HELL0消息的相应字段相同。
(3)转发HELLO消息,其过程为:
①修改转发次数字段,给其值加1;
②将转发节点ID、“热度”、剩余能量替换为自己的相应值;
③发送HELLO消息。
(4)接收确认消息,修改其后向邻居表。
2.4 建立通信链路
当某个节点需要发送数据时,它在自己的前向邻居中选择一个节点作为接收点,其选择步骤如下:
(1)根据前向邻居表内各个邻居的“热度”,避开比较热的节点;
(2)启用功率管理算法计算最佳传输距离范围;
(3)在最佳传输距离范围内选择剩余能量最大的节点作为它的下一跳。
2.5 数据传输
传感器节点产生的数据包格式如图4所示,数据包中各字段含义如下:
NOP:与HELL0消息相同;
REID:接收该数据包的节点ID;
NOT:表示该数据包被发送的次数;源节点发送时该字段值为1;
TRID:发送该数据包的节点ID;
DATE:数据包的内容;
SP:补充数据包的空余,该字段值为0。
图4数据帧格式数据包转发过程如下:
(1)当某个节点接收到该数据包时,检测接收节点ID是否与自己ID一致,若不一致丢弃该包,再检测发送节点ID是否在自己的后向邻居列表中,若发送节点ID不在自己后向邻居列表中,则丢弃该包。否则接收该包并缓存。
(2)数据包被缓存后,该节点将该数据包的接收节点ID字段替换为它的下一跳ID,将发送节点ID字段修改为自己的ID,然后将数据包发送出去。