Ztack学习笔记(4)-系统网络分析

//ZDApp.c 1 void ZDApp_Init( uint8 task_id )
 2 {
 3   // Save the task ID
 4   ZDAppTaskID = task_id;
 5
 6   // Initialize the ZDO global device short address storage
 7   ZDAppNwkAddr.addrMode = Addr16Bit;
 8   ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;//0xFFFE
 9   (void)NLME_GetExtAddr();  // Load the saveExtAddr pointer.
10
11   // Check for manual "Hold Auto Start"
12   ZDAppCheckForHoldKey();检测到有手工置位SW_1则会设置devState = DEV_HOLD,从而避开网络初始化
13
14   // Initialize ZDO items and setup the device - type of device to create.
15   ZDO_Init();//通过判断预编译来开启一些函数功能
16
17   // Register the endpoint description with the AF
18   // This task doesn‘t have a Simple description, but we still need
19   // to register the endpoint.
20   afRegister( (endPointDesc_t *)&ZDApp_epDesc );
21
22 #if defined( ZDO_USERDESC_RESPONSE )
23   ZDApp_InitUserDesc();
24 #endif // ZDO_USERDESC_RESPONSE
25
26   // Start the device?
27   if ( devState != DEV_HOLD ) //devState 初值为DEV_INIT , 所以在初始化ZDA层时,就执行该条件语句   /*如果devState=DEV_HOLD,则不会调用ZDOInitDevice()来初始化网络    即不组网也不入网.LED4闪烁等待应用程序来开启设备并初始化网络  */
28   {
29     ZDOInitDevice( 0 );
30   }
31   else
32   {
33     ZDOInitDevice( ZDO_INIT_HOLD_NWK_START );
34     // Blink LED to indicate HOLD_START
35     HalLedBlink ( HAL_LED_4, 0, 50, 500 );
36   }
37
38   // Initialize the ZDO callback function pointers zdoCBFunc[]
39   ZDApp_InitZdoCBFunc();
40
41   ZDApp_RegisterCBs();
42 } /* ZDApp_Init() */
 //ZDApp.c 1 uint8 ZDOInitDevice( uint16 startDelay )
 2 {
 3   uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
 4   uint16 extendedDelay = 0;
 5
 6   if ( devState == DEV_HOLD )
 7   {
 8     // Initialize the RAM items table, in case an NV item has been updated.
 9     zgInitItems( FALSE );
10   }
11
12   ZDConfig_InitDescriptors();
13   //devtag.071807.todo - fix this temporary solution
14   _NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags;
15
16 #if defined ( NV_RESTORE )
17   // Get Keypad directly to see if a reset nv is needed.
18   // Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
19   // while booting to skip past NV Restore.
20   if ( HalKeyRead() == SW_BYPASS_NV )
21     networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
22   else
23   {
24     // Determine if NV should be restored
25     networkStateNV = ZDApp_ReadNetworkRestoreState();
26   }
27
28   if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
29   {
30     networkStateNV = ZDApp_RestoreNetworkState();
31   }
32   else
33   {
34     // Wipe out the network state in NV
35     NLME_InitNV();
36     NLME_SetDefaultNV();
37     // clear NWK key values
38     ZDSecMgrClearNVKeyValues();
39   }
40 #endif
41
42   if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
43   {
44     ZDAppDetermineDeviceType();
45
46     // Only delay if joining network - not restoring network state
47     extendedDelay = (uint16)((NWK_START_DELAY + startDelay)
48               + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));
49   }
50
51   // Initialize the security for type of device
52   ZDApp_SecInit( networkStateNV );
53
54   if( ZDO_INIT_HOLD_NWK_START != startDelay )
55   {
56     devState = DEV_INIT;    // Remove the Hold state
57
58     // Initialize leave control logic
59     ZDApp_LeaveCtrlInit();
60
61     // Check leave control reset settings
62     ZDApp_LeaveCtrlStartup( &devState, &startDelay );
63
64     // Leave may make the hold state come back
65     if ( devState == DEV_HOLD )
66     {
67       // Set the NV startup option to force a "new" join.
68       zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
69
70       // Notify the applications
71       osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
72
73       return ( ZDO_INITDEV_LEAVE_NOT_STARTED );   // Don‘t join - (one time).
74     }
75
76     // Trigger the network start
77     ZDApp_NetworkInit( extendedDelay ); //网络初始化,跳到相应的函数里头
78   }
79
80   // set broadcast address mask to support broadcast filtering
81   NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );
82
83   return ( networkStateNV );
84 }
 1 void ZDApp_NetworkInit( uint16 delay )
 2 {
 3   if ( delay )
 4   {
 5     // Wait awhile before starting the device
 6     osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );
 7     //发送ZDO_NETWORK_INIT(网络初始化)消息到 ZDApp层,转到                                                                                                                  //ZDApp层,执行The fifth step  , ZDApp_event_loop() 函数
 8   }
 9   else
