SimpleApp例子中网络的形成过程
SimpleApp例程中两种绑定机制程序流程

SimpleApp例程中两种绑定机制程序流程我使用的协议栈版本及例子信息:ZigBee2006\ZStack-1.4.3-1.2.1个人注释版_5.24\Projects\zstack\Samples\SimpleApp\CC2430DB建立一个绑定表格有3种方式:(1)ZDO绑定请求:一个试运转的工具能告诉这个设备制作一个绑定报告(2)ZDO终端设备绑定请求:设备能告诉协调器他们想建立绑定表格报告。
该协调器将使协调并在这两个设备上创建绑定表格条目。
(3)设备应用:在设备上的应用能建立或管理一个绑定表格。
有两种可用的机制配置设备绑定:(1)如果目的设备的扩展地址是已知的,则zb_BindDeviceRequest()函数能创建一个绑定条目。
(2)如果扩展地址是未知的,则一个"按钮"可以利用。
这样的话,这个目的设备首先处于一种状态,它将被zb_AllowBindResponse()发出一个匹配响应;然后在源设备处,zb_AllowBindRequest()函数带着空地址出发.以上两种绑定机制,最终都是用函数APSME_BindRequest()创建绑定。
不同的是,前者采用的目的地址是64位扩展地址,而后者采用的目的地址是16位网络地址。
前者已知扩展地址,调用了ZDP_NwkAddrReq()函数获得目的设备短地址;后者利用描述匹配得到了短地址,然后调用了ZDP_IEEEAddrReq()函数,获取目的设备的扩展地址.****************************************************************** ************************************************************************************************************************** ************************************************************************************************************************** ********************************************************1、已知扩展地址的绑定这里可以直接调用函数zb_BindDevice()发起绑定请求:zb_BindDevice ( uint8 create, //是否创建绑定,TRUE则创建,FALSE则解除uint16 commandId, //命令ID,基于某命令的绑定,相当于簇uint8 *pDestination ) //指向扩展地址的指针函数程序如下(已知扩展地址的绑定部分)******************************************void zb_BindDevice ( uint8 create, uint16 commandId,uint8 *pDestination ){zAddrType_t destination;uint8 ret = ZB_ALREADY_IN_PROGRESS;if ( create ) //create = true 建立绑定{if (sapi_bindInProgress == 0xffff) //不允许绑定过程??{//---------------------------------if ( pDestination ) //已知扩展地址的绑定,即*pDestination 为非NULL{destination.addrMode = Addr64Bit;osal_cpyExtAddr( destination.addr.extAddr, pDestination );//直接调用APS绑定请求函数ret =APSME_BindRequest( sapi_epDesc.endPoint, //源EPcommandId,//簇ID&destination, //目的地址模式sapi_epDesc.endPoint ); //目的EPif ( ret == ZSuccess ) //绑定成功{// Find nwk addr 发现网络地址,得到被绑定设备的短地址ZDP_NwkAddrReq(pDestination,ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );osal_start_timerEx( ZDAppTaskID,ZDO_NWK_UPDATE_NV, 250 );}}//---------------------------------else //未知目的扩展地址,即*pDestination=NULL{ret = ZB_INVALID_PARAMETER;destination.addrMode = Addr16Bit;destination.addr.shortAddr =NWK_BROADCAST_SHORTADDR; //0xffff 描述符匹配请求:广播/*如果commandId是输出簇,则检测是否与本终端输出簇列表中的某一项相匹配(相同)*/if ( ZDO_AnyClusterMatches( 1,&commandId,sapi_epDesc.simpleDesc->AppNumOutClusters,sapi_epDesc.simpleDesc->pAppOutClusterList ) ){// Try to match with a device in the allow bind mode 寻找一个允许匹配状态下的设备进行描述符匹配ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,sapi_epDesc.simpleDesc->AppProfId, 1, &commandId, 0, (cId_t *)NULL, 0 );}/*如果commandId是输入簇,则检测是否与本终端输入簇列表中的某一项相匹配(相同)*/else if ( ZDO_AnyClusterMatches( 1,&commandId,sapi_epDesc.simpleDesc->AppNumInClusters,sapi_epDesc.simpleDesc->pAppInClusterList ) ){ //寻找一个允许匹配状态下的设备进行描述符匹配ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR,sapi_epDesc.simpleDesc->AppProfId, 0, (cId_t *)NULL, 1, &commandId, 0 );}if ( ret == ZB_SUCCESS ){// Set a timer to make sure bind completesosal_start_timerEx(sapi_TaskID,ZB_BIND_TIMER, AIB_MaxBindingTime);sapi_bindInProgress = commandId;return; // dont send cback event}}//---------------------------------}SAPI_SendCback( SAPICB_BIND_CNF, ret, commandId );}else //create = false 删除绑定{// Remove local bindings for the commandIdBindingEntry_t *pBind;// Loop through bindings an remove any that match the clusterwhile ( pBind =bindFind( sapi_epDesc.simpleDesc->EndPoint, commandId, 0 ) ){bindRemoveEntry(pBind);}osal_start_timerEx( ZDAppTaskID,ZDO_NWK_UPDATE_NV, 250 );}return;}******************************************在上面已知扩展地址的绑定程序中调用了APS绑定函数APSME_BindRequest(),这个函数在两个设备间建立绑定,通过APSME_BIND.confirm原语返回,而且这两者是不可分割的。
ppi网络构建流程

ppi网络构建流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 数据收集:从公共数据库或实验中获取蛋白质相互作用数据。
确保数据的准确性和可靠性。
SimpleAPP详解

SimpleAPP分析SimpleApp分析程序总是从helloword开始的,如果能找到一个例子开始,那么是最好不多的了,还好Ti为我们提供了很多的机会,让我们开始看一下simpleapp吧【TexasInstruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp】SimpleApp里面有两个应用,一个是收集传感器的值,其中有一个传感器设备和一个收集设备;另一个应用时智能开关,有一个控制节点和一个灯节点。
这里主要展示了如何网络建立,绑定和解绑定的演示以及开发一个自己的应用。
双击打开\TexasInstruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp\CC2430DB\SimpleApp.eww工程,既然是51的内核那只能用C了,一个地球人都知道的原理就是C程序是从main()开始的,而且整个程序就是一个main()函数,那么好办了,我们找到main()然后分析它就可以看清楚整个程序的结构了。
在工作空间中有8种项目配置,因为TI提供了两种开发板,所以实际上4种项目配置,分别配置成应用中4种设备。
我们直接看智能灯的应用,跟这个应用相关的配置是(以DB开发板为原型):SimpleSwitchDB和SimpleControllerDB。
SimpleSwitchDB是终端设备(我的理解是这里是灯的开关),SimpleControllerDB是控制设备是协调器或者路由器。
这里之所以把和灯相连的设备作为协调器或者是路由器我认为是为了和家庭或者是场景中的其他设备进行交互所需要的。
因为灯的状态还必须被其他的设备知道,就必须通知其他设备当前的状态!演示效果:控制设备-SW1:以协调器启动,SW2:以路由器启动启动控制设备将进入允许绑定状态,此时在10S内按动终端设备上的S1将发送绑定请求,成功绑定后LED1将点亮(如果打开节能选项,将是闪烁状态);按动终端设备上的S2将发送切换命令,将导致控制设备上的LED1开关状态的切换,按S3将此设备接绑定。
SIMPLE算法及计算例子

第二个问题:压力的一阶导数是以源项的形式出现在动簧方程中。采用分离式求解各 变量的离散方程时,由于压力没有独立的方程,压力与速度的关系隐含于连续性方程中,如 果压力场是正确的,则据此压力场求得的速度场一定满足连续性方程。如何构造求解压力场 的方程,或者说在假定初始乐力分布_|亓如何构造计算压力改进值得方程,就成了分离式求解 法中的一个关键问题。
在交错网格系统中,关『.“、v的离散方程可通过对U、v番白的控制容积作积分而 得出。这时压力梯度的离散形式对虬为(PF—P,,)/dx,对k为(P.。一P,,)/ay,亦即相邻 两点间的压力羞构成了印/彘、印/砂,这就从根本上解决了采川一般网格系统时所遇到 的困难,这也是交错网格的成功之处。
Keywords:SIMPLE algorithm;turbulence modeling;gravity current; numerical simulation;computational fluid mechanics
上海交通大学博十后出站报告
第一章SIMPLE算法概述
SIMPLE算法解析

SIMPLE算法解析SIMPLE算法(Sequential IMage Partitioning framework with Learned Evolutionary optimization)是一种用于图像分割的算法。
这个算法结合了序列化图像分割和深度学习优化的思想,旨在提高图像分割的准确性和效率。
图像分割是计算机视觉领域中的一个重要任务,它将图像划分成多个具有语义意义的区域,通常用于目标检测、图像分析和计算机辅助诊断等应用。
在传统的图像分割方法中,通常通过手动选择特征和设计规则来实现图像分割。
然而,这些方法需要大量的人工参与,并且往往无法解决复杂场景下的图像分割问题。
序列化分割阶段首先将图像切分成若干个小块,并对每个小块进行分割。
这个过程使用了一种遗传算法来寻找最佳的分割方案。
遗传算法是一种模仿自然进化过程的优化方法,它通过不断演化和选择适应度高的解决方案来寻找最优解。
在序列化分割阶段中,遗传算法通过对小块的分割组合进行来找到最佳的图像分割方案。
深度学习优化阶段通过使用深度卷积神经网络(CNN)对序列化分割结果进行优化。
该网络学习如何根据输入图像的上下文信息进行调整,使得分割结果更加准确。
深度学习优化阶段使用了大量的标注图像来进行训练,通过不断迭代训练来提高网络的性能。
整个SIMPLE算法的流程如下:首先,将输入图像切分为多个小块。
然后,使用遗传算法对这些小块进行分割,找到最佳的分割方案。
接下来,将分割结果输入深度学习网络进行优化,得到最终的图像分割结果。
SIMPLE算法的优点是能够根据图像的上下文信息进行分割,从而获得更加准确的分割结果。
同时,使用遗传算法进行分割方案的,可以大大减少计算量。
此外,深度学习优化阶段可以通过大量的标注图像进行训练,从而获得更好的性能。
然而,SIMPLE算法也存在一些局限性。
首先,该算法对图像的初始分割方案比较敏感,如果初始方案不好,可能会导致后续的优化效果不佳。
Simple软件--快速掌握手册

Simple企业管理系统快速上手指南广州斯盟派网络科技有限公司版权信息本文件的版权属于广州斯盟派网络科技有限公司任何形式的散发都必须事先得到广州斯盟派网络科技有限公司的书面许可目录第一章系统介绍 (4)1.1SIMPLE 企业管理系统概述 (4)1.2采购管理介绍 (4)1.3库存管理介绍 (5)1.4销售管理介绍 (5)1.5生产管理介绍 (5)1.6应收管理介绍 (6)1.7应付管理介绍 (6)第二章建立资料 (7)2.1货物分类 (7)2.2货物资料 (8)2.3仓库资料 (8)2.4采购员资料 (9)2.5供应商资料 (9)2.6业务员资料 (9)2.7客户资料 (9)2.8其它基础资料 (9)第三章数据初始化 (10)3.1库存数量初始化 (10)3.2应收款初始化 (10)3.3预收款初始化 (11)3.4应付款初始化 (11)3.5预付款初始化 (11)3.6现金银行初始化 (11)3.7科目余额初始化 (11)第四章采购流程 (13)4.1采购订单 (13)4.2采购订单查询 (14)4.3采购收货单 (16)4.4采购收货单查询 (17)4.5库存汇总表 (19)4.6付款单 (20)4.7应付款报表 (21)第五章销售管理 (24)5.1销售订单 (24)5.2销售发货单 (25)5.3销售退货单 (27)5.4收款单 (28)5.5.应收款报表 (29)第六章应收应付管理 (30)6.1先收货后付款业务 (30)6.2先预付款后收货业务 (30)6.3先发货后收款业务 (33)6.4先收款后发货业务 (34)第七章权限管理 (37)7.1操作员资料 (37)7.2新的操作员进入系统 (39)第八章月末结账 (41)8.1月末库存盘点 (41)8.2月末结账 (43)第一章系统介绍1.1simple 企业管理系统概述Simple企业管理系统是通过在多个行业众多客户的成功应用,形成的一套成熟稳定的ERP 产品。
SIMPLE算法及计算例子

SIMPLE算法及计算例子算法是指一系列解决问题的步骤和规则,是计算机科学的基础。
简单算法是指易于理解和实现的算法,适用于一些简单的问题。
下面是几个简单算法及其计算例子。
1.冒泡排序算法:冒泡排序是一种基础的排序算法,它依次比较相邻的元素,如果顺序不对则进行交换,直到整个序列有序为止。
计算例子:假设有一个数字序列[5,3,8,4,2],使用冒泡排序算法将其从小到大进行排序。
-第一次迭代:比较5和3,交换位置,得到序列[3,5,8,4,2]-第二次迭代:比较5和8,位置不变,继续比较下一对数字-第三次迭代:比较8和4,交换位置,得到序列[3,5,4,8,2]-第四次迭代:比较8和2,交换位置,得到序列[3,5,4,2,8]经过第四次迭代后,发现序列已经是有序的,算法结束。
最终的有序序列为[2,3,4,5,8]。
2.欧几里得算法:欧几里得算法用于计算两个非负整数的最大公约数。
算法基于两个数的辗转相除法,即先用较大数除以较小数得到余数,然后用较小数除以余数,依次循环,直到余数为0为止。
计算例子:假设需要计算36和48的最大公约数。
-第一次迭代:48除以36,余数为12-第二次迭代:36除以12,余数为0迭代过程中余数为0时,算法结束,最大公约数为123.线性算法:线性算法用于在一个无序列表或数组中寻找一些元素的位置。
它是一种直观的方法,逐个比较列表中的元素,当找到匹配的元素时返回其位置,否则返回未找到。
计算例子:假设有一个列表[4,2,7,1,9,5],需要找到数字7的位置。
-从列表的第一个元素开始,比较其与目标数字7-第一次比较:4!=7,继续比较下一个元素-第二次比较:2!=7,继续比较下一个元素-第三次比较:7=7,找到匹配,返回位置3最终结果为数字7的位置为3这些是一些简单算法及其计算例子,它们是计算机科学中最基础的算法之一、无论是冒泡排序还是求最大公约数,这些算法都体现了计算机程序处理问题的思维方式和逻辑。
i2p eepsites工作原理

I2P是一个用于匿名通信的开源项目,它使用了一种称为“eepsites”的私人网络服务。
这些eepsites是通过I2P网络传播的全球信息站,类似于互联全球信息站的全球信息站,但是在I2P网络上更加隐秘和匿名。
在本文中,将介绍I2P eepsites的工作原理。
1. I2P网络架构I2P网络是一个分布式的匿名网络,由许多节点组成。
每个节点都是一个运行I2P软件的计算机,它们通过加密通信来建立匿名连接。
当一个用户访问一个eepsite时,其请求通过多个节点进行加密传输,以保护用户的身份和位置信息。
这种多跳的加密传输使得用户可以匿名地访问eepsites。
2. 加密隧道在I2P网络中,加密隧道是实现匿名通信的基本单位。
当一个用户发送数据时,它会被加密并通过一条或多条加密隧道传输到目标节点。
每个节点都只知道前一个节点和后一个节点,它们无法得知数据的源和目的地。
这种加密隧道的设计使得通信在网络中的传播过程中能够保持匿名和隐秘。
3. 数据分发当一个eepsite在I2P网络上发布时,它会被分发到网络中的多个节点上。
这些节点被称为“分布点”,它们会保存eepsite的信息并帮助传播给其他节点。
这种分布式的存储和传播方式使得eepsite可以在网络中自由传播并保持活跃。
4. 匿名访问当一个用户想要访问一个eepsite时,它首先会通过自己的I2P节点建立一个匿名的连接。
在网络中寻找目标eepsite所在的加密隧道,通过这条隧道将请求发送给eepsite所在的节点。
eepsite的节点收到请求后,会通过相同的隧道将响应发送给用户节点,最终完成匿名的访问过程。
5. 加密保护I2P网络使用了各种加密算法来保护通信的隐私和安全。
包括对数据包、路由信息和节点通信的加密保护。
这些加密机制保证了用户在I2P网络上进行匿名通信时的隐私和安全。
总结I2P eepsites的工作原理可以总结为基于加密隧道的匿名通信和分布式数据存储。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SimpleApp例子中网络的形成过程每个设备都有一组被配置的参数,整个配置参数在代码中已经定义了默认值(在f8wConfig.cfg)中,在同个网络中,所有设备的“网络细节”配置参数(如PANID,Channel等)应该被设置成一样的值。
每个设备的“设备细节”配置参数(Coordinator,Router EndDevice等)可能配置为不同的值。
但是,ZCD_NV_LOGICAL_TYPE必须被设置,确保①有正确的一个设备作为协调器被配置②所有电池供电的设备作为终端设备被配置。
一旦这些工作都完成,这个设备就可以以任意方式启动,协调器设备将建立网络,其他设备将发现和加入这个网络。
协调器将扫描所有被ZCD_NV_CHANLIST参数制定的通道和选择1个最小能量的通道,如果有2个以上的最小能量通道,则协调器选择在ZigBee网络中存在的序号最小的通道,协调器将选择用ZCD_NV_PANID参数指定的网络ID,路由器和终端设备将扫描用ZCD_NV_CHANLIST配置参数指定的通道和试图发现ID为ZCD_NV_PANID参数指定的网络。
(1)协调器格式化网络协调器将扫描DEFAULT_CHANLIST指定的通道,最后在其中之一上形成网络,在f8wConfig.cfg文件中,可以看到其定义如下:-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B还可以查看到PANID的定义:-DZDAPP_CONFIG_PAN_ID=0xFFFF如果ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PAN ID,如果ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,那么协调器建立网络的PAN ID将由ZDAPP_CONFIG_PAN_ID 指定。
可以在下面的函数发现PID的判断ZStatus_t ZDO_NetworkDiscoveryConfirmCB( byte ResultCount,networkDesc_t *NetworkList ){...................for ( i = 0; i < ResultCount; i++, pNwkDesc = pNwkDesc->nextDesc ) {if ( zgConfigPANID != 0xFFFF ){// PAN Id is preconfigured. check if it matches// only 14 bits of pan id is usedif ( pNwkDesc->panId != ( zgConfigPANID & 0x3FFF ) )continue;}.......................}当所有的参数配置好后,可以调用下面的函数来格式化网络。
ZStatus_t NLME_NetworkFormationRequest( uint16 PanId, uint32 ScanChannels,byte ScanDuration, byte BeaconOrder,byte SuperframeOrder,byte BatteryLifeExtension );(2)路由器和终端设备加入网络路由器和终端设备启动后,将扫描DEFAULT_CHANLIST指定的频道,如果ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,则路由器将强制加入ZDAPP_CONFIG_PAN_ID定义的网络。
发现一个网络可以调用下面的函数ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte scanDuration);该函数要求网络层去发现邻居路由器节点,并且应该在进行网络扫描之前调用,扫描的结果由ZDO_NetworkDiscoveryConfirmCB()函数返回。
其中:ScanChannels-----准备扫描的信道号(信道号的范围为11~26,也就是2.4GHz频段有效)scanDuration--------规定了在新的网开始建立之前,其他网络可能扫描每个信道的时间其长度。
发现网络存在后,就调用下面的函数加入网络ZStatus_t NLME_OrphanJoinRequest( uint32 ScanChannels, byte ScanDuration );该函数要求网络层以孤节点的形式加入网络,函数调用的结果由ZDO_JoinConfirmCB()返回。
其中:ScanChannels------准备扫描的信道号scanDuration--------规定了在新的网开始建立之前,其他网络可能扫描每个信道的时间其长度。
(3)实际上,ZigBee设备启动时不直接调用上面的三个函数,而是通过调用ZDO_StartDevice()函数来启动设备。
当sapi_Init()函数的最后,调用osal_set_event(task_id,ZB_ENTRY_EVENT);函数,触发ZB_ENTRY_EVENT事件后,ZCD_NV_STARTUP_OPTION被设置为ZCD_STARTOPT_AUTO_START 后,在zb_HandleKeys()函数中,也就是按下SW1键后。
会在SAPI_ProcessEvent( byte task_id, UINT16 events )函数中执行下面的语句。
if ( events & ZB_ENTRY_EVENT ){uint8 startOptions;// Give indication to application of device startupzb_HandleOsalEvent( ZB_ENTRY_EVENT );// LED off cancels HOLD_AUTO_START blink set in the stackHalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8),&startOptions );if ( startOptions & ZCD_STARTOPT_AUTO_START ){zb_StartRequest();}else{// blink leds and wait for external input to config and restartHalLedBlink(HAL_LED_2, 0, 50, 500);}return (events ^ ZB_ENTRY_EVENT );}下面是zb_StartRequest();函数的源代码void zb_StartRequest(){uint8 logicalType;// Start the device// start delay = min(NWK_START_DELAY, zgStartDelay) + rand() - only for fresh start, not restoreif ( zgStartDelay < NWK_START_DELAY )zgStartDelay = 0;elsezgStartDelay -= NWK_START_DELAY;// check that bad combinations of compile flag definitions and device type//读取设备的逻辑设备zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8),&logicalType );if ( ( logicalType > ZG_DEVICETYPE_ENDDEVICE ) || ......)//判断设备配置是否正确{SAPI_SendCback( SAPICB_START_CNF, ZInvalidParameter, 0 );//配置错误}else{ZDOInitDevice(zgStartDelay);}return;}设备打开电源之后,由于还没有形成网络,所以经过设备逻辑类型的判断后,程序会跳转到ZDOInitDevice(zgStartDelay);下面是ZDOInitDevice(zgStartDelay);的程序定义。
uint8 ZDOInitDevice( uint16 startDelay ){...................................#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决定NV是否应该被重新载入networkStateNV = ZDApp_ReadNetworkRestoreState();}if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) {networkStateNV = ZDApp_RestoreNetworkState();}else{// Wipe out the network state in NVNLME_InitNV();//清除NV中的网络状态NLME_SetDefaultNV();}#endifif ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ){ZDAppDetermineDeviceType();// 加入网络的时延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 );}其中,ZDApp_NetworkInit( extendedDelay );函数会触发ZDO_NETWORK_INIT事件,其源代码如下:void ZDApp_NetworkInit( uint16 delay ){if ( delay ){// Wait awhile before starting the device 一一段时间后启动设备。