Zigbee cc2530 如何捕获新节点加入网络的事件

当有新节点加入到网络时会发送device announce包,请问我在哪个方法里可以获得这个包,并解析它的地址信息?

是应用层的uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) 方法的 AF_INCOMING_MSG_CMD事件中吗?

 

首先需要在你的应用层初始化的时候注册,对device announce的处理函数

// register for end device annce and simple descriptor responses
ZDO_RegisterForZDOMsg( ******, Device_annce );

然后在应用层的 uint16 XXXXX_ProcessEvent( uint8 task_id, uint16 events )函数中case ZDO_CB_MSG:下的XXXXX_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );函数中去处理就可以了,只要在里面加上case Device_annce就可以了。

具体你可以参考下Z-stack-2.5.1a下的Esp.c应用程序,这个工程下有相关device anounce的使用方法。

本人的实例为:

void ZDO_ProcessDeviceAnnce( zdoIncomingMsg_t *inMsg )函数下进入  ZDO_ParseDeviceAnnce( inMsg, &Annce );

至于第一个函数在ZDO消息处理表列中定义了  { Device_annce,           ZDO_ProcessDeviceAnnce }

ZDO_ParseDeviceAnnce( inMsg, &Annce );中显示新加入的节点信息,inMsg->asdu 中第一二个字节是新节点的网络地址,第3个开始的8个字节是新节点的长地址。

首先初始化:

/*********************************************************************
 * @fn      SerialApp_Init
 *
 * @brief   This is called during OSAL tasks' initialization.
 *
 * @param   task_id - the Task ID assigned by OSAL.
 *
 * @return  none
 */
void SerialApp_Init( uint8 task_id )
{
  halUARTCfg_t uartConfig;

  SerialApp_TaskID = task_id;

  afRegister( (endPointDesc_t *)&SerialApp_epDesc );

  RegisterForKeys( task_id );

  uartConfig.configured           = TRUE;              // 2x30 don't care - see uart driver.
  uartConfig.baudRate             = SERIAL_APP_BAUD;
  uartConfig.flowControl          = FALSE;
  uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
  uartConfig.rx.maxBufSize        = SERIAL_APP_RX_SZ;  // 2x30 don't care - see uart driver.
  uartConfig.tx.maxBufSize        = SERIAL_APP_TX_SZ;  // 2x30 don't care - see uart driver.
  uartConfig.idleTimeout          = SERIAL_APP_IDLE;   // 2x30 don't care - see uart driver.
  uartConfig.intEnable            = TRUE;              // 2x30 don't care - see uart driver.
  uartConfig.callBackFunc         = SerialApp_CallBack;
  HalUARTOpen (SERIAL_APP_PORT, &uartConfig);

#if defined ( LCD_SUPPORTED )
  HalLcdWriteString( "SerialApp", HAL_LCD_LINE_2 );
#endif

  ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
  ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
  ZDO_RegisterForZDOMsg( SerialApp_TaskID, Device_annce  );//应用层初始化的时候注册,对device announce的处理函数
}

 ZDO_ProcessDeviceAnnce函数中存储下需要的信息:

/*********************************************************************
 * @fn          ZDO_ParseDeviceAnnce
 *
 * @brief       Parse a Device Announce message.
 *
 * @param       inMsg - Incoming message
 * @param       pAnnce - place to put the parsed information
 *
 * @return      none
 */
void ZDO_ParseDeviceAnnce( zdoIncomingMsg_t *inMsg, ZDO_DeviceAnnce_t *pAnnce )
{
  uint8 *msg;
  // 显示新加入的节点信息,inMsg->asdu 中第一二个字节是新节点的网络地址,第3个开始的8个字节是新节点的长地址。

  // Parse incoming message
  msg = inMsg->asdu;
  pAnnce->nwkAddr = BUILD_UINT16( msg[0], msg[1] );
  Zigbee_End_buf = pAnnce->nwkAddr;
  if( Zigbee_End_old != Zigbee_End_buf)
  {
    for(Zigbee_End_cont=0 ; Zigbee_End_cont < Zigbee_END_SUM;Zigbee_End_cont++)
    {
      if(Zigbee_End[Zigbee_End_cont] == 0)
      {
          Zigbee_End_Online_Num++;
          Zigbee_End_old = Zigbee_End_buf;
          Zigbee_End[Zigbee_End_cont] = Zigbee_End_buf;
          break;
      }
    }
  }
  msg += 2;
  osal_cpyExtAddr( pAnnce->extAddr, msg );
  msg += Z_EXTADDR_LEN;
  pAnnce->capabilities = *msg;
}

猜你喜欢

转载自blog.csdn.net/qq_27747359/article/details/95238900