10   {
11     osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );
12   }
13 }
  1 UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events )
  2 {
  3   uint8 *msg_ptr;
  4
  5   if ( events & SYS_EVENT_MSG )
  6   {
  7     while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) )
  8     {
  9       ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );
 10
 11       // Release the memory
 12       osal_msg_deallocate( msg_ptr );
 13     }
 14
 15     // Return unprocessed events
 16     return (events ^ SYS_EVENT_MSG);
 17   }
 18
 19   if ( events & ZDO_NETWORK_INIT )//网络初始化事件处理
 20   {
 21     // Initialize apps and start the network
 22     devState = DEV_INIT;
 23     osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
 24
 25     ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
 26                      DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
 27 //设备逻辑类型,启动模式,信标时间,超帧长度,去启动设备
 28     // Return unprocessed events
 29     return (events ^ ZDO_NETWORK_INIT);
 30   }
 31
 32   if ( ZSTACK_ROUTER_BUILD )
 33   {
 34     if ( events & ZDO_NETWORK_START )
 35     {
 36       ZDApp_NetworkStartEvt();
 37
 38       // Return unprocessed events
 39       return (events ^ ZDO_NETWORK_START);
 40     }
 41
 42     if ( events & ZDO_ROUTER_START )
 43     {
 44       if ( nwkStatus == ZSuccess )
 45       {
 46         if ( devState == DEV_END_DEVICE )
 47           devState = DEV_ROUTER;
 48
 49         osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
 50       }
 51       else
 52       {
 53         // remain as end device!!
 54       }
 55       osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
 56
 57       // Return unprocessed events
 58       return (events ^ ZDO_ROUTER_START);
 59     }
 60   }
 61
 62   if ( events & ZDO_STATE_CHANGE_EVT )
 63   {
 64     ZDO_UpdateNwkStatus( devState );
 65
 66     // At start up, do one MTO route discovery if the device is a concentrator
 67     if ( zgConcentratorEnable == TRUE )
 68     {
 69       // Start next event
 70       osal_start_timerEx( NWK_TaskID, NWK_MTO_RTG_REQ_EVT, 100 );
 71     }
 72
 73     // Return unprocessed events
 74     return (events ^ ZDO_STATE_CHANGE_EVT);
 75   }
 76
 77   if ( events & ZDO_COMMAND_CNF )
 78   {
 79     // User defined logic
 80
 81     // Return unprocessed events
 82     return (events ^ ZDO_COMMAND_CNF);
 83   }
 84
 85   if ( events & ZDO_NWK_UPDATE_NV )
 86   {
 87     ZDApp_SaveNetworkStateEvt();
 88
 89     // Return unprocessed events
 90     return (events ^ ZDO_NWK_UPDATE_NV);
 91   }
 92
 93   if ( events & ZDO_DEVICE_RESET )
 94   {
 95 #ifdef ZBA_FALLBACK_NWKKEY
 96     if ( devState == DEV_END_DEVICE_UNAUTH )
 97     {
 98       ZDSecMgrFallbackNwkKey();
 99     }
100     else
101 #endif
102     {
103       // Set the NV startup option to force a "new" join.
104       zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
105
106       // The device has been in the UNAUTH state, so reset
107       // Note: there will be no return from this call
108       SystemResetSoft();
109     }
110   }
111
112   if ( ZG_SECURE_ENABLED )
113   {
114     return ( ZDApp_ProcessSecEvent( task_id, events ) );
115   }
116   else
117   {
118     // Discard or make more handlers
119     return 0;
120   }
121 }
  //ZDObject.c  1 void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder )
  2 {
  3   ZStatus_t ret;
  4 #if defined ( ZIGBEE_FREQ_AGILITY )
  5   static uint8 discRetries = 0;
  6 #endif
  7 #if defined ( ZIGBEE_COMMISSIONING )
  8   static uint8 scanCnt = 0;
  9 #endif
 10
 11   ret = ZUnsupportedMode;
 12
 13   if ( ZG_BUILD_COORDINATOR_TYPE && logicalType == NODETYPE_COORDINATOR )//当设备作为协调器时,执行这个条件语句。
 14   {
 15     if ( startMode == MODE_HARD )
 16     {
 17       devState = DEV_COORD_STARTING;
 18       ret = NLME_NetworkFormationRequest( zgConfigPANID, zgApsUseExtendedPANID, zgDefaultChannelList,
 19                                           zgDefaultStartingScanDuration, beaconOrder,
 20                                           superframeOrder, false );

//向网络层发送网络形成请求。当网络层执行 NLME_NetworkFormationRequest()建立网络后,将给予 ZDO层反馈信息。

// 接着去执行ZDApp层的 ZDO_NetworkFormationConfirmCB()函数

 21     }
 22     else if ( startMode == MODE_RESUME )
 23     {
 24       // Just start the coordinator
 25       devState = DEV_COORD_STARTING;
 26       ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false );
 27     }
 28     else
 29     {
 30 #if defined( LCD_SUPPORTED )
 31       HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );
 32 #endif
 33     }
 34   }
 35
 36   if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE) )//当为终端设备或路由时
 37   {
 38     if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) )
 39     {
 40       devState = DEV_NWK_DISC;
 41

//zgDefaultChannelList与协调器形成网络的通道号匹配。 网络发现请求。

// 继而转到ZDO_NetworkDiscoveryConfirmCB()函数

 42   #if defined( MANAGED_SCAN )
 43       ZDOManagedScan_Next();
 44       ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );
 45   #else
 46       ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );
 47     #if defined ( ZIGBEE_FREQ_AGILITY )
 48       if ( !( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) &&
 49             ( ret == ZSuccess ) && ( ++discRetries == 4 ) )
 50       {
 51         // For devices with RxOnWhenIdle equals to FALSE, any network channel
 52         // change will not be recieved. On these devices or routers that have
 53         // lost the network, an active scan shall be conducted on the Default
 54         // Channel list using the extended PANID to find the network. If the
 55         // extended PANID isn‘t found using the Default Channel list, an scan
 56         // should be completed using all channels.
 57         zgDefaultChannelList = MAX_CHANNELS_24GHZ;
 58       }
 59     #endif // ZIGBEE_FREQ_AGILITY
 60     #if defined ( ZIGBEE_COMMISSIONING )
 61       if (startMode == MODE_REJOIN && scanCnt++ >= 5 )
 62       {
 63         // When ApsUseExtendedPanID is commissioned to a non zero value via
 64         // application specific means, the device shall conduct an active scan
 65         // on the Default Channel list and join the PAN with the same
 66         // ExtendedPanID. If the PAN is not found, an scan should be completed
 67         // on all channels.
 68         // When devices rejoin the network and the PAN is not found from
 69         zgDefaultChannelList = MAX_CHANNELS_24GHZ;
 70       }
 71     #endif // ZIGBEE_COMMISSIONING
 72   #endif
 73     }
 74     else if ( startMode == MODE_RESUME )
 75     {
 76       if ( logicalType == NODETYPE_ROUTER )
 77       {
 78         ZMacScanCnf_t scanCnf;
 79         devState = DEV_NWK_ORPHAN;
 80
 81         /* if router and nvram is available, fake successful orphan scan */
 82         scanCnf.hdr.Status = ZSUCCESS;
 83         scanCnf.ScanType = ZMAC_ORPHAN_SCAN;
 84         scanCnf.UnscannedChannels = 0;
 85         scanCnf.ResultListSize = 0;
 86         nwk_ScanJoiningOrphan(&scanCnf);
 87
 88         ret = ZSuccess;
 89       }
 90       else
 91       {
 92         devState = DEV_NWK_ORPHAN;
 93         ret = NLME_OrphanJoinRequest( zgDefaultChannelList,
 94                                       zgDefaultStartingScanDuration );
 95       }
 96     }
 97     else
 98     {
 99 #if defined( LCD_SUPPORTED )
100       HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );
101 #endif
102     }
103   }
104
105   if ( ret != ZSuccess )
106   {
107     osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );
108   }
109 }
void ZDO_NetworkFormationConfirmCB( ZStatus_t Status )

