1. 程式人生 > >閱讀z-stack組網,記錄筆記

閱讀z-stack組網,記錄筆記

事件處理 super tin 疑問 router delay result 設備 初始化

大概知道組網的流程,分別記錄協調器組成網絡和路由器或者終端節點加入網絡的過程。

在ZMain.c中
int main( void )中
osal_init_system();--->osalInitTasks();--->大約5個任務初始化需要修改,其他任務不需要用戶修改
osal_start_system();--->osal_run_system();--->events = (tasksArr[idx])( idx, events );和Hal_ProcessPoll();

具體看初始化
在void osalInitTasks( void )中閱讀
ZDApp_Init()
--->ZDOInitDevice(0)
--->ZDApp_NetworkInit( extendedDelay );網絡初始化
if ( delay )
{
//發送ZDO_NETWORK_INIT(網絡初始化)消息到ZDApp層,然後轉到ZDApp層,ZDApp_event_loop()函數
osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );
}
else
{
osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );
}
--->ZDApp_event_loop
if ( events & ZDO_NETWORK_INIT ) //The fivth step,網絡初始化事件處理
//設備邏輯類型,啟動模式,信標時間,超幀長度,接著轉到去啟動設備,轉到ZDO_StartDevice();
//啟動整個ZigBee設備網絡層的實際初始化,如果設備為路由器或者終端的話,則會發起NLME_NetworkDiscoveryRequest 請求原語來發起網絡發現。
//如果設備的狀態為MODE_RESUME,則會啟動孤兒掃描流程
ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
--->ZDO_StartDevice
//當設備是協調器
if ( ZG_BUILD_COORDINATOR_TYPE && logicalType == NODETYPE_COORDINATOR )
向網絡層發送網絡形成請求,當網絡層執行NLME_NetworkFormationRequest()建立網絡後,將給予ZDO層反饋信息,接著轉去執行ZDApp層的NLME_NetworkFormationRequest()函數
--->接著轉到去執行ZDApp層的ZDO_NetworkFormationConfirmCB()函數
//當設備是路由器或者終端節點
if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE) )
if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) )
ret = NLME_NetworkDiscoveryRequest( runtimeChannel, zgDefaultStartingScanDuration );

--->分兩種情況,1.協調器 2.路由器或終端設備
1)協調器
在文件ZDApp.c中void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ) //給予ZDO層網絡形成反饋信息(協調器)
osal_set_event( ZDAppTaskID, ZDO_NETWORK_START );
//發送網絡啟動事件到 ZDApp層,接著轉到ZDApp_event_loop()函數
--->
if ( events & ZDO_NETWORK_START ) // 網絡啟動事件
{
ZDApp_NetworkStartEvt();
}

--->ZDApp_NetworkStartEvt(); //網絡啟動事件

--->void ZDApp_NetworkStartEvt( void ) //處理網絡啟動事件
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
//設置網絡狀態改變事件,發送到ZDApp層,去ZDApp_event_loop()函數,找到相對應的網絡改變事件 if ( events & ZDO_STATE_CHANGE_EVT )。

2) 路由器或終端設備
當發現有網絡存在時,網絡層將給予 ZDO 層發現網絡反饋信息 ZStatus_t ZDO_NetworkDiscoveryConfirmCB( uint8 ResultCount, networkDesc_t *NetworkList )
--->UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )
--->ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );
---> case ZDO_NWK_DISC_CNF: // (終端設備),網絡發現響應
//當發現有網絡存在時,網絡層將給予 ZDO 層發現網絡反饋信息。然後由網絡層發起加入網絡請求,
//如加入網絡成功,則網絡層將給予 ZDO 層加入網絡反饋,執行NLME_JoinRequest()函數。然後轉到
//執行 ZDO_JoinConfirmCB()函數
NLME_JoinRequest

--->分情況討論是路由器還是終端設備
case ZDO_NWK_JOIN_IND://加入網絡反饋信息事件
--->void ZDApp_ProcessNetworkJoin( void )要分兩種情況,一
種是終端設備,一種是路由器;
//處理網絡加入事件。
--->終端設備if ( nwkStatus == ZSuccess )
--->路由器if ( ZSTACK_ROUTER_BUILD )
if ( ZDO_Config_Node_Descriptor.LogicalType != NODETYPE_DEVICE )
{
NLME_StartRouterRequest( 0, 0, false );//路由啟動請求
}
--->osal_set_event( ZDAppTaskID, ZDO_ROUTER_START );
--->ZDApp_event_Loop if ( events & ZDO_ROUTER_START )
if ( devState == DEV_END_DEVICE )
devState = DEV_ROUTER;

osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
//設置ZDO狀態改變事件
//設備狀態變成路由器

UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )
{ .......
if ( events & ZDO_STATE_CHANGE_EVT ) //網絡改變事件,這個事件就是在設備加入網絡成功後,並在網絡中的身份確定後產生的一個事件
{
ZDO_UpdateNwkStatus( devState ); //更新網絡狀態,執行 ZDO_UpdateNwkStatus()函數。
......
}
}

--->ZDO_UpdateNwkStatus中zdoSendStateChangeMsg
--->zdoSendStateChangeMsg中
osal_set_event(ZDAppTaskID, ZDO_STATE_CHANGE_EVT);
//如果ZDO狀態沒有任何改變,再一次,跳到ZDO_STATE_CHANGE_EVT事件處理函數
pMsg->event = ZDO_STATE_CHANGE;
//如果ZDO狀態改變了了,把ZDO_STATE_CHANGE這個消息保存到pMsg
(void)osal_msg_send(taskId, (uint8 *)pMsg);
//轉到MT_TASK.C,去執行The eleven step,
MT_ProcessIncomingCommand()函數
--->
case ZDO_STATE_CHANGE: 接著跳到MT_ZdoStateChangeCB()函數。 自此,協調器組網形成(終端設備成功加入網絡)
MT_ZdoStateChangeCB((osal_event_hdr_t *)msg);

疑問:
1.ZDO_NetworkDiscoveryConfirmCB是怎麽跳到的?
2. ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );在哪?

閱讀z-stack組網,記錄筆記