cancel
Showing results for 
Search instead for 
Did you mean: 

New device callback in Zigbee

Joan Duran
Associate II

Using the Zigbee stack as a coordinator, is there a callback available to notify when a new device is associated in the network?

We observe the following in the M0 log:

[M0] [00000015.076][PLATFORM] nwk_handle_assoc : Association accepted, sending response (0xb0dc, 0xa4c1383054f9cec1)

We can detect the new device in the ZB_NWK_NIB_ID_NeighborTable, but having a callback to trigger on association would be very helpful. I've checked the documentation and examples but haven’t found any information on this.

Thank you!

 

1 ACCEPTED SOLUTION

Accepted Solutions
Ouadi
ST Employee

Hi @Joan Duran,

You can use ZbMsgFilterRegister API at the startup (inside the func APP_ZIGBEE_StackLayersInit) to register the callback you want to use to retrieve any network status change. 

Please find below an example to detect a new device join : 

ZbMsgFilterRegister( stZigbeeAppInfo.pstZigbee, ZB_MSG_FILTER_JOIN_IND, ZB_MSG_DEFAULT_PRIO, APP_ZIGBEE_DeviceJointCallback, NULL ); static enum zb_msg_filter_rc APP_ZIGBEE_DeviceJointCallback( struct ZigBeeT * zb, uint32_t lId, void * pMessage, void * arg ) { struct ZbNlmeJoinIndT * pstJoinMessage; if ( lId == ZB_MSG_FILTER_JOIN_IND ) { pstJoinMessage = ( struct ZbNlmeJoinIndT * )pMessage; switch ( pstJoinMessage->rejoinNetwork ) { case ZB_NWK_REJOIN_TYPE_ASSOC : case ZB_NWK_REJOIN_TYPE_ORPHAN : case ZB_NWK_REJOIN_TYPE_NWKREJOIN : case ZB_NWK_REJOIN_TYPE_NWKCOMMISS_JOIN : case ZB_NWK_REJOIN_TYPE_NWKCOMMISS_REJOIN : /* A new Device has Join Network at MAC/NWK level */ APP_ZIGBEE_SetNewDevice( pstJoinMessage->nwkAddr, pstJoinMessage->extAddr, pstJoinMessage->capabilityInfo ); break; default : break; } } return( ZB_MSG_CONTINUE ); }

Best regards,

Ouadi

View solution in original post

2 REPLIES 2
liaifat85
Senior III

Use the emberIncomingMessageHandler() callback to listen for ZDO_Device_Announce messages. Or you can also use  emberAfPluginNetworkSteeringDeviceJoinedCallback() (if using the Network Steering plugin) to detect when a device has joined.

 

Ouadi
ST Employee

Hi @Joan Duran,

You can use ZbMsgFilterRegister API at the startup (inside the func APP_ZIGBEE_StackLayersInit) to register the callback you want to use to retrieve any network status change. 

Please find below an example to detect a new device join : 

ZbMsgFilterRegister( stZigbeeAppInfo.pstZigbee, ZB_MSG_FILTER_JOIN_IND, ZB_MSG_DEFAULT_PRIO, APP_ZIGBEE_DeviceJointCallback, NULL ); static enum zb_msg_filter_rc APP_ZIGBEE_DeviceJointCallback( struct ZigBeeT * zb, uint32_t lId, void * pMessage, void * arg ) { struct ZbNlmeJoinIndT * pstJoinMessage; if ( lId == ZB_MSG_FILTER_JOIN_IND ) { pstJoinMessage = ( struct ZbNlmeJoinIndT * )pMessage; switch ( pstJoinMessage->rejoinNetwork ) { case ZB_NWK_REJOIN_TYPE_ASSOC : case ZB_NWK_REJOIN_TYPE_ORPHAN : case ZB_NWK_REJOIN_TYPE_NWKREJOIN : case ZB_NWK_REJOIN_TYPE_NWKCOMMISS_JOIN : case ZB_NWK_REJOIN_TYPE_NWKCOMMISS_REJOIN : /* A new Device has Join Network at MAC/NWK level */ APP_ZIGBEE_SetNewDevice( pstJoinMessage->nwkAddr, pstJoinMessage->extAddr, pstJoinMessage->capabilityInfo ); break; default : break; } } return( ZB_MSG_CONTINUE ); }

Best regards,

Ouadi