按需路由协议
https://blog.csdn.net/u013300635/article/details/82842332
协调器只能存有限的路由表,当需要给不在路由表且不在邻居表的设备发送数据就需要在发送前进行路由发现,找到发送路径。
假设网络中有100个设备,理想情况下20个在邻居表(一跳范围内直接发送)、20个在路由表中,那么剩下的60个节点,协调器想要发送数据就必须在发送前发送route request帧进行route discovery。
首先协调器通过route request全网广播找路径,网络中节点在转发广播的时候临时维护一个路由发现表,记录下自己转的数据从哪来的,链路开销是多少,然后加入自己的链路开销转发出去!
这样全网广播,目标节点肯定是可以收到这个数据,并且这个数据还会收到多次,周围的七大姑八大姨一人给自己转发一次。
目的节点对比收到的数据看那个数据的链路开销是最小的,然后选择开销最小的链路进行单播回复route recored。是六姑给你的链路质量最好,目标节点就将回复单播给六姑,然后六姑根据路由发现表同样找链路质量最好的回复。如此一直回复到协调器。
这个回复的过程也是网络中的设备节点开始建立关于目标节点路由表的时候,设备中的路由发现表就随着路由表的建立而销毁。
这效率多低啊??真实有60个设备每次发送前都这样广播一遍单播一遍,而且还要保证这一来一回的路径发现不出现问题(基本不可能的)
link status是用来维护邻居表的,如果多次未收到对方的link status,会判定链路断开!用于移除僵尸节点的。
// Source routing table
typedef struct
{
uint8 expiryTime;
uint8 relayCount;
uint16 dstAddress;
uint16* relayList;
} rtgSrcEntry_t;
// Route discovery table entry
//路由发现表,该表仅在路由发现过程中存在,发现完成即可销毁
typedef struct
{
byte rreqId;
uint16 srcAddress;
uint16 previousNode;
byte forwardCost;
byte residualCost;
byte expiryTime;
} rtDiscEntry_t;
// Routing table entry
// Notice, if you change this structure, you must also change
// rtgItem_t in ZDProfile.h
//路由表
typedef struct
{
uint16 dstAddress;//目标地址
uint16 nextHopAddress;//到目标地址的下一跳
byte expiryTime;//超期时间,linkStatus维护
byte status;
uint8 options;
} rtgEntry_t;