Zigbee重要数据结构解读之路由过程
时间:10-02
整理:3721RD
点击:
在路由过程中设计到路由表,路由搜索表(中文翻译过来不同版本有点差别),邻居节点表,RREQ,RREP、RERR。首先必须将这些最基本的东西弄清楚。 路由表:包含此条路由下一跳节点地址,路由状态,目的地址。 路由搜索表:在路由表建立过程中存在。
包含以下信息:Route request ID:发起路由请求的节点产生的序列号,越大则表示分组越新:
Source address:发起路由发现的节点的地址:
Sender address:将路由请求分组发送给此节点的节点的地址: Forward cost:发起路由发现的节点到此节点路径的开销,即路由请求分组中携带的开销;
Residual cost:此节点到目的节点的开销,即路由应答分组中携带的开销;
Expiration time:路由建立过程的有效时间。
邻居表: ZigBee网络中的每个节点都保存一张邻居节点列表,用来存储此节点传输范围内其它节点的信息。
neighborEntry_t neighborTable[MAX_NEIGHBOR_ENTRIES];
#if !defined ( MAX_NEIGHBOR_ENTRIES )
#if ( ZG_BUILD_RTR_TYPE )
#define MAX_NEIGHBOR_ENTRIES 16
#else
#define MAX_NEIGHBOR_ENTRIES 4
#endif
#endif
全功能设备16个,精简功能设备4个邻居节点表
// Neighbor table entry
typedef struct
{
uint16 neighborAddress;
uint8 neighborExtAddr[Z_EXTADDR_LEN];
uint16 panId;
uint8 age; // number of nwkLinkStatusPeriod since last link status
linkInfo_t linkInfo;
} neighborEntry_t;
PANId:邻节点PAN标识符; Extended address:邻节点的64-bit IEEE扩展地址,邻节点与本节点存在父子关系时记录此条信息;
Network address:邻节点16一bit网络地址; Device type:邻节点类型(0x00=ZigBee协调点,0x01=ZigBee路由节点,0x02= ZigBee终端节点);
Relationship:邻节点与当前节点的关系(0x00=父节点,OxOI=子节点,0x02=其 它)。
节点交互的分组:
ZigBee网络层的控制分组包括路由请求(RREQ,Route Request)分组,路由应答(RREP,Route Reply)分组和路由出错(RERR,Route Error)。 RREQ分组:
ZigBee网络中具有路由功能的节点可以向周围邻节点广播一个RREQ分组,目的是
为了找到一条通往它希望到达的目的节点的有效路径。 具体内容如下:
Command frame identifier:指出此控制分组的类型(0x01=RREQ,0x02=RREP,0x03
=RERR):
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);
Command options:指出此路由请求分组是否是在路由修复过程中产生的; Route request ID:发起路由请求的节点产生的序列号,越大则表示分组越新; Destination address:发起路由请求的节点希望建立的路径的目的地址; Path cost:指从P.REQ的发起节点到当前接收RREQ的节点的路径开销。 RREP分组:
RREQ分组希望到达的目的节点收到RREQ后向RREQ分组的发起节点回复一个 RREP分组。 具体内容如下:
Command frame identifier:指出此控制分组的类型(0x01=RREQ,0x02=I砒P,0x03
=RERR):
Command options:指出此路由应答分组是否是在路由修复过程中产生的: Route request ID:此分组所应答的路由请求分组的路由请求标识符; Originator address:发起路由请求的节点的网络地址; Responderaddress:该条路由的目的节点地址,即响应RREQ的节点的网络地址: Pathcost:从发起RREP的节点到当前接收RREP的节点的路径开销。 RERR分组:
当节点转发数据分组失败时将产生一个RERR分组,目的是为了通知此数据分组的源节点分组转发失败。
Command frame identifier:指出此控制分组的类型(Ox01=RREQ,0x02=RKEP,0x03
=RERR);
Error code:指出路由出错的原因:
Destination address:指被转发失败的数据分组的目的地址。
下面是我根据以上基础知识自己对路由建立过程的理解:首先源节点通过广播发送RREQ分组,具有路由功能的节点收到此信息后,建立反响路由,并转发RREQ分组,并将源节点到此节点的路由开销添加到路由搜索表和RREQ中,知道目的节点收到此RREQ,实际中可能有多条路径到达目的节点,目的节点根据路由开销选择路由开销最少的反向路由,将RREP发送给源节点,中间几点收到RREP也要添加此节点到目的节点的路由开销到路由搜索表和RREP中,最终到达源节点。路由搜索表清楚,各个节点路由表建立。
既然有表,就有表中记录的添加、删除、查找、修改,容量达到最大值时的处理,初始化等操作
包含以下信息:Route request ID:发起路由请求的节点产生的序列号,越大则表示分组越新:
Source address:发起路由发现的节点的地址:
Sender address:将路由请求分组发送给此节点的节点的地址: Forward cost:发起路由发现的节点到此节点路径的开销,即路由请求分组中携带的开销;
Residual cost:此节点到目的节点的开销,即路由应答分组中携带的开销;
Expiration time:路由建立过程的有效时间。
邻居表: ZigBee网络中的每个节点都保存一张邻居节点列表,用来存储此节点传输范围内其它节点的信息。
neighborEntry_t neighborTable[MAX_NEIGHBOR_ENTRIES];
#if !defined ( MAX_NEIGHBOR_ENTRIES )
#if ( ZG_BUILD_RTR_TYPE )
#define MAX_NEIGHBOR_ENTRIES 16
#else
#define MAX_NEIGHBOR_ENTRIES 4
#endif
#endif
全功能设备16个,精简功能设备4个邻居节点表
// Neighbor table entry
typedef struct
{
uint16 neighborAddress;
uint8 neighborExtAddr[Z_EXTADDR_LEN];
uint16 panId;
uint8 age; // number of nwkLinkStatusPeriod since last link status
linkInfo_t linkInfo;
} neighborEntry_t;
PANId:邻节点PAN标识符; Extended address:邻节点的64-bit IEEE扩展地址,邻节点与本节点存在父子关系时记录此条信息;
Network address:邻节点16一bit网络地址; Device type:邻节点类型(0x00=ZigBee协调点,0x01=ZigBee路由节点,0x02= ZigBee终端节点);
Relationship:邻节点与当前节点的关系(0x00=父节点,OxOI=子节点,0x02=其 它)。
节点交互的分组:
ZigBee网络层的控制分组包括路由请求(RREQ,Route Request)分组,路由应答(RREP,Route Reply)分组和路由出错(RERR,Route Error)。 RREQ分组:
ZigBee网络中具有路由功能的节点可以向周围邻节点广播一个RREQ分组,目的是
为了找到一条通往它希望到达的目的节点的有效路径。 具体内容如下:
Command frame identifier:指出此控制分组的类型(0x01=RREQ,0x02=RREP,0x03
=RERR):
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);
Command options:指出此路由请求分组是否是在路由修复过程中产生的; Route request ID:发起路由请求的节点产生的序列号,越大则表示分组越新; Destination address:发起路由请求的节点希望建立的路径的目的地址; Path cost:指从P.REQ的发起节点到当前接收RREQ的节点的路径开销。 RREP分组:
RREQ分组希望到达的目的节点收到RREQ后向RREQ分组的发起节点回复一个 RREP分组。 具体内容如下:
Command frame identifier:指出此控制分组的类型(0x01=RREQ,0x02=I砒P,0x03
=RERR):
Command options:指出此路由应答分组是否是在路由修复过程中产生的: Route request ID:此分组所应答的路由请求分组的路由请求标识符; Originator address:发起路由请求的节点的网络地址; Responderaddress:该条路由的目的节点地址,即响应RREQ的节点的网络地址: Pathcost:从发起RREP的节点到当前接收RREP的节点的路径开销。 RERR分组:
当节点转发数据分组失败时将产生一个RERR分组,目的是为了通知此数据分组的源节点分组转发失败。
Command frame identifier:指出此控制分组的类型(Ox01=RREQ,0x02=RKEP,0x03
=RERR);
Error code:指出路由出错的原因:
Destination address:指被转发失败的数据分组的目的地址。
下面是我根据以上基础知识自己对路由建立过程的理解:首先源节点通过广播发送RREQ分组,具有路由功能的节点收到此信息后,建立反响路由,并转发RREQ分组,并将源节点到此节点的路由开销添加到路由搜索表和RREQ中,知道目的节点收到此RREQ,实际中可能有多条路径到达目的节点,目的节点根据路由开销选择路由开销最少的反向路由,将RREP发送给源节点,中间几点收到RREP也要添加此节点到目的节点的路由开销到路由搜索表和RREP中,最终到达源节点。路由搜索表清楚,各个节点路由表建立。
既然有表,就有表中记录的添加、删除、查找、修改,容量达到最大值时的处理,初始化等操作
我简单的做了个实验来分析路由表,和邻居表。拓扑图如下:1号节点的儿子节点是2号。2号节点的儿子节点是三号。节点左边的地址上面是父节点地址,下面是自己节点短地址。
3号节点有两个邻居表,请注意是两个,不是三个。分别是1号节点(0x0000),和4号节点(0x4DC5)。为什么没有它的父节点信息呢?现在还没有研究。
其路由表有1个,目的地址是协调器,下一跳是0x359A,即是2号节点。
2号节点有邻居表两个:分别是0x2E91和0x4DC5。这是它的两个孩子节点,可还是没有父节点。
路由表个数为0个。
1号节点邻居表有三个,分别是2 3 4号节点。路由表个数也是0
学习一下,赞赞攒攒攒赞赞赞赞赞