网络的格式化
          A:初始化的能量阀值为16。通过设置ZDApp_event_loop任务中的事件ID为ZDO_NETWORK_INIT以便执行B。
          B:调用NLME_NetworkFormationRequest函数进行申请,对申请的回应在程序中没对应的回调处理,猜想回调处理在lib库中处理。在程序找到了两个对申请结果作处理的函数,void ZDO_NetworkFormationConfirmCB( ZStatus_t Status )和void nwk_Status( uint16 statusCode,uint16 statusValue );在两个函数中都有申请的结果。如果不成功则nwk_Status先执行如果成功则ZDO_NetworkFormationConfirmCB先执行。
          C:系统(lib)调用ZDO_NetworkFormationConfirmCB函数,在函数中通过设置ZDApp_event_loop任务中的事件ID为ZDO_NETWORK_START以便执行D。
          D:调用ZDApp_NetworkStartEvt函数,在函数中检测返回的申请结果,如果不成功则能量阀值增加16并将ZDApp_event_loop任务中的事件ID置为ZDO_NETWORK_INIT以便执行B;如果成功则ZDApp_event_loop任务中的事件ID置为ZDO_STATE_CHANGE_EVT以便执行E。
          E:调用ZDO_UpdateNwkStatus函数,函数通过端点表向SampleApp_ProcessEvent任务发送一个ZDO_STATE_CHANGE命令,以便执行F。
          F:设置ZDApp_event_loop任务中的事件ID为SAMPLEAPP_SEND_PERIODIC_MSG_EVT以便执行G。
          G:发送一个定期信息,并设置ZDApp_event_loop任务中的事件ID为SAMPLEAPP_SEND_PERIODIC_MSG_EVT以便执行G。

