




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.void ZDApp_Init( byte task_id ) uint8 capabilities; / Save the task ID ZDAppTaskID = task_id;/设置任务id / Initialize the ZDO global device short address storage ZDAppNwkAddr.addrMode = Addr16Bit; ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; (void)NLME_GetExtAddr(); / Load the saveExtAddr pointer./函数的作用是返回指向64bitIEEE地址的指针,但这里有点奇怪,它好像没有接收这个指针 / Check for manual Hold Auto Start ZDAppCheckForHoldKey();/该函数的作用是如果HAL_KEY_SW_1键被按下,则not started automatically,如果不是自启动,则在自己的应用程序中要添加函数ZDOInitDevice( 0 )来启动建网过程,见Sample例子的应用程序 / Initialize ZDO items and setup the device - type of device to create. ZDO_Init(); / Register the endpoint description with the AF / This task doesnt have a Simple description, but we still need / to register the endpoint. afRegister( (endPointDesc_t *)&ZDApp_epDesc );/注册端点#if defined( ZDO_USERDESC_RESPONSE ) ZDApp_InitUserDesc();#endif / ZDO_USERDESC_RESPONSE / set broadcast address mask to support broadcast filtering NLME_GetRequest(nwkCapabilityInfo, 0, &capabilities);/This function allows the next higher layer to get the value of a NIB (network information base) attribute NLME_SetBroadcastFilter( capabilities );/This function sets a bit mask based on the capabilities of the device. It will be used to process valid broadcast addresses / Start the device? if ( devState != DEV_HOLD ) ZDOInitDevice( 0 ); else / Blink LED to indicate HOLD_START HalLedBlink ( HAL_LED_4, 0, 50, 500 ); ZDApp_RegisterCBs(); /* ZDO_Init() */2.void ZDApp_RegisterCBs( void )#if defined ( ZDO_IEEEADDR_REQUEST ) | defined ( REFLECTOR ) ZDO_RegisterForZDOMsg( ZDAppTaskID, IEEE_addr_rsp );#endif#if defined ( ZDO_NWKADDR_REQUEST ) | defined ( REFLECTOR ) ZDO_RegisterForZDOMsg( ZDAppTaskID, NWK_addr_rsp );#endif #if defined ( ZDO_COORDINATOR ) ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_rsp ); ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_rsp ); ZDO_RegisterForZDOMsg( ZDAppTaskID, End_Device_Bind_req );#endif#if defined ( REFLECTOR ) ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_req ); ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_req );#endif 3.ZStatus_t ZDO_RegisterForZDOMsg( uint8 taskID, uint16 clusterID ) ZDO_MsgCB_t *pList; ZDO_MsgCB_t *pLast; ZDO_MsgCB_t *pNew; / Look for duplicate pList = zdoMsgCBs; while ( pList ) if ( pList-taskID = taskID & pList-clusterID = clusterID ) return ( ZSuccess ); pLast = pList; pList = (ZDO_MsgCB_t *)pList-next; / Add to the list pNew = (ZDO_MsgCB_t *)osal_mem_alloc( sizeof ( ZDO_MsgCB_t ) ); if ( pNew ) pNew-taskID = taskID; pNew-clusterID = clusterID; pNew-next = NULL; if ( zdoMsgCBs ) pLast-next = pNew; else zdoMsgCBs = pNew; return ( ZSuccess ); else return ( ZMemError );该函数的作用是把新的ZDOMsg加入到这张表中。4.uint8 ZDOInitDevice( uint16 startDelay ) uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; uint16 extendedDelay = 0; devState = DEV_INIT; / Remove the Hold state / Initialize leave control logic ZDApp_LeaveCtrlInit(); / Check leave control reset settings ZDApp_LeaveCtrlStartup( &devState, &startDelay ); / Leave may make the hold state come back if ( devState = DEV_HOLD ) return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); / Dont join - (one time).#if defined ( NV_RESTORE ) / Get Keypad directly to see if a reset nv is needed. / Hold down the SW_BYPASS_NV key (defined in OnBoard.h) / while booting to skip past NV Restore. if ( HalKeyRead() = SW_BYPASS_NV ) networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; else / Determine if NV should be restored networkStateNV = ZDApp_ReadNetworkRestoreState(); if ( networkStateNV = ZDO_INITDEV_RESTORED_NETWORK_STATE ) networkStateNV = ZDApp_RestoreNetworkState(); else / Wipe out the network state in NV NLME_InitNV(); NLME_SetDefaultNV(); #endif if ( networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE ) ZDAppDetermineDeviceType(); / Only delay if joining network - not restoring network state extendedDelay = (uint16)(NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK); / Initialize device security ZDApp_SecInit( networkStateNV ); / Trigger the network start ZDApp_NetworkInit( extendedDelay ); return ( networkStateNV );5.void ZDApp_NetworkInit( uint16 delay ) if ( delay ) / Wait awhile before starting the device osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay ); else osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT ); 6.UINT16 ZDApp_event_loop( byte task_id, UINT16 events ) uint8 *msg_ptr; if ( events & SYS_EVENT_MSG ) while ( (msg_ptr = osal_msg_receive( ZDAppTaskID ) ) ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr ); / Release the memory osal_msg_deallocate( msg_ptr ); / Return unprocessed events return (events SYS_EVENT_MSG); if ( events & ZDO_STATE_CHANGE_EVT ) ZDO_UpdateNwkStatus( devState ); / Return unprocessed events return (events ZDO_STATE_CHANGE_EVT); if ( events & ZDO_NETWORK_INIT ) / Initialize apps and start the network devState = DEV_INIT; ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER ); / Return unprocessed events return (events ZDO_NETWORK_INIT); #if defined (RTR_NWK) if ( events & ZDO_NETWORK_START ) ZDApp_NetworkStartEvt(); / Return unprocessed events return (events ZDO_NETWORK_START); #endif /RTR_NWK#if defined ( RTR_NWK ) if ( events & ZDO_ROUTER_START ) if ( nwkStatus = ZSuccess ) if ( devState = DEV_END_DEVICE ) devState = DEV_ROUTER; osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); else / remain as end device! osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); / Return unprocessed events return (events ZDO_ROUTER_START); #endif / RTR if ( events & ZDO_COMMAND_CNF ) / User defined logic / Return unprocessed events return (events ZDO_COMMAND_CNF); #if defined( ZDSECMGR_SECURE ) & defined( RTR_NWK ) if ( events & ZDO_NEW_DEVICE ) / process the new device event if ( ZDSecMgrNewDeviceEvent() = TRUE ) osal_start_timerEx( ZDAppTaskID, ZDO_NEW_DEVICE, 1000 ); / Return unprocessed events return (events ZDO_NEW_DEVICE); #endif / ZDSECMGR_SECURE & RTR#if defined ( ZDSECMGR_COMMERCIAL ) if ( events & ZDO_SECMGR_EVENT ) ZDSecMgrEvent(); / Return unprocessed events return (events ZDO_SECMGR_EVENT); #endif / defined( ZDSECMGR_COMMERCIAL )#if ( SECURE != 0 ) if ( events & ZDO_DEVICE_AUTH ) ZDApp_DeviceAuthEvt(); / Return unprocessed events return (events ZDO_DEVICE_AUTH); #endif / SECURE if ( events & ZDO_NWK_UPDATE_NV ) ZDApp_SaveNetworkStateEvt(); / Return unprocessed events return (events ZDO_NWK_UPDATE_NV); #if ( SECURE != 0 ) if ( events & ZDO_FRAMECOUNTER_CHANGE ) if ( nwkFrameCounterChanges+ MAX_NWK_FRAMECOUNTER_CHANGES ) ZDApp_SaveNwkKey(); / Return unprocessed events return (events ZDO_FRAMECOUNTER_CHANGE); #endif if ( events & ZDO_DEVICE_RESET ) / The device has been in the UNAUTH state, so reset / Note: there will be no return from this call SystemReset(); / Discard or make more handlers return 0;7.void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) ZStatus_t ret; ret = ZUnsupportedMode;#if defined(ZDO_COORDINATOR) if ( logicalType = NODETYPE_COORDINATOR ) if ( startMode = MODE_HARD ) devState = DEV_COORD_STARTING; ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList, zgDefaultStartingScanDuration, beaconOrder, superframeOrder, false ); else if ( startMode = MODE_RESUME ) / Just start the coordinator devState = DEV_COORD_STARTING; ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false ); else #if defined( LCD_SUPPORTED ) HalLcdWriteScreen( StartDevice ERR, 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; #if defined( MANAGED_SCAN ) ZDOManagedScan_Next(); ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC ); #else ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); #endif else if ( startMode = MODE_RESUME ) if ( logicalType = NODETYPE_ROUTER ) ZMacScanCnf_t scanCnf; devState = DEV_NWK_ORPHAN; /* if router and nvram is available, fake successful orphan scan */ scanCnf.hdr.Status = ZSUCCESS; scanCnf.ScanType = ZMAC_ORPHAN_SCAN; scanCnf.UnscannedChannels = 0; scanCnf.ResultListSize = 0; nwk_ScanJoiningOrphan(&scanCnf); ret = ZSuccess; else devState = DEV_NWK_ORPHAN; ret = NLME_OrphanJoinRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); else #if defined( LCD_SUPPORTED ) HalLcdWriteScreen( StartDevice ERR, MODE unknown );#endif #endif /!ZDO COORDINATOR | SOFT_START if ( ret != ZSuccess ) osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );建立网络的过程大致是这样的:在ZDApp_Init中调用ZDOInitDevice( 0 )这个函数;在ZDOInitDevice中调用ZDApp_NetworkInit( extendedDelay )这个函数;在ZDApp_NetworkInit( extendedDelay )中调用osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay )这个函数来开启一个定时器;定时时间到后在ZDApp_event_loop中的调用ZDO_StartDevice这个函数;在ZDO_StartDevice这个函数中调用NLME_NetworkFormationRequest这个函数来建立网络;如果不是自启动(是hold auto start),则在自己的应用程序中要添加函数ZDOInitDevice( 0 )来启动建网过程,见Sample例子的应用程序协调器形成网络osalInitTasks();-ZDApp_Init();-ZDOInitDevice();-ZDApp_NetworkInit();-osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );-events & ZDO_NETWORK_INIT;-ZDO_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考点解析-人教版9年级数学上册《概率初步》难点解析试卷
- 2024年政法干警高分题库附参考答案详解【模拟题】
- 2025年山东枣庄市峄城区校园招聘区直中学教师26人笔试高频难、易错点备考题库参考答案详解
- 综合解析公务员考试《常识》必考点解析试题(含解析)
- 年报审计培训课件
- 2025年康复医学治疗技术副高级职称全真模拟模拟题附参考答案详解【预热题】
- 2024年公务员(国考)考试黑钻押题【全优】附答案详解
- 执业药师之《药事管理与法规》题库练习备考题附答案详解【模拟题】
- 子宫内膜厚度课件
- 年度安全培训考核总结课件
- 秋天的雨 省赛获奖
- JJF 1015-2014计量器具型式评价通用规范
- GB/T 95-2002平垫圈C级
- GB/T 8332-2008泡沫塑料燃烧性能试验方法水平燃烧法
- GB/T 38597-2020低挥发性有机化合物含量涂料产品技术要求
- GB/T 21073-2007环氧涂层七丝预应力钢绞线
- 压力管道特性表
- 胸痛的诊断和鉴别诊断课件整理
- 高级会计师评审个人业绩报告(精选9篇)
- DB45-T 679-2017城镇生活用水定额-(高清可复制)
- 储能型虚拟电厂的建设与思考分析报告
评论
0/150
提交评论