首页->【ZigBee技术】

38 0

    在ZigBee网络中,要对网络进行一定的维护,比如要知道哪些设备工作正常,哪些设备故障,每个设备的大致位置,和其它设备的关系等;也可能需要对网络进行一些调整,比如添加一些设备,或减少一些设备。这样都需要清楚的知道整个网络中有哪些设备,网络的拓扑结构,模糊的来说也就是设备信息。

一、通过查看例程和实验大致已找到两种方法来获取网络中的设备信息。

      A:利用AssociatedDevList

      通过每个设备的AssociatedDevList(关联表)中的信息来统计整个网络中的设备信息。在关联表中有设备的短地址、设备类型及和本设备的关系等信息。这需要整个网络中有自己的一个协议来对每个设备进行协调。

      过程如下:

      1、每个设备都可以广播一个命令(搜集设备信息)

      2、收到广播信息的设备,将按照协议中的数据格式,向原始的广播设备回送和本设备有关的信息。

      3、收到回送信息后,组合为整个网络中的设备信息。

 

      B:利用NWK_addr_req或IEEE_addr_req命令

      NWK_addr_req或IEEE_addr_req命令中如果使用的ZDP_ADDR_REQTYPE_EXTENDED参数,那么在返回信息中会有一个目标设备相关的设备短地址列表,但没有设备类型和关系。有了短地址,可以通过Node_Desc_req命令来获取设备类型,但怎样获取远程设备的设备关联目前没有找到方法。在本设备可以通过NLME_GetCoordShortAddr或NLME_GetCoordExtAddr来获取本地设备的父设备地址,这样也需要有自己的协议才能完全解决。

      ZDP_NwkAddrReq

 

一、网络中的设备信息

      AssociatedDevList表为与此设备相关联的设备表,并不是ZigBee网络中的所有设备信息表。表中信息的IEEE地址是唯一的,每个设备加入它的父节点时会在表中添加一个记录,但是子节点断电离开网络时不会删除该条记录,如果有多个子节点,频繁更换父节点会造成AssociatedDevList表满或溢出,使其它子节点无法加入该父节点,因此需要及时的删除一些已离开的子节点记录。

      重点在于怎样判断那此节点已离开,设想声明一个和AssociatedDevListge同样宽度的表来存储在一定时间内接收到子节点的数据量。如果一定时间内没有接收到子节点的数据认为是已离开网络。

二、如果路由器的父节点丢失是否会自动进行孤点扫描,而加入潜在的父节点?

      实验当路由器的父节点离开时,路由器不会触发任何事件,因此也不会发现自己成为孤点,并进行孤点扫描,只能通过程来进行控制,在检测到自己成为孤点时进行网络扫描,查找其它父节点。

      设想协调哭定时给所有路由器广播信息,如果路由器在一定时间没有收到协调器的广播信息则从新扫描网络,或路由器在发给其父级节点(协调器、路由器)的信息没有得到确认则也重新扫描网络。

三、协调器意外重启后加入原有的网络(相同的PANID)?

      在网上查找到如下信息:

      关联实际上是就是获得动态分配的短地址并且建立相互之间的邻居关系,那我在网络拓扑关系确定,都关联成功之后,将每个模块的信道、短地址、PanID、邻居表这些信息,保存进Flash,并设置一个开关!那么模块重启后,检查开关状态为开,则从flash中取出相应的信息,加载到Ram中相应的地方,其中信道、短地址、panID这些信息可能要设置进RF芯片。这样模块完全恢复为关联后的状态,根本不需要重新关联!而COORD和Router只有还有容量,还可以再允许别的模块加入,只要加入后再将那些信息再保存就行了!

      我理解为只要将上述中的开关打开,那么协调器重启后将自动加入原有网络,而不会建立新的网络,经过实验发现,确实是直接加入原有网络,具体过程还没有细查。

 

      关联表中元素的结构

      typedef struct

      {

        UINT16 shortAddr;                 // 关联设备的短地址

        uint16 addrIdx;                     // 地址管理时的索引

        byte nodeRelation;                // 关联设备和本设备的关系描述

        byte devStatus;                    // bitmap of various status values

        byte assocCnt;                     // 联接次数,相同IEEE地址连接时会加1

        linkInfo_t linkInfo;

      } associated_devices_t;

 

      devStatus可以设置为以下的值

      #define DEV_LINK_STATUS                 0x01 // link is in-active ?           活动联接

      #define DEV_LINK_REPAIR                 0x02 // link repair in progress ?  正在修复联接

      #define DEV_SEC_INIT_STATUS          0x04 // security init                   初后的安全

      #define DEV_SEC_AUTH_STATUS         0x08 // security authenticated    验证过的安全

 

      nodeRelation可以设置为以下的值

      // Node Relations

      #define PARENT                         0      //父节点 一般指协调器

      #define CHILD_RFD                    1      //简功能节点 一般指终端

      #define CHILD_RFD_RX_IDLE       2      //简功能节点(空闭进RF接收开启)一般指终端

      #define CHILD_FFD                    3      //全功能节点 一般指路由器

      #define CHILD_FFD_RX_IDLE       4      //全功能节点(空闭进RF接收开启)一般指路由器

      #define NEIGHBOR                     5      //邻居设备

      #define OTHER                          6      //其它设备

      #define NOTUSED                      0xFF  //没有使用

 

      typedef struct

      {

        uint8  txCost;                         // counter of transmission success/failures  传输成功或失败的次数

        uint8  rxCost;                         // average of received rssi values               接收rssi的平均值

        uint8  inKeySeqNum;               // security key sequence number                安全密钥序列号

        uint32 inFrmCntr;                    // security frame counter..                         安全帧计数

      } linkInfo_t;


楼主可见