当有新节点加入到网络时会发送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;
}