版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用的协议栈版本信息:ZigBee2006ZStack-1.4.3-1.2.1Zigbee网络设备启动流程一协调器(自启动模式)一以SampleApp的协调器为例.1、协调器预编译信息通过 project-options-c/c+compiler-extraOptions可以看至U协调器所带的配置文件为:-f $PROJ_DIR$ ToolsCC2430DBf8wCoord .cfg I-f $PROJ_DIR$ ToolsCC2430DBf8wConfig .cfg即编译了 ZDO_COORDINATOR 和 RTR_NWK通过 project-options-c/c+compiler-Pr
2、eprocessor-Defined symbols可以看到协调器预编译包含了:CC2430EB; ZTOOL_P1; MT_TASK; LCD_SUPPORTED=DEBUG; MANAGED_SCAN没有编译 HOLD_AUTO_START 和 SOFT_START2、具体流程main()-osal_init_system()-osalInitTasks()-ZDApp_Init()进入 ZDApp_Init()函数:*void ZDApp_Init( byte task_id ) 一 一uint8 capabilities;/ Save the task IDZDAppTaskID =
3、task_id;/ Initialize the ZDO global device short address storageZDAppNwkAddr.addrMode = Addr16Bit;ZDAppNwkAddr.addr .shortAddr =INVALID_NODE_ADDR; /OxFFFE(void)NLME_GetExtAddr(); / Load the saveExtAddr pointer./ Check for manualHold Auto Start检测到有手工设置SW_1则会设置devState = DEV_HOLD,从而避开网络初始化ZDAppCheckFo
4、rHoldKey();II Initialize ZDO items and setup the device - type of device to createZDO_lnit(); 通过判断预编译来开启一些函数功能II Register the endpoint description with the AFII This task doesnt have a Simple description, but we still needII to register the endpoint.afRegister( (endPointDesc_t *)& ZDApp_epDesc );#if
5、 defined( ZDO_USERDESC_RESPONSE )ZDApp_InitUserDesc();#endif II ZDO_USERDESC_RESPONSEII set broadcast address mask to support broadcast filtering NLME_GetRequest(nwkCapabilityInfo, 0, & capabilities);NLME_SetBroadcastFilter( capabilities );II Start the device?if ( devState != DEV_HOLD )ZDOInitDevice
6、( 0 );elseII Blink LED to indicate HOLD_STARTHalLedBlink ( HAL_LED_4, 0, 50, 500 );ZDApp_RegisterCBs(); _*协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化 devState = DEV_INIT(参见基本问题说明 3).因此直接在ZDApp_Init() 中进入ZDOInitDevice( 0 )开启设备.*uint8 ZDOInitDevice( uint16 startDelay )初始化设备网络状态为ZDO_INITDEV_NEW_NETWORK_STAT
7、E:新的网络状态/可能意味着ZCD_NV_STARTUP_OPTION 不能恢复,或没有任何网络状态恢复uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; uint16 extendedDelay = 0;devState = DEV_INIT; / Remove the Hold state/ Initialize leave control logicII函数读取 NV 项目 ZCD_NV_LEAVE_CTRL 的值,ZDApp_LeaveCtrl指向这个值ZDApp_LeaveCtrlInit();II Check leave co
8、ntrol reset settingsZDApp_LeaveCtrlStartup( & devState, & startDelay );II Leave may make the hold state come backII以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则II把设备状态设为 DEV_HOLDif ( devState = DEV_HOLD )ZDO_INITDEV_LEAVE_NOT_STARTED:该设备没有在网络中,下次调用才启用return ( ZDO_INITDEV_LEAVE_NOT_STARTED );II Dont join -(one tim
9、e).#if defined ( NV_RESTORE )II Get Keypad directly to see if a reset nv is needed II Hold down the SW_BYPASS_NV key (defined in OnBoard h)II while booting引导)to skip past NV Restore.if ( HalKeyRead() = SW_BYPASS_NV )IISW_BYPASS_NV按键处于按下状态时,则避开网络层的NV存储networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; I
10、I设备网络状态为新的网络状态elseII Determine if NV should be restored/函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此来确定要不要读取NV里相应条目来恢复网络先前状态networkStateNV = ZDApp_ReadNetworkRestoreState(); _如果设备的网络状态为恢复的网络状态if ( networkStateNV = ZDO_INITDEV_RESTORED_NETWORK_STATE )/恢复设备先前的网络状态参数并且设置 devStartMode = MODE_RESUME!networkStateNV
11、 = ZDApp_RestoreNetworkState(); _else /如果设备的网络状态为新的网络状态 ,在下面进行处理II Wipe out(清除)the network state in NVNLME_InitNV();NLME_SetDefaultNV(); 设置默认 NV 条目#endifII如果设备的网络状态为新的网络状态if ( networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE ) II根据预编译来设置设备新的网络状态参数ZDAppDetermineDeviceType();II Only delay if joining net
12、work - not restoring network state extendedDelay = (uint16)(NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK);II Initialize device security ZDApp_SecInit( networkStateNV );II Trigger the network start ZDApp_NetworkInit( extendedDelay );return ( networkStateNV );*分两种情况:(1)如
13、果协调器预编译了 NV_RESTORE,且函数ZDApp_ReadNetworkRestoreState()返回值为ZDO_INITDEV_RESTORED_NETWORK_STATE,贝 V进入ZDApp_RestoreNetworkState()里设置ZDO_Config_Node_Descriptor .LogicalType = NODETYPE_COORDINATOR 和 devStartMode = MODE_RESUME. *uint8 ZDApp_RestoreNetworkState( void ) _/ Are we a coordinator/设备的网络状态为恢复的网络状
14、态则进入这个函数进行恢复先判断如果短地址为0则设置设备逻辑类型为协调器且devStartMode = MODE_RESUMEII否贝V设置 devStartMode = MODE_RESUMEZDAppNwkAddr .addr .shortAddr = NLME_GetShortAddr();if ( ZDAppNwkAddr.addr.shortAddr = 0 ) II女口果短地址是 0,即协调器ZDO_Config_Node_Descriptor.LogicalType =NODETYPE_COORDINATOR; /! devStartMode = MODE_RESUME; IIMO
15、DE_RESUME!* (2)如果协调器没有预编译 NV_RESTORE,networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE,但由于协调器编译了ZDO_COORDINATOR 而没有编译 SOFT_START,因此 ZDAppDetermineDeviceType()不起作用因此 ZDO_Config_Node_Descriptor.LogicalType 禾口 devStartMode 这两个关 键参数保持初始化时的值:ZDO_Config_Node_Descriptor .LogicalType =NODETYPE_COORDINATOR( 见基本问题
16、说明 6) devStartMode = MODE_HARD(见基本问题说明 4) 对于协调器,这两种情况最终都是确定两个关键设备网络状态参数的值 对本例的SampleApp的协调器,没有编译NV_RESTORE,因此属于情况(2).然后调用ZDApp_NetworkInit()启动网络:*void ZDApp_NetworkInit( uint16 delay ) _if ( delay )/ Wait awhile before starting the deviceosal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );els
17、e osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );*通过触发ZDAppTaskID的ZDO_NETWORK_INIT事件来看下对ZDO_NETWORK_INIT事件的处理:*UINT16 ZDApp_event_loop( byte task_id, UINT16 events )if ( events & ZDO_NETWORK_INIT )/ Initialize apps and start the networkdevState = DEV_INIT;ZDO_StartDevice( (uint8)ZDO_Config_Node_Des
18、criptor .LogicalTyp e, devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER );/ Return unprocessed eventsreturn (events A ZDO_NETWORK_INIT); * 可以看到调用了ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );这里设备网络状态参数:ZDO_Con
19、fig_Node_Descriptor .LogicalType =NODETYPE_COORDINATORdevStartMode = MODE_HARD且协调器编译了 ZDO_COORDINATOR*void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder )ZStatus_t ret;ret = ZUnsupportedMode;#if defined(ZDO_COORDINATOR)if ( logicalType = NODETYP
20、E_COORDINATOR )if ( startMode = MODE_HARD )MODE_HARDdevState = DEV_COORD_STARTING; /Started as Zigbee Coordinator建网ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,zgDefaultStartingScanDuration, beaconOrder,superframeOrder, false );else if ( startMode = MODE_RESUME ) MODE_RESU
21、ME/ Just start the coordinator devState = DEV_COORD_STARTING; ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false );else/错误,未知启动模式#if defined( LCD_SUPPORTED ) HalLcdWriteScreen( StartDevice ERR, MODE unknown); ClearScreen();Print8(HAL_LCD_LINE_1,10,StartDevice ERR,1); Print8(HAL_LCD_LINE_
22、2,10,MODE unknown,;#endif#endif / !ZDO_COORDINATOR#if !defined ( ZDO_COORDINATOR ) | defined( SOFT_START )if ( logicalType = NODETYPE_ROUTER | logicalType = NODETYPE_DEVICE )if ( (startMode = MODE_JOIN) | (startMode = MODE_REJOIN) devState = DEV_NWK_DISC; /Discovering PANs to join#if defined( MANAGE
23、D_SCAN ) ZDOManagedScan_Next(); ret =NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );#elseret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );#endifelse if ( startMode = MODE_RESUME ) /MODE_RESUME 恢复 if ( logicalType = NODETYPE_ROUTE
24、R )ZMacScanCnf_t scanCnf; devState = DEV_NWK_ORPHAN;scanCnf.hdr .Status = ZSUCCESS; scanCnf.ScanType = ZMAC_ORPHAN_SCAN; scanCnf.UnscannedChannels = 0;scanCnf.ResultListSize = 0;nwk_ScanJoiningOrphan(&scanCnf);ret = ZSuccess;elsedevState = DEV_NWK_ORPHAN; 孤儿ret = NLME_OrphanJoinRequest( zgDefaultCha
25、nnelList, zgDefaultStartingScanDuration );else#if defined( LCD_SUPPORTED )II HalLcdWriteScreen( StartDevice ERR, MODE unknown); Print8(HAL_LCD_LINE_1,10,StartDevice ERR,1); Print8(HAL_LCD_LINE_2,10,MODE unknown,;#endifII#endif II!ZDO COORDINATOR | SOFT_START if ( ret != ZSuccess )osal_start_timerEx(
26、ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );*通过参数可知协调器调用NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,zgDefaultStartingScanDuration, beaconOrder, superframeOrder, false )进行网络的组建.而对NLME_NetworkFormationRequest()的调用会产生一个回调函数ZDO_NetworkFormationConfirmCB()(见主要函数说明 3),来看下:*void
27、ZDO_NetworkFormationConfirmCB( ZStatus_t Status ) 一 一#if defined(ZDO_COORDINATOR) nwkStatus = (byte)Status; if ( Status = ZSUCCESS ) / LED on shows Coordinator startedHalLedSet ( HAL_LED_3, HAL_LED_MODE_ON );/ LED off forgets HOLD_AUTO_STARTHalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);#if defined ( ZBIT
28、)SIM_SetColor(0xd0ffd0);#endifif ( devState = DEV_HOLD )/ Began with HOLD_AUTO_START devState = DEV_COORD_STARTING;#if defined(BLINK_LEDS)elseHalLedSet ( HAL_LED_3, HAL_LED_MODE_FLASH );/ FlashLED to show failure#endifosal_set_event( ZDAppTaskID, ZDO_NETWORK_START );#endif /ZDO_COORDINATOR*如果Status返
29、回ZSUCCESS,建立网络成功,通过一些灯亮来来指示;不成功则通过闪烁灯来指示最后触发任务ZDAppTaskID的ZDO_NETWORK_START 事件,看下对 ZDO_NETWORK_START 的处理:*#if defined (RTR_NWK)if ( events & ZDO_NETWORK_START )ZDApp_NetworkStartEvt();II Return unprocessed events return (events A ZDO_NETWORK_START);*调用了 ZDApp_NetworkStartEvt()*void ZDApp_NetworkStar
30、tEvt( void ) _if ( nwkStatus = ZSuccess )/网络建立成功/ Successfully started a ZigBee networkif ( devState = DEV_COORD_STARTING )devState = DEV_ZB_COORD; osal_pwrmgr_device( PWRMGR_ALWAYS_ON );osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );else/网络建立不成功,则增加能量阀值重新建网/ Try again with a higher energy thre
31、shold !if ( ( NLME_GetEnergyThreshold() + ENERGY_SCAN_INCREMENT ) epDesc-endPoint != ZDO_EP ) _msgPtr = (osal_event_hdr_t *)osal_msg_allocate( bufLen );if ( msgPtr )msgPtr-event = ZDO_STATE_CHANGE; / Command ID msgPtr-status = (byte)state;osal_msg_send( *(epDesc-epDesc-task_id), (byte *)msgPtr )/ 发往
32、应用任务epDesc = epDesc-nextDesc;*对SampleApp的协调器来说,这里触发应用任务SampleApp_TasklD的 ZDO_STATE_CHANGE 事件,看下对 ZDO_STATE_CHANGE 的处理:*case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt-hdr.status); / 获取设备当前状态if ( (SampleApp_NwkState = DEV_ZB_COORD)| (SampleApp_NwkState = DEV_rOuTER)| (SampleApp_NwkState = DEV_E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传统管理考试题及答案
- 瓷砖检测考试题及答案
- 出纳考试题及答案
- 2026苏教版六年级数学上册第三单元第5课时《练习六》教案
- 护理课件比赛服装搭配心得
- 护理风险识别技巧与防范
- 护理团队:鱼骨图培训与工作坊
- 护理服务质量提升技巧
- 护理团队协作能力
- 2025年中级注册安全工程师《安全生产技术基础》真题及答案
- 电力工程造价咨询服务方案范文
- 砧板刀具分色管理制度
- 卡通形象吉祥物设计过程
- 口腔分类分级管理制度
- JG/T 156-2004竹胶合板模板
- 养生馆承包合同协议书
- SL631水利水电工程单元工程施工质量验收标准第1部分:土石方工程
- 2025中考重点中学自主招生数学试题及答案详解
- 虚拟电厂运营
- 隧道防水及二衬施工验收要求
- 会计管理费用明细科目大全35个
评论
0/150
提交评论