码迷,mamicode.com
首页 > 其他好文 > 详细

阅读z-stack组网,记录笔记

时间:2017-12-27 14:26:30      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:system   其他   scan   ase   lin   defaults   efault   nts   worklist   

大概知道组网的流程,分别记录协调器组成网络和路由器或者终端节点加入网络的过程。

在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组网,记录笔记

标签:system   其他   scan   ase   lin   defaults   efault   nts   worklist   

原文地址:https://www.cnblogs.com/rookie-xiao/p/8124832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!