星形网络和树型网络可以看成是网状网络的一个特殊子集,所以接下来分析如何组建一个 Zigbee 网状网络。
组建一个完整的 Zigbee 网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络。
加入网络又有两种方法,一种是子设备通过使用 MAC 层的连接进程加入网络,另一种是子设备通过与一个
先前指定的父设备直接加入网络。
一、 协调器初始化网络
协调器建立一个新网络的流程如图 1 所示。
1、 检测协调器
图 1 协调器建立一个新网络
建立一个新的网络是通过原语 NLME_NETWORK_FORMATION.request 发起的,但发起
NLME_NETWORK_FORMATION.request 原语的节点必须具备两个条件,一是这个节点具有 ZigBee 协调器
功能,二是这个节点没有加入到其它网络中。任何不满足这两个条件的节点发起建立一个新网络的进
程都会被网络层管理实体终止,网络层管理实体将通过参数值为 INVALID_REQUEST 的
NLME_NETWORK_FORMATION.confirm 的原语来通知上层这是一个非法请求。
2、 信道扫描
协调器发起建立一个新网络的进程后,网络层管理实体将请求 MAC 子层对信道进行扫描。信道扫描包
括能量扫描和主动扫描两个过程。首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描,
以排除干扰。网络层管理实体将根据信道能量测量值对信道进行一个递增排序,并且抛弃能量值超过
了可允许能量值的信道,保留可允许能量值内的信道等待进一步处理。接着在可允许能量值内的信道
执行主动扫描,网络层管理实体通过审查返回的 PAN 描述符列表,确定一个用于建立新网络的信道,
该信道中现有的网络数目是最少的,网络层管理实体将优先选择没有网络的信道。如果没有扫描到一
个合适的信道,进程将被终止,网络层管理实体通过参数仠为 STARTUP_FAILURE 的
NLME_NETWORK_FORMATION.confirm 的原语来通知上层初始化启动网络失败。
3、配置网络参数
如果扫描到一个合适的信道,网络层管理实体将为新网络选择一个 PAN 描述符,该 PAN 描述符可以是
由设备随机选择的,也可以是在 NLME_NETWORK_FORMATION.request 里指定的,但必须满足 PAN 描述符
小于或等于 0x3fff,不等于 0xffff,并且在所选信道内是唯一的 PAN 描述符,没有任何其它 PAN 描述
符与之是重复的。如果没有符合条件的 PAN 描述符可选择,进程将被终止,网络层管理实体通过参数
值为 STARTUP_FAILURE 的 NLME_NETWORK_FORMATION.confirm 的原语来通知上层初始化启动网络失败。
确定好 PAN 描述符后,网络层管理实体为协调器选择 16 位网络地址 0x0000,MAC 子层的 macPANID 参
数将被设置为 PAN 描述符的值,macShortAddress PIB 参数设置为协调器的网络地址。
4、运行新网络
网络参数配置好后,网络层管理实体通过 MLME_START.request 原语通知 MAC 层启动并运行新网络,
启动状态通过 MLME_START.confirm 原语通知网络层,网络层管理实体再通过
NLME_NETWORK_FORMATION.confirm 原语通知上层协调器初始化的状态。
5、允许设备加入网络
只有 ZigBee 协调器或路由器才能通过 NLME_PERMIT_JOINING.request 原语来设置节点处于允许设备
加入网络的状态。当发起这个进程时,如果 PermitDuration 参数值为 0x00,网络层管理实体将通过
MLME_SET.request 原语把 MAC 层的 macAssociationPermit PIB 属性设置为 FALSE,禁止节点处于允
许设备加入网络的状态;如果 PermitDuration 参数值介于 0x01 和 0xfe 之间,网络层管理实体将通
过 MLME_SET.request 原语把 macAssociationPermit PIB 属性设置为 TRUE,并开启一个定时器,定时
时间为 PermitDuration,在这段时间内节点处于允许设备加入网络的状态,定时时间结束,网络层管
理实体把 MAC 层的 macAssociationPermit PIB 属性设置为 FALSE;如果 PermitDuration 参数的值为
0xff,网络层管理实体将通过 MLME_SET.request 原语把 macAssociationPermit PIB 属性设置为 TRUE,
表示节点无限期处于允许设备加入网络的状态,除非有另外一个 NLME_PERMIT_JOINING.request 原语
被发出。允许设备加入网络的流程如图 2 所示。
通过以上流程协调器就建立了一个网络并处于允许设备加入网络的状态,然后等待其它节点加入网络。
图 2 允许设备加入网络
二、 节点加入网络
一个节点加入网络有两种方法,一种是通过使用 MAC 层关联进程加入网络,另一种是通过与先前指定
父节点连接而加入网络。
1) 通过 MAC 层关联加入网络
子节点请求通过 MAC 关联加入网络进程如图 3 所示。父节点响应通过 MAC 关联加入网络进程如图 2-6
所示。
1、 子节点发起信道扫描
子节点通过 NLME_NETWORK_DISCOVERY.request 原语发起加入网络的进程,网络层接收到这个原语后
通过发起 MLME_SCAN.request 原语请求 MAC 层执行一个主动扫描或被动扫描以接收包含了 PAN 标志符
的信标帧,扫描的信道以及每个信道的扫描时间分别由 NLME_NETWORK_DISCOVERY.request 原语的参
数 ScanChannels 和 ScanDuration 决定。
2、 子节点存储各 PAN 信息
MAC 层通过 MLME_BEACONNOTIFY.indication 原语将扫描中接收到的信标帧信息发送到网络层管理实
体,信标帧信息包括信标设备的地址、是否允许连接以及信标净载荷。如果信标净载荷域里的协议
ID 域与自己的协议 ID 相同,子设备就将每个匹配的信标帧相关信息保存在邻居表中。信道扫描完成
后,MAC 层通过 MLME_SCAN.confirm 原语通知网络层管理实体,网络层再通过
NLME_NETWORK_DISCOVERY.confirm 原语通知上层,该原语包含了每个扫描到的网络的描述符,以便
上层选择一个网络加入。
3、 子节点选择 PAN
如果上层需要发现更多网络,则可以重新执行网络发现,如果不需要,则通过 NLME_JOIN.request 原
语从被扫描到的网络中选择一个网络加入。参数 PANID 设置为被选择网络的 PAN 标识符。
4、 子节点选择父节点
一个合适的父节点需要满足三个条件:匹配的 PAN 标志符、链路成本最大为 3、允许连接,为了寻找
合适的父节点,NLME_JOIN.request 原语请求网络层搜索它的邻居表,如果邻居表中不存在这样的父
节点则通知上层,如果存在多个合适的父节点则选择具有最小深度的父节点,如果存在多个具有最小
深度的合适的父节点则随机选择一个父节点。
5、 子节点请求 MAC 关联
确定好合适的父节点后,网络层管理实体发送一个 MLME_ASSOCIATE.request 原语到 MAC 层,地址参
数设置为已选择的父节点的地址,尝试通过父节点加入网络。
6、 父节点响应 MAC 关联
父节点通过 MLME_ASSOCIATE.indication 原语通知网络层管理实体一个节点正尝试加入网络,网络层
管理实体将搜索它的邻居表查看是否有一个与尝试加入节点相匹配的 64 位扩展地址,以便确定该节
点是否已经存在于它的网络中了。如果有匹配的扩展地址,网络层管理实体获取相应的 16 位网络地
址并发送一个连接响应到 MAC 层。如果没有匹配的扩展地址,在父节点的地址分配空间还没耗尽的条
件下网络层管理实体将为尝试加入的节点分配一个 16 位网络地址。如果父节点地址分配空间耗尽,
将拒绝节点加入请求。当同意节点加入网络的请求后,父节点网络层管理实体将使用加入节点的信息
在邻居表中产生一个新的项,并通过 MLME_ASSOCIATE.request 原语通知 MAC 层连接成功。
7、 子节点响应连接成功
如果子节点接收到父节点发送的连接成功信息,发送一个传输成功响应信息以确认接收,然后子节点
MAC 层将通过 MLME_ASSOCIATE.confirm 原语通知网络层,原语包含了父节点为子节点分配的网内唯
一的 16 位网络地址,然后网络层管理实体设置邻居表相应邻居设备为它的父设备,并通过
NLME_JOIN.confirm 原语通知上层节点成功加入网络。
8、 父节点响应连接成功
父节点接收到子节点的传输成功响应信息后,将通过 MLME_COMM_STATUS.indication 原语将传输成功
的响应状态发送给网络层,网络层管理实体通过 NLME_JOIN.indication 原语通知上层一个节点已经
加入了网络。
图 3 子节点请求加入网络进程
2) 通过与先前指定父节点连接加入网络
图 4 父节点响应加入网络进程
子节点通过与指定的父节点直接连接加入网络,这个时候父节点预先配置了子节点的 64 位扩展地址。
父节点处理一个直接加入网络的进程如图 5 所示。子节点通过孤立方式加入网络进程如图 6 所示。
1、 父节点处理子设备直接加入网络
父节点通过 NLME_DIRECT_JOIN.request 原语开始处理一个设备直接加入网络的进程。父节点网络层
管理实体将首先搜索它的邻居表查看是否存在一个与子节点相匹配的 64 位扩展地址,以便确定该节
点是否已经存在于它的网络中了。如果存在匹配的扩展地址,网络层管理实体将终止这个进程并告诉
上层该设备已经存在于设备列表中了。如果不存在匹配的扩展地址,在父节点的地址分配空间还没耗
尽的条件下网络层管理实体将为子节点分配一个 16 位网络地址,并使用子节点的信息在邻居表中产
生一个新的项。然后通过 NLME_DIRECT_JOIN.confirm 原语上层设备已经加入网络。
2、 子节点连接父节点确认父子关系
子节点通过 NLME_JOIN.request 原语发起孤立扫描来建立它与父节点之间的关系。这时网络层管理实
体将通过 MLME_SCAN.request 请求 MAC 层对物理层所默认的所有信道进行孤立扫描,如果扫描到父设
备,MAC 层通过 MLME_SCAN.confirm 原语通知网络层,网络层管理实体再通过 NLME_JOIN.confirm 原
语通知上层节点请求加入成功,即与父节点建立了父子关系,可以互相通信。
图 5 父节点处理一个直接加入网络进程
*******************************************************************
图 6 子节点通过孤立方式加入网络进程