协调器网络的建立

时间: 2025-02-01 11:52:44

Ztack学习笔记(4)-系统网络分析的相关文章

Ztack学习笔记(2)-系统初始化分析

一 系统初始化 1 uint8 osal_init_system( void ) 2 { 3 // Initialize the Memory Allocation System 4 osal_mem_init(); 5 6 // Initialize the message queue 7 osal_qHead = NULL; 8 9 // Initialize the timers 10 osalTimerInit(); 11 12 // Initialize the Power Manag

Symfony2 学习笔记之系统路由

mfony2 学习笔记之系统路由 漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/intro-to-symfony 来替代. 拥有灵活性更为重要,如果你要改变一个页面的URL,比如从/blog 到 /new 怎么办?有多少链接需要你找出来并更新呢? 如果你使用Symfony的router,这种改变将变得很简单. Symfony2 router让你定义更具创造力的URL,你可以map你

[Linux学习笔记] Linux系统引导流程(一)

前面我们已经介绍过以CentOS为例的Linux系统的安装以及Linux常用命令的使用,本节内容我们将介绍Linux系统引导流程.当按下电源的那一刻,到我们看到用户界面,这其中都发生了些什么呢?赶快来一探究竟. 下图为Linux系统引导流程过程图: 以下对Linux引导流程过程做一个简单的说明: 1. POST加电自检 POST(POST ON SELF TEST)首先对每一个设备进行检查,完成后会寻找存有引导记录的设备,找到读入操作系统的引导记录,将系统控制权交给引导记录. 2. MBR引导

Linux学习笔记11_系统操作、优化相关命令复习

关机 poweroff         //直接关机 shutdown        //系统1分钟后关闭(poweroff) shutdown [NUM]     //系统在参数设定的分钟数后关闭(poweroff) shutdown -H            //halt(系统关闭,主板未断电) shutdown -h now    //先halt再poweroff shutdown -r      //重启(reboot) shutdown -k     //只会发出关机提示信息,并不会

《第一行代码》学习笔记1-Android系统架构

1. 2013.10,Andy Rubin创办Android公司.2005.8,Google收购之,并于2008年推出Android系统第一个版本. 2. ①Linux Kernel:基于Linux 2.6. Display Driver:基于Linux的帧缓冲(Frame Buffer)驱动. Camera Driver:常用的基于Linux的v412(Video for Linux)的驱动.   Bluetooth Driver:基于IEEE 802.15.1标准的无线传输技术. Flash

Ztack学习笔记(6)-广播组播点播

Zigbee网络中进行数据通信主要有三种类型:单播.组播.广播.那这三种方式如何设置呢,在哪里设置呢, 一. 广播 当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式.广播的短地址有三种 0xFFFF: 广播数据发送至所有设备,包括睡眠节点:0xFFFD: 广播数据发送至正在睡眠的所有设备:0xFFFC: 广播数据发送至所有协调器和路由器: 具体说明广播通信,假设终端发“0123456789”数据给协调器,当协调器收到数据后,通过串口发给电脑,电脑上的串口调试助手显示接收到的字符串,具

《深入浅出WPF》学习笔记之系统学习XAML语法

XAML是WPF技术中专门用于设计UI的语言,设计师直接使用XAML设计界面,设计完成后输出XAML代码交给程序员直接使用. XAML是一种由XML派生而来的语言,所以会继承XML中的一些概念. 命名空间: 命名空间为避免标签的名称冲突而出现,可以把来自不同程序集中的类映射到自定义的命名空间前缀,使用语法xmlns[:可选的映射前缀]="名称空间和程序集".没有映射前缀的命名空间为默认命名空间,默认命名空间只能有一个.命名空间映射一般写在根标签上. 标签与运行时对象的关系: 在XAML

Linux学习笔记(系统日常管理-2)

Linux抓包工具 tcpdump –nn  –i 网卡名 host 主机ip  port  端口 -wfilename:把抓到的内容抓放到一个文件里面 可以通过strings看到文件里面的东西 -c数字:指定抓包的个数 -s0:可以抓取全部的包 tshark:也可以抓包 wireshark在linux下也可以安装 yum install  -y  wireshark 抓包分析http请求: tshark  -n  -t  a  -R  http.request  -T  fields -e "

0923------APUE 学习笔记----------Linux系统的启动流程

前言: 前天在看APUE的时候突然想到了这个问题,于是给自己科普一下Linux系统的启动流程. 1.加载BIOS 接通电源后,计算机首先加载BIOS(即Basic Input-Output System,该程序被固化在主板上的一个ROM芯片中,包括最基本的输入输出程序.系统设置程序.开机硬件自检程序和系统自举程序等),进行硬件自检(即Power On Self Test)检查计算机硬件是否满足运行的基本条件(对于非严重故障,会发出一些声音,严重故障则会直接退出),硬件自检完成以后,BIOS根据C