查看: 9439|回复: 7

ZigBee(Z-Stcak)常用API函数实际使用代码

[复制链接]
langchaojian 发表于 2013-3-12 14:33:02 | 显示全部楼层 |阅读模式
大家好!Z-Stcak协议栈中有大量的API函数,用起来非常方便可能有些朋友不太会用,在此送上实际使用时的程序代码,希望能对大家有所帮助。(我是采用串口指令的形式调用这些常用API函数的)
进程注册和串口初始化程序:
  1. // Register the endpoint description with the AF
  2.     afRegister( &ZG_Serial_Control_epDesc );
  3.    
  4.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, End_Device_Bind_rsp );
  5.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, Match_Desc_rsp );
  6.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, Bind_rsp );
  7.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, Unbind_rsp );
  8.    
  9.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, IEEE_addr_rsp );
  10.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, NWK_addr_rsp );
  11.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, Node_Desc_rsp );
  12.     ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, Device_annce );
  13.    
  14.     //Config UART0,38400-8-n-1   //lang
  15.     uartConfig.configured           = TRUE;             // 2x30 don't care - see uart driver.
  16.     uartConfig.baudRate             = HAL_UART_BR_38400;
  17.     uartConfig.flowControl          = FALSE;
  18.     uartConfig.flowControlThreshold = 64;               // 2x30 don't care - see uart driver.
  19.     uartConfig.rx.maxBufSize        = 128;              // 2x30 don't care - see uart driver.
  20.     uartConfig.tx.maxBufSize        = 128;              // 2x30 don't care - see uart driver.
  21.     uartConfig.idleTimeout          = 6;                // 2x30 don't care - see uart driver.
  22.     uartConfig.intEnable            = TRUE;             // 2x30 don't care - see uart driver.
  23.     uartConfig.callBackFunc         = SerialApp_CallBack;
  24.     HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
复制代码
串口回调函数:
  1. /*********************************************************************
  2. * @fn      void SerialApp_CallBack(uint8 port, uint8 event)
  3. *
  4. * @brief   Process response messages
  5. *
  6. * @param   none
  7. *
  8. * @return  none
  9. */
  10. static void SerialApp_CallBack(uint8 port, uint8 event)
  11. {
  12. #ifndef ZG_ENDDEVICE
  13.     rtgItem_t *rtTable;
  14.     byte rtnum;
  15.     uint8 *pRtBuf = NULL;
  16. #endif
  17. #ifndef ZG_COORDINATOR
  18.     neighborLqiItem_t *NeighborTable;
  19.     byte Neighnum;
  20.     uint8 *pNeighBuf = NULL;
  21.     uint8 My_CoordExtAddr[8];
  22.     uint16 My_CoordShortAddr;
  23. #endif
  24.     zAddrType_t destAddr, devAddr, BindAddr;
  25.     BindingEntry_t *pBindingTable;
  26.     uint16 ZG_Serial_Control_ClusterList[ZG_Serial_Control_MAX_CLUSTERS]={ZG_Serial_Control_CLUSTERID};
  27.     uint8 index;
  28.    
  29.     uint8 Bind_SourceAddr[8];
  30.     uint8 Uart_buf[20];
  31.     uint8 My_ExtAddr[8];
  32.     uint16 My_ShortAddr;
  33.     uint16 Dest_ShortAddr;
  34.    
  35.     if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&
  36. #if SERIAL_APP_LOOPBACK
  37.         (SerialApp_TxLen < SERIAL_APP_TX_MAX))
  38. #else
  39.         !SerialApp_TxLen)
  40. #endif
  41.     {
  42.         SerialApp_TxLen=HalUARTRead(HAL_UART_PORT_0,Uart_buf,20);
  43.         if(SerialApp_TxLen)
  44.         {
  45.             HalUARTWrite(HAL_UART_PORT_0,Uart_buf,SerialApp_TxLen);
  46.             SerialApp_TxLen=0;
  47.             switch(Uart_buf[0])
  48.             {
  49.               case 0x11:        //返回设备IEEE地址
  50.                 osal_cpyExtAddr( My_ExtAddr, (NLME_GetExtAddr()));
  51.                 HalUARTWrite(HAL_UART_PORT_0,My_ExtAddr,8);
  52.                 break;
  53.               case 0x22:        //返回设备16位网络地址
  54.                 My_ShortAddr=NLME_GetShortAddr();
  55.                 HalUARTWrite(HAL_UART_PORT_0,(uint8*)&My_ShortAddr,1);
  56.                 HalUARTWrite(HAL_UART_PORT_0,((uint8*)&My_ShortAddr+1),1);
  57.                 break;
  58.             #ifndef ZG_COORDINATOR
  59.               case 0x33:        //返回设备父节点IEEE地址
  60.                 NLME_GetCoordExtAddr(My_CoordExtAddr);
  61.                 HalUARTWrite(HAL_UART_PORT_0,My_CoordExtAddr,8);
  62.                 break;
  63.               case 0x44:        //返回设备父节点网络地址
  64.                 My_CoordShortAddr=NLME_GetCoordShortAddr();
  65.                 HalUARTWrite(HAL_UART_PORT_0,(uint8*)&My_CoordShortAddr,1);
  66.                 HalUARTWrite(HAL_UART_PORT_0,((uint8*)&My_CoordShortAddr+1),1);
  67.                 break;
  68.             #endif
  69.               case 0x55:        //通过16位网络地址查询设备的IEEE地址,输入网络地址为小端存储方式
  70.                 Dest_ShortAddr=BUILD_UINT16( Uart_buf[1], Uart_buf[2] );
  71.                 ZDP_IEEEAddrReq(Dest_ShortAddr,ZDP_ADDR_REQTYPE_SINGLE,0,0);                              
  72.                 break;
  73.               case 0x66:        //通过64位IEEE地址查询设备的网络地址,输入IEEE地址为小端存储方式
  74.                 osal_cpyExtAddr( My_ExtAddr, &Uart_buf[1]);
  75.                 ZDP_NwkAddrReq(My_ExtAddr,ZDP_ADDR_REQTYPE_SINGLE,0,0);                              
  76.                 break;
  77.             #ifndef ZG_ENDDEVICE
  78.               case 0x77:        //返回设备的路由表
  79.                 NLME_GetRequest(nwkNumRoutingTableEntries,0,&rtnum);
  80.                 pRtBuf =osal_mem_alloc((short)rtnum* sizeof(rtgItem_t));
  81.                 if(pRtBuf!=NULL)
  82.                 {
  83.                     rtTable = (rtgItem_t *)pRtBuf;
  84.                     for(index=0;index<rtnum;index++)
  85.                     {
  86.                         NLME_GetRequest(nwkRoutingTable,index,(void *)rtTable);
  87.                         HalUARTWrite(HAL_UART_PORT_0,(uint8 *)rtTable,4);
  88.                         rtTable++;
  89.                     }
  90.                 }
  91.                 break;
  92.             #endif
  93.             #ifndef ZG_COORDINATOR
  94.               case 0x88:        //返回设备的邻居表
  95.                 NLME_GetRequest(nwkNumNeighborTableEntries,0,&Neighnum);
  96.                 pNeighBuf =osal_mem_alloc((short)Neighnum* sizeof(neighborLqiItem_t));
  97.                 if(pNeighBuf!=NULL)
  98.                 {
  99.                     NeighborTable = (neighborLqiItem_t *)pNeighBuf;
  100.                     for(index=0;index<Neighnum;index++)
  101.                     {
  102.                         NLME_GetRequest(nwkNeighborTable,index,(void *)NeighborTable);
  103.                         HalUARTWrite(HAL_UART_PORT_0,(uint8 *)NeighborTable,10);
  104.                         NeighborTable++;
  105.                     }
  106.                 }
  107.                 break;
  108.             #endif
  109.               case 0x99:        //请求网络设备的设备描述符,节点逻辑类型。000:协调器;001:路由器;010:终端设备
  110.                 destAddr.addrMode = Addr16Bit;
  111.                 destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] );
  112.                 Dest_ShortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] );
  113.                 ZDP_NodeDescReq( &destAddr, Dest_ShortAddr, 0 );
  114.                 break;
  115.               case 0xAA:        //由第三方设备对另外两个设备进行绑定
  116.                 HalLedSet( HAL_LED_2, HAL_LED_MODE_ON );
  117.                 destAddr.addrMode = Addr16Bit;
  118.                 destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标设备网络地址
  119.                 osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
  120.                
  121.                 devAddr.addrMode = Addr64Bit;
  122.                 osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
  123.                
  124.                 ZDP_BindReq( &destAddr,
  125.                              Bind_SourceAddr,
  126.                              ZG_Serial_Control_ENDPOINT,
  127.                              ZG_Serial_Control_CLUSTERID,
  128.                              &devAddr,
  129.                              ZG_Serial_Control_ENDPOINT,
  130.                              0 );               
  131.                 break;
  132.               case 0xBB:        //由第三方设备对另外两个设备进行解绑定
  133.                 HalLedSet( HAL_LED_2, HAL_LED_MODE_ON );
  134.                 destAddr.addrMode = Addr16Bit;
  135.                 destAddr.addr.shortAddr = BUILD_UINT16( Uart_buf[1], Uart_buf[2] ); //目标设备网络地址
  136.                 osal_cpyExtAddr(Bind_SourceAddr,&Uart_buf[3]);
  137.                
  138.                 devAddr.addrMode = Addr64Bit;
  139.                 osal_cpyExtAddr( devAddr.addr.extAddr, &Uart_buf[11] );
  140.                
  141.                 ZDP_UnbindReq( &destAddr,
  142.                                Bind_SourceAddr,
  143.                                ZG_Serial_Control_ENDPOINT,
  144.                                ZG_Serial_Control_CLUSTERID,
  145.                                &devAddr,
  146.                                ZG_Serial_Control_ENDPOINT,
  147.                                0 );
  148.                 break;
  149.               case 0xCC:        //初始化绑定表
  150.                 InitBindingTable();
  151.               case 0xDD:        //在绑定表中添加一条绑定,但目前只能绑定其父节点
  152.                 BindAddr.addrMode = Addr64Bit;
  153.                 osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
  154.                 bindAddEntry(ZG_Serial_Control_ENDPOINT,
  155.                              &BindAddr,
  156.                              ZG_Serial_Control_ENDPOINT,
  157.                              ZG_Serial_Control_MAX_CLUSTERS,
  158.                              ZG_Serial_Control_ClusterList);
  159.                              
  160.                              
  161.                 break;
  162.               case 0xEE:        //在绑定表中删除一条绑定
  163.                 BindAddr.addrMode = Addr64Bit;
  164.                 osal_cpyExtAddr( BindAddr.addr.extAddr, &Uart_buf[1] );
  165.                 pBindingTable = bindFindExisting( ZG_Serial_Control_ENDPOINT,
  166.                                                   &BindAddr,
  167.                                                   ZG_Serial_Control_ENDPOINT );
  168.                
  169.                 bindRemoveEntry( pBindingTable );
  170.                 break;
  171.               default:
  172.                 break;
  173.             }               
  174.         }           
  175.     }   
  176. }
复制代码
进程回调处理函数:
  1. /*********************************************************************
  2. * @fn      ZG_Serial_Control_ProcessZDOMsgs()
  3. *
  4. * @brief   Process response messages
  5. *
  6. * @param   none
  7. *
  8. * @return  none
  9. */
  10. static void ZG_Serial_Control_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
  11. {
  12.   ZDO_NwkIEEEAddrResp_t *pAddrRsp;//网络地址、IEEE地址结构体声明

  13.   static uint16 NWKAddr_rsp;
  14.   static uint8 LogicalType_rsp;  
  15.   
  16.   switch ( inMsg->clusterID )
  17.   {
  18.     case End_Device_Bind_rsp:
  19.       if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
  20.       {
  21.         HalLedSet ( HAL_LED_2, HAL_LED_MODE_OFF );
  22.       }
  23.       break;
  24.     case Match_Desc_rsp:
  25.       {  
  26.         ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
  27.         if ( pRsp )
  28.         {
  29.           if ( pRsp->status == ZSuccess && pRsp->cnt )
  30.           {
  31.             ZG_Serial_Control_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  32.             ZG_Serial_Control_DstAddr.addr.shortAddr = pRsp->nwkAddr;
  33.             // Take the first endpoint, Can be changed to search through endpoints
  34.             ZG_Serial_Control_DstAddr.endPoint = pRsp->epList[0];

  35.             // Light LED
  36.             HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );
  37.           }
  38.           osal_mem_free( pRsp );
  39.         }
  40.       }
  41.       break;
  42. #ifdef ZG_COORDINATOR      
  43.     case Device_annce:  //设备入网声明回调函数
  44.       ZDO_ParseDeviceAnnce( inMsg, pDeviceAnnce );
  45.       
  46.       LCD_New_EndDevice[9]=Character_transfor(((pDeviceAnnce->nwkAddr>>12)&0x000F));
  47.       LCD_New_EndDevice[10]=Character_transfor(((pDeviceAnnce->nwkAddr>>8)&0x000F));
  48.       LCD_New_EndDevice[11]=Character_transfor(((pDeviceAnnce->nwkAddr>>4)&0x000F));
  49.       LCD_New_EndDevice[12]=Character_transfor((pDeviceAnnce->nwkAddr&0x000F));
  50.       
  51.       HalLcdWriteString( LCD_New_EndDevice, HAL_LCD_LINE_4 );
  52.       break;
  53. #endif
  54.     case Bind_rsp:
  55.       if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//绑定成功
  56.       HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );   
  57.       break;
  58.     case Unbind_rsp:
  59.       if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )//绑定成功
  60.       HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );   
  61.       break;
  62.     case IEEE_addr_rsp:     
  63.       pAddrRsp = ZDO_ParseAddrRsp( inMsg );//将接受到的数据解析输出到相应结构体中
  64.       if(pAddrRsp)
  65.       {
  66.         if( pAddrRsp->status == ZSuccess )
  67.         {
  68.             HalUARTWrite(HAL_UART_PORT_0,pAddrRsp->extAddr,8);//输出响应回来的IEEE地址            
  69.         }
  70.         osal_mem_free( pAddrRsp );//释放内存
  71.       }
  72.       break;
  73.     case NWK_addr_rsp:
  74.       pAddrRsp = ZDO_ParseAddrRsp( inMsg );//将接受到的数据解析输出到相应结构体中
  75.       if(pAddrRsp)
  76.       {
  77.         if( pAddrRsp->status == ZSuccess )
  78.         {
  79.             NWKAddr_rsp=pAddrRsp->nwkAddr;
  80.             HalUARTWrite(HAL_UART_PORT_0,(uint8*)&NWKAddr_rsp,1);//输出响应回来的网络地址
  81.             HalUARTWrite(HAL_UART_PORT_0,((uint8*)&NWKAddr_rsp+1),1);           
  82.         }
  83.         osal_mem_free( pAddrRsp );//释放内存
  84.       }
  85.       break;
  86.     case Node_Desc_rsp:
  87.       ZDO_ParseNodeDescRsp( inMsg, pNodeDescRsp);
  88.       LogicalType_rsp=pNodeDescRsp->nodeDesc.LogicalType;   //节点逻辑类型。000:协调器;001:路由器;010:终端设备
  89.       HalUARTWrite(HAL_UART_PORT_0,&LogicalType_rsp,1);     //输出响应回来的设备类型
  90.       break;
  91.     default:
  92.       break;     
  93.   }
  94. }
复制代码
pierce033 发表于 2013-4-15 21:16:29 | 显示全部楼层
懂了就容易了,不懂的话就一头雾水。
の米国への真 发表于 2013-5-16 21:57:54 | 显示全部楼层
楼主写的很好,学习了
welcomecyy 发表于 2013-6-6 15:29:08 | 显示全部楼层
楼主,帮大忙了,thank U
element14 发表于 2013-6-20 15:55:30 | 显示全部楼层
我就是那个刚入门的,看着看着实在是觉得太难了。
 楼主| langchaojian 发表于 2013-6-21 09:33:48 | 显示全部楼层
element14 发表于 2013-6-20 15:55
我就是那个刚入门的,看着看着实在是觉得太难了。

慢慢来就好
weilanxiao7 发表于 2013-11-4 17:07:17 | 显示全部楼层
谢谢楼主,就是想看看这些API在实例中该如何应用呢
nicole.088 发表于 2016-6-26 10:58:26 | 显示全部楼层
mark`mark`mark`mark`
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表