amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 4323|回复: 23

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

[复制链接]
发表于 2013-3-12 14:12:13 | 显示全部楼层 |阅读模式
大家好!在此送上第六篇分享。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. }
复制代码
 楼主| 发表于 2013-4-24 15:39:50 | 显示全部楼层
沐风野草 发表于 2013-4-24 15:17
好贴,请问有没有API的函数使用手册,不过这也很满足了,谢谢

有,给你传一个好了,呵呵~

ZigBee2007协议栈API函数使用说明.pdf

624.26 KB, 下载次数: 231

发表于 2013-3-12 15:11:38 | 显示全部楼层
沙发, 占位先,慢慢看~~~~~~~
发表于 2013-3-13 00:37:18 来自手机 | 显示全部楼层
顶,有时间k来看。
发表于 2013-4-6 13:58:02 | 显示全部楼层
楼主继续
发表于 2013-4-24 15:17:21 | 显示全部楼层
好贴,请问有没有API的函数使用手册,不过这也很满足了,谢谢
发表于 2013-5-4 21:43:39 | 显示全部楼层
谢谢了,收了!
发表于 2013-5-11 00:40:34 | 显示全部楼层
沐风野草 发表于 2013-4-24 15:17
好贴,请问有没有API的函数使用手册,不过这也很满足了,谢谢

谢谢大神
发表于 2013-5-11 11:33:58 | 显示全部楼层
你好,能不能帮忙指导一下我那个问题呢?谢谢啊!!
zigbee 串口透传实验加了定时函数后接收不到数据
发表于 2013-10-12 12:25:13 | 显示全部楼层
学习中
发表于 2013-11-21 20:21:34 | 显示全部楼层
大大减小开发量。。。
发表于 2013-12-23 09:33:43 | 显示全部楼层
zigbee
                     
发表于 2014-8-3 15:46:39 | 显示全部楼层
刚开始入门zigbee多谢大神提供 。
发表于 2014-8-3 16:29:30 | 显示全部楼层
谢谢楼主分享,最近啃下zigbee
发表于 2014-8-16 21:54:39 | 显示全部楼层
写的真不错。多谢楼主分享经验代码。
发表于 2014-8-17 11:41:48 | 显示全部楼层
X写得不错。。学习了
发表于 2014-8-18 10:42:59 | 显示全部楼层
请问有没有哪个公司的协议栈是开源的??
 楼主| 发表于 2014-8-18 23:28:13 | 显示全部楼层
buaadx4223 发表于 2014-8-18 10:42
请问有没有哪个公司的协议栈是开源的??

听说好像有一个,但是用的人很少,常用的基本就是TI的z-stack和飞思卡尔的xbee,都不是开源的
发表于 2014-8-21 18:10:57 | 显示全部楼层
本帖最后由 tanguicaicai 于 2014-8-21 18:39 编辑

uint8  My_ExtAddr[8]={0x00,0x12,0x4B,0x00,0x04,0xF8,0x2A,0x68,};

ZDO_RegisterForZDOMsg( ZG_Serial_Control_TaskID, NWK_addr_rsp );

调用了
ZDP_NwkAddrReq(My_ExtAddr,ZDP_ADDR_REQTYPE_SINGLE,0,0);

这个函数 为什么没有 响应用这个里
case ZDO_CB_MSG:
          GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
          break;
搞不明白
还希望LZ说说为什么
 楼主| 发表于 2014-8-22 11:06:20 | 显示全部楼层
tanguicaicai 发表于 2014-8-21 18:10
uint8  My_ExtAddr[8]={0x00,0x12,0x4B,0x00,0x04,0xF8,0x2A,0x68,};

ZDO_RegisterForZDOMsg( ZG_Serial_C ...

好久不写zigbee的代码了,我也实在记不清了呢,不好意思
发表于 2014-8-22 13:10:21 | 显示全部楼层
seewolf 发表于 2014-8-22 11:06
好久不写zigbee的代码了,我也实在记不清了呢,不好意思

没关系 !
发表于 2014-12-31 23:39:28 | 显示全部楼层
直接STC可用??
 楼主| 发表于 2015-1-2 21:15:21 | 显示全部楼层

没明白你什么意思?我这个帖子说的只是Z-Stcak协议栈内部的一些API函数的调用方法而已
发表于 2015-1-27 16:03:05 | 显示全部楼层
谢啦,下来看看!!
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-20 22:58

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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