首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CC2530网络层协议设计思路(3)

CC2530网络层协议设计思路(3)

本贴讨论树状路由机制。
在前贴zigbee协议栈路由协议学习(3):Neighbor表中提到了Microchip的Zigbee Stack中判断一个网络地址是否本节点的下属节点的地址的方法有局限性。(TI和MSLWPAN的协议栈也是采用这种方法)
在该机制中,一个节点的网络地址以及其下属的节点所属的地址空间由PROFILE_nwkMaxChildren、PROFILE_nwkMaxDepth、PROFILE_nwkMaxRouters这些配置参数的决定。PROFILE_nwkMaxRouters指一个节点允许带多少个下属的路由节点,PROFILE_nwkMaxDepth指整个网络最多有多少层,PROFILE_nwkMaxChildren指一个节点允许带多少个子节点。
该机制中,当这三个配置参数确定后,地址空间的划分方式就确定了(一个路由节点的子节点的地址在哪个范围,它的第几个路由子节点的地址是多少,它的第几个终端子节点的地址是多少),并且每个路由节点的下属节点地址结构都是一样的。
路由器节点地址组成一个对称的m层n叉树, m=PROFILE_nwkMaxDepth(根节点是第0层), n=PROFILE_nwkMaxRouters。  把这棵树打平放,每个节点垂下k=PROFILE_nwkMaxChildren-PROFILE_nwkMaxRouters条须,连接终端子节点。
Cskip(d) 值表示第d层路由节点的路由子节点的地址空间大小,由上述三个参数决定。例如:
#define PROFILE_nwkMaxChildren              20
#define PROFILE_nwkMaxDepth                 5
#define PROFILE_nwkMaxRouters               6

则:
#define CSKIP_DEPTH_0                       0x143D   /*5181 */
#define CSKIP_DEPTH_1                       0x035D   /*861 */
#define CSKIP_DEPTH_2                       0x008D  /*141 */
#define CSKIP_DEPTH_3                       0x0015  /*21 */
#define CSKIP_DEPTH_4                       0x0001
#define CSKIP_DEPTH_5                       0x0000

则:
根节点地址为0000;
第1层(根节点下属)6个路由子节点的地址分别为{0x143D(5181),              0x287A(10362),        ...  0x796E(31086)},根节点下属的14个终端子节点地址为31087-31100。
根节点下的第1个路由子节点的地址为5181,它的下属6个路由子节点的地址为{861, 1722, 2583, 3444, 4305, 5166},它的下属14个终端子节点地址为5167-5180。
地址为861的路由节点的下属6个路由子节点的地址为{141, 282, 423, 564,705, 846},它的下属14个终端子节点地址为847-860。
地址为141的路由节点的下属6个路由子节点的地址为{21, 42, 63, 84, 105, 126},它的下属14个终端子节点地址为127-140。
地址为21的路由节点的下属6个路由子节点的地址为1-6,它的下属14个终端子节点地址为7-20。

该机制的优点是节点地址与路由树的位置对应关系是固定的。给出目的节点地址,根据3个参数即可判断目的节点地址是哪一层哪个路由节点或者是哪一层哪个路由节点下属的第几个终端子节点。
或者说,给出目的节点地址,就可以判断其是否在本节点管理范围,如果是,则判断是直属子节点还是归哪个路由子节点管理,然后将消息转发给它;如果不是,则将消息转发给父节点。
这个判断过程不需要用到路由表或者邻居表,实现简单,不占用内存空间。这个优点对于资源有限的WSN节点十分重要,尤其是数据量较大,转发时间要短的情形下。

其缺点,一是允许每个路由节点管理的路由子节点数目和终端子节点数目是固定的,与其所在的层数无关,与应用实际建立的拓扑无关。对地址空间造成浪费。
二是加入一个网络的所有节点的三个Profile参数值必须是一样的,否则会出问题。在Microchip、TI等公开的参考实现代码中,这几个值是定义在头文件中,运行时改变不了的。也就是说,入同一个网的路由节点的程序,在编译时使用的这几个参数的值必须是一样的。这对于Zigbee这种目的是兼容多家厂家的产品进行互操作的协议栈来说是不合适的。在实际使用中须让这几个参数成为变量,可以通过网络进行更改。

修改思路
1、要保留该机制的优点,就是简单、快。不查表,仅根据目的地址(网络层)能够判断是:a) 子节点或父节点;b) 转发给下属路由子节点;c) 转发给父节点。
这样的话,要求一个路由节点的所有下属节点(直接或间接)的地址在一个连续的地址空间之中。
或者退一步,允许下属节点的地址在少量几个连续的地址空间之内,这就存在一个地址空间表{{开始1,结束1};{开始2,结束2};...}。这个思路的目的是,当一个路由节点更换父节点时,可以不更换自己及子节点的地址。
2、一个路由节点的地址空间由根节点(或根节点背后的管理系统)分配。
这样的话,允许相同层次的不同路由节点的地址空间大小不一样;允许中间层次的路由节点和最低层次的路由节点的地址空间大小不一样。
但是这样的话,增加了控制消息的种类,增加了根节点的管理功能,增加了地址分配算法和地址调整算法的复杂度(包括影响了节点加入、退出、更换父节点的机制)。也会延长了节点加入的时延。
退一步,在一定范围内允许路由节点决定子节点的地址或地址空间。
返回列表