Z-stack 之 打印路由表 和 邻居表

来源:互联网 发布:淘宝网的电话号码 编辑:程序博客网 时间:2024/04/29 12:30

邻居表和路由表在Z-stack已经定义,我们可以从网络属性库中利用z-stack提供的API来打印信息。

函数原型:(在NLMEDE.h中定义)

ZStatus_t NLME_GetRequest(ZNwkAttributes_t NIBAttribute,uint 16 index,void *Value);

参数描述: NIBAttribute-支持的属性:

nwkCapabilityInfo 网络容量

nwkNumNeighborTableEntries 邻居表数目

        nwkNeighborTable 邻居表

       nwkNumRoutingTableEntries 路由表数目

       nwkRoutingTable 路由表


Index-------用于表的索引

        Value-------指向包含属性值的内存位置的指针

      如果要使用此函数,首先要看看已编辑的文件中是不是包含了NLMEDE.h的头文件,没有请包含。


      初次使用API,感觉重要的是要把参数以及格式处理好。我使用的方法是在z-stack中搜索这个函数,发现在ZDO中使用过这个函数,就按照它的格式进行修改。代码如下:

      /*******************************************************************
      邻居表和路由表的读取
      ********************************************************************/


         uint8 capabilities;
         NLME_GetRequest(nwkCapabilityInfo, 0, &capabilities);


         
         byte ntnum=0;
         NLME_GetRequest(nwkNumNeighborTableEntries,0,&ntnum);
         byte index=0;
         neighborEntry_t* ntTable;
         uint8 *pNtBuf = NULL;
         pNtBuf =osal_mem_alloc((short)(ntnum*sizeof(neighborEntry_t)));
         if(pNtBuf!=NULL){
         ntTable = (neighborEntry_t *)pNtBuf;
         for(;index<ntnum;index++)
              {
                NLME_GetRequest(nwkNeighborTable,index,(void *)ntTable);
                ntTable++;
              }
         }
         
       /******************************************************************
         neighborEntry_t nt2;
        NLME_GetRequest(nwkNeighborTable,1,&nt2);
         *****************************************************************/


         byte rtnum;
         NLME_GetRequest(nwkNumRoutingTableEntries,0,&rtnum);
         uint8 *pRtBuf = NULL;
         rtgItem_t* rtTable;
         pRtBuf =osal_mem_alloc((short)rtnum* sizeof(rtgItem_t));
         if(pNtBuf!=NULL){
         rtTable = (rtgItem_t *)pRtBuf;
         for(index=0;index<rtnum;index++)
              {
                NLME_GetRequest(nwkRoutingTable,index,(void *)rtTable);
                rtTable++;
              }
         }
         /*****************************************************************
            rtgItem_t rt;
            NLME_GetRequest(nwkRoutingTable,0,&rt);
         ******************************************************************/
      /*******************************************************************
      邻居表和路由表的读取
      ********************************************************************/



其间遇到了许多问题,诸如一定要在路由器,协调器关联好后,再查看路由表和邻居表的信息,否则出现的信息一直很奇怪。


相邻表条目定义格式:

typedef struct

{

uint16 neighborAddress;        //相邻地址

uint16 panId;                        //所属的PAN网络ID

linkInfo_t linkInfo;           //连接信息(包括发送/接收和安全帧计数)

} neighborEntry_t;


linkInfo_t定义格式:

typedef struct
{
  uint8  txCounter;    // Counter of transmission success/failures
  uint8  txCost;       // Average of sending rssi values if link staus is enabled
                       // i.e. NWK_LINK_STATUS_PERIOD is defined as non zero
  uint8  rxLqi;        // average of received rssi values
                       // needs to be converted to link cost (1-7) before used
  uint8  inKeySeqNum;  // security key sequence number
  uint32 inFrmCntr;    // security frame counter..
  uint16 txFailure;    // higher values indicate more failures
} linkInfo_t;

路由表定义格式

 typedef struct

{

uint16 dstAddress;                 //目标地址

uint16 nextHopAddress;         //单跳地址

byte    expiryTime;               //有效时间

byte    status;                        //状态

} rtgEntry_t;


我简单的做了个实验来分析路由表,和邻居表。拓扑图如下:1号节点的儿子节点是2号。2号节点的儿子节点是三号。节点左边的地址上面是父节点地址,下面是自己节点短地址。


3号节点有两个邻居表,请注意是两个,不是三个。分别是1号节点(0x0000),和4号节点(0x4DC5)。为什么没有它的父节点信息呢?现在还没有研究。

其路由表有1个,目的地址是协调器,下一跳是0x359A,即是2号节点。


2号节点有邻居表两个:分别是0x2E91和0x4DC5。这是它的两个孩子节点,可还是没有父节点。

 路由表个数为0个。


1号节点邻居表有三个,分别是2 3 4号节点。路由表个数也是0;