实验10节点的建网与入网分析_第1页
实验10节点的建网与入网分析_第2页
实验10节点的建网与入网分析_第3页
实验10节点的建网与入网分析_第4页
实验10节点的建网与入网分析_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 ZigBee实验十节点的建网与入网分析10.1 实验简介在前面实验中,我们都是直接的去使用了一个网络,如果不是想对内核进行深入研究,完全可以不用去考虑TI协议栈的工作细节,只要懂得关键使用部分也一样可以对ZIGBEE进行开发。为了对协议栈有更深入的了解认识,本实验对“协调器”的建网以及“路由器”“终端”的入网,做个简单的逻辑性介绍。实验目的10.2 训练目的 10.2.1 通过本实验了解Z-STACK启动的过程中建网与入网的一个流程。10.3实验设备10.3.1 硬件:(1) ZIGBEE 调试底板2个:可调电阻ZigBee_DEBUG指示灯红外发射ZigBee复位ZigBee按键拨码开关节

2、点按键复位传感器接口1J-LINK接口传感器接口3传感器接口2电源开关电源图10-1 ZIGBEE调试底板(2) UART转接板与转接线各1个:UART转接线转接串口输入,连接到ZIGBEE调试底板转接串口输出,连接到电脑串口图10-2 UART转接板与转接线(3) ZIGBEE仿真器1个;10PIN下载接口电源(上)和状态指示灯USB接口图10-3 ZIGBEE仿真器(4) ZIGBEE模块2个;图10-4 ZIGBEE模块(5) 电源2个图10-5 电源(6) 串口延长线1根图10-6 串口延长线(7) 硬件连接图连接电脑串口ZigBee调试底板与串口转接板连接电源连接电脑USBZIGBE

3、E DeBug连接口图10-7 硬件连接10.3.2 软件(1) IAR Embedded Workbench for MCS-51 7.51A集成开发环境;(2) TI Z-STACK;(3) 仿真器驱动;(4) 串口调试助手。实验知识10.4 10.4.1 网络形成每个设备都有一组能被配置的参数(如被PC工具或者外部处理器配置),整个配置参数在代码中已经定义了默认值(在f8wconfig.cfg中)。在同一个网络中,所有设备的“网络细节”配置参数(如PANID,Channel等)应该被配置成一样的值。每个设备的“设备细节”配置参数(Coordinator,Router,Enddevice等

4、)可以配置为不同的值。但是,ZCD_NV_LOGICAL_TYPE必须被设置,确保:1、 有正确的一个设备作为协调器被配置;2、 所有电池供电的设备作为终端设备被配置。一旦这些工作都完成,这个设备就可以以任意方式启动。协调器设备将建立网络,其他设备将发现和加入到这个网络中。10.4.2 协调器格式化网络协调器将扫描DEFAULT_CHANLIST(在f8wConfig.cfg里定义)指定的通道,最后在其中之一上形成网络。设备的PANID值与ZDAPP_CONFIG_PAN_ID值设置有关(ZDAPP_CONFIG_PAN_ID这个参数在配置文件f8wConfig.cfg)。如果协调器的ZDAP

5、P_CONFIG_PAN_ID设置为OxFFFF,则协调器将产生一个随机的PANID,如果协调器的ZDAPP_CONFIG_PAN_ID设置为非0xFFFF值,则协调器根据自身的网络长地址(IEEE地址)或ZDAPP_CONFIG_PAN_ID值随机产生一个PANID,如果协调器的PANID的设置值为小于等于0x3FFF的有效值,协调器就会以这个特定的PANID值建立网络,但是,如果在默认的信道上已经有了该PANID值的网络存在,则协调器会继续搜寻其他的PANID,直到找到网络不冲突为止。当所有参数配置好后,可以调用下面函数来格式化网络(以下函数不开源):ZStatus_t NLME_Netw

6、orkFormationRequest( uint16 PanId,uint8* ExtendedPANID, uint32 ScanChannels,byte ScanDuration, byte BeaconOrder,byte SuperframeOrder, byte BatteryLifeExtension );但一般不直接使用上面的函数建立网络,而是使用ZDO_StartDevice()函数来启动一个设备10.4.3 路由器和终端设备加入网络路由器和终端设备启动后,将扫描DEFAULT_CHANLIST指定的频道,如果ZDAPP_CONFIG_PAN_ID没有被定义为0xFFFF,

7、则路由器将强制加入ZDAPP_CONFIG_PAN_ID定义的网络。发现一个网络将调用下面函数(以下函数不开源):ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte scanDuration);该函数要求网络层去发现邻居路由器节点,并且应该在进行网络扫描之前调用,扫描的结果由ZStatus_t ZDO_NetworkDiscoveryConfirmCB()函数返回,其中:ScanChannels-准备扫描的信道号(信道号的范围1126,即仅对2.4GHz频段有效)。scanDuration-规定了在新的网络开始建立

8、之前,其他网络可以扫描每个信道的时间长度。发现网络存在后,就调用下面的函数加入网络。ZStatus_t NLME_OrphanJoinRequest( uint32 ScanChannels, byte ScanDuration )。该函数要求网络层以孤节点的形式加入网络。函数调用的结果由ZDO_JoinConfirmCB()函数返回。注意:如果协调器和路由器或终端设备都没定义ZDAPP_CONFIG_PAN_ID为0xFFFF,则两者之间不一样的定义可能会出现一些意外的结果;如果ZDAPP_CONFIG_PAN_ID被定义为一个正确的值(小于或等于0x3FFFF),那么协调器就只在指定的PA

9、N ID上试图建立网络。实验步骤10.510.5.1 在开始本实验的仿真前,参看配套源资料中“关于节点板串口使用的统一说明”,先按照本说明去配置好串口,波特率38400,以便往下实验能正常使用串口。图10-8 节点板串口使用的统一说明10.5.2 启动IAR Embedded Workbench,打开对应配套实验源码中“协调器”的SampleApp.eww工程:图10-9 工程文件图10-10 打开工程界面10.5.3 编译链接程序代码Make,这一步可以省略,因为进行DeBug前,IAR软件会先编译再下载代码到目标板上去仿真,但对于编译检查错误,这一步也很有必要。如果正确编译后文件右侧的红星

10、会消失。在Make之前,最好Clean一下,如下图所示:图10-11 编译链接代码文件红色星星编译后变没有了编译后生成图10-12 编译前后对比如果正确建立工程并正确配置了工程,则此时编译是无错误的,编译无错误如图 图10-13 编译链接无错误图10-14 编译连接有错误10.5.4 按照前面“实验设备”小节中的“硬件连接图”连接好硬件并打开电源,点击DEBUG按钮或者”Project->Debug”或者快捷键“Ctrl + D”进行程序下载并Debug。如有出错,请检查硬件连接或拔掉仿真器USB再重接图10-15 Debug 调试图10-16 程序正在下载到目标板10.5.5 正确进入

11、DeBug界面,如下图:图10-17 仿真调试界面10.5.6 通过以上步骤已将协调器程序下载到节点,此时的节点叫“协调器”。10.5.7 在配套资料“提高实验”文件夹下找到“超级单片机工具软件.exe”,如果是WIN7系统,右键“以管理员身份运行”,选择电脑对应的端口,设置和程序对应的波特率“38400”,数据位“8”,停止位“1”,校验位“NONE”,然后点击“打开串口”图10-18 超级单片机工具软件图10-19 超级单片机工具软件界面10.5.8 按下“全速运行”按钮进行试验验证,串口打印出协调器启动过程中的第几步。具体参看“实验验证”。步出函数步入函数单步运行复位全速运行按钮图10-

12、20 调试功能按钮10.5.9 此时一个“协调器”的启动过程已经验证完。将仿真器从“协调器”中拆下,让“协调器”成为一个单独个体,重启运行,让协调器处于一直运行状态。再将另一个节点按照“硬件连接图”连接好,再按“实验步骤”将“路由器”的程序下载到节点中,然后全速运行验证串口打印出来的结果。10.5.10 实验完毕。实验验证10.6 10.6.1 查看串口调试助手打印出来的设备启动步骤:图10-21 协调器启动过程图10-22 路由器启动过程实验部分参考程序解析(完整程序见源程序文件)10.7代码解释:10.7.1 协调器建网过程:STEP 1: zigbee设备应用层初始化ZDApp_Init

13、 ()【ZDApp.c】:在任务初始化osalInitTasks()中,调用了ZIGBEE设备应用层初始化函数:void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); macTaskInit( taskID+ ); / MAC初始化,MAC任务ID为0,此函数不开源无法查看源码。 nwk_init( ta

14、skID+ ); / nwk初始化,nwk任务ID为1,此函数不开源无法查看源码。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象层)任务ID为2,仅赋值ID号。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest监视器)初始化,如果有使用,则此任务ID为3,如果要使用UART串口,必须要初始化此任务.本程序没使用。#endif APS_Init( taskID+ );/ APS(应用支持子层)初始化,APS任务ID为3,此函数不开源无法查看源码。#if defined ( ZIGBEE_F

15、RAGMENTATION ) APSF_Init( taskID+ ); / 应用支持子层消息分割层,此处没编译使用#endif ZDApp_Init( taskID+ ); / zigbee设备应用层初始化,ZDApp任务ID为4,开始器件的启动.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID+ );/ 网络管理层初始化,任务ID为5.#endif SampleApp_Init( taskID ); / 用户任务初始化,任务ID为6.Main()

16、4;osal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()当中,获取了设备的IEEE地址和对按键启动的检测等,其中重要的是ZDOInitDevice()函数,可以说此函数是网络建立的入口。因为IAR预编译了HOLD_AUTO_START,所以devState初始化赋值为DEV_HOLD(在ZDApp.C中):#if defined( HOLD_AUTO_START ) devStates_t devState = DEV_HOLD;#else devStates_t devState = DEV_INIT;

17、#endif所以语句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函数留用户调用去启动。STEP 2:用户任务初始化SampleApp_Init()【SampleApp.c】:用户任务初始化函数SampleApp_Init()中重要的地方就是调用了ZDOInitDevice()函数,而在调用ZDOInitDevice()前,要对设备类型进行定义,可以在用户任务初始化调用ZDOInitDevice()前或是在ZDOInitDevice()函数的开始地方定义,此设备为“协调器”,所以定义为zgDeviceLogicalType = ZG_DEVIC

18、ETYPE_COORDINATOR。STEP 3:ZIGBEE设备初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函数,先对网络的各种动作以及参数做个配置,配置完成后调用ZDApp_NetworkInit()对网络进行初始化。STEP 4:网络初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函数里,实际上并没有做其他的一些初始化,而是将ZDO_NETWORK_INIT事件加入到定时器列表中去等待系统调度执行。STEP 5:ZIGBEE设备应用事件处理ZDApp_event_loop()【ZDApp.c

19、】:上一步将ZDO_NETWORK_INIT事件加入到定时器列表中,现在ZDApp_event_loop()事件处理函数执行ZDO_NETWORK_INIT事件,其中调用了ZDO_StartDevice()函数对特定类型的设备进行启动初始化。STEP 6:设备启动ZDO_StartDevice()【ZDObject.c】:启动设备就是对特定的设备类型进行启动,协调器就是创建网络(而路由器则是搜索网络),具体则是调用NLME_NetworkFormationRequest()去完成,这函数不开源。STEP 7:网络创建NLME_NetworkFormationRequest()【NLMEDE.h

20、】:网络创建函数就会在预设定的信道内检测是否有相同的PAN ID的网络存在,没有的话则开始创建一个新的网络,创建了网络后,由回调函数ZDO_NetworkFormationConfirmCB()去返回一个结果。因为这部分的程序不开源,所以只能看回调函数的结果。STEP 8:创建网络结果状态返回ZDO_NetworkFormationConfirmCB()【ZDApp.c】:回调函数ZDO_NetworkFormationConfirmCB()就是调用网络格式化函数后,返回网络创建的结果,如果返回状态是成功的,则设置设备状态devState为DEV_COORD_STARTING,然后设置事件os

21、al_set_event( ZDAppTaskID, ZDO_NETWORK_START )STEP 9:网络开始事件ZDApp_event_loop()àZDO_NETWORK_START【ZDApp.c】上一步触发了ZDO_NETWORK_START网络开始事件,这事件主要就是调用了ZDApp_NetworkStartEvt(),这个函数就是处理网络启动的一个函数。STEP 10:网络启动处理ZDApp_NetworkStartEvt()【ZDApp.c】:判断网络状态nwkStatus,这里分成两种状态:nwkStatus为ZSuccess时,也就是说网络创建成功了,将设备状态

22、devState设置为对应的DEV_ZB_COORD,然后设置事件ZDO_STATE_CHANGE_EVT,也即网络状态发送改变的事件,转到SETP 11.nwkStatus为非ZSuccess时,也就是网络创建不成功,然后增大功率再次回到 STEP 5去进行对网络格式化。如果发射功率已经是最大了,那么设置devState为DEV_INIT状态(此状态可以说是创建网络失败),再设置事件ZDO_STATE_CHANGE_EVT跳到STEP 11处理。STEP 11:状态改变事件ZDApp_event_loop()àZDO_STATE_CHANGE_EVT【ZDApp.c】这一步仅仅调用

23、一个网络更新函数ZDO_UpdateNwkStatus(),根据之前的一些事件的结果更新网络状态。STEP 12:更新网络状态ZDO_UpdateNwkStatus()【ZDObject.c】:根据之前的步骤的返回结果更新网络状态,然后对在系统里注册的端口(每个端口对应于一个任务)发送一个状态改变的消息事件ZDO_STATE_CHANGE。STEP 13:消息事件处理SampleApp_ProcessEvent()àSYS_EVENT_MSGà ZDO_STATE_CHANGE【SampleApp.c】这个是用户的消息事件处理,当协调器创建一个网络,最终不管是成功还是失败,

24、都会产生一个消息事件去通知每一个任务,各个任务就根据状态结果去做相应的动作。至此,一个协调器的启动过程已经完成。10.7.2 路由器(终端设备)入网过程STEP 1: zigbee设备应用层初始化ZDApp_Init ()【ZDApp.c】:在任务初始化osalInitTasks()中,调用了ZIGBEE设备应用层初始化函数:void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEve

25、nts, 0, (sizeof( uint16 ) * tasksCnt); macTaskInit( taskID+ ); / MAC初始化,MAC任务ID为0,此函数不开源无法查看源码。 nwk_init( taskID+ ); / nwk初始化,nwk任务ID为1,此函数不开源无法查看源码。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象层)任务ID为2,仅赋值ID号。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest监视器)初始化,如果有使用,则此任务ID为3,如果要使用UART串

26、口,必须要初始化此任务.本程序没使用。#endif APS_Init( taskID+ );/ APS(应用支持子层)初始化,APS任务ID为3,此函数不开源无法查看源码。#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ ); / 应用支持子层消息分割层,此处没编译使用#endif ZDApp_Init( taskID+ ); / zigbee设备应用层初始化,ZDApp任务ID为4,开始器件的启动.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLI

27、CT ) ZDNwkMgr_Init( taskID+ );/ 网络管理层初始化,任务ID为5.#endif SampleApp_Init( taskID ); / 用户任务初始化,任务ID为6.Main()àosal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()当中,获取了设备的IEEE地址和对按键启动的检测等,其中重要的是ZDOInitDevice()函数,可以说此函数是网络建立的入口。因为IAR预编译了HOLD_AUTO_START,所以devState初始化赋值为DEV_HOLD(在ZDA

28、pp.C中):#if defined( HOLD_AUTO_START ) devStates_t devState = DEV_HOLD;#else devStates_t devState = DEV_INIT;#endif所以语句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函数留用户调用去启动。STEP 2:用户任务初始化SampleApp_Init()【SampleApp.c】:Main()àosal_init_system()àosalInitTasks()àSampleApp_Init():用户任务初

29、始化函数SampleApp_Init()中重要的地方就是调用了ZDOInitDevice()函数,而在调用ZDOInitDevice()前,要对设备类型进行定义,可以在用户任务初始化调用ZDOInitDevice()前或是在ZDOInitDevice()函数的开始地方定义,此设备为“路由器”,所以定义为zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER。STEP 3:ZIGBEE设备初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函数,先对网络的各种动作以及参数做个配置,配置完成后调用ZDApp_NetworkInit()

30、对网络进行初始化。STEP 4:网络初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函数里,实际上并没有做其他的一些初始化,而是将ZDO_NETWORK_INIT事件加入到定时器列表中去等待系统调度执行。STEP 5:ZIGBEE设备应用事件处理ZDApp_event_loop()【ZDApp.c】:上一步将ZDO_NETWORK_INIT事件加入到定时器列表中,现在ZDApp_event_loop()事件处理函数执行ZDO_NETWORK_INIT事件,其中调用了ZDO_StartDevice()函数对特定类型的设备进行启动初始化。ST

31、EP 6:设备启动ZDO_StartDevice()【ZDObject.c】:启动设备就是对特定的设备类型进行启动,路由器则是搜索发现网络,具体则是调用NLME_NetworkDiscoveryRequest()去完成,这函数不开源。STEP 7:网络创建NLME_NetworkDiscoveryRequest ()【NLMEDE.h】:网络搜索发现函数就会在预设定的信道内检测是否有相同的PAN ID的网络存在,当找到了相同的PAN ID的网络则加入网络,由回调函数ZDO_NetworkDiscoveryConfirmCB ()去返回一个结果。因为这部分的程序不开源,所以只能看回调函数的结果。

32、STEP 8:搜索网络结果状态返回ZDO_NetworkDiscoveryConfirmCB()【ZDApp.c】:回调函数ZDO_NetworkDiscoveryConfirmCB()就是调用网络搜索函数后,返回网络搜索的结果,将搜索到的结果进行逐个比较,然后通过消息将反馈信息比较后发送到ZDA层。ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );STEP 9:网络请求加入事件ZDApp_event_loop()àSYS_EVENT_MSG【ZDApp.c】上一步发送了消息给ZDAppTaskID,而在ZDApp_event_loop里对消息进行处理又是调用了ZDApp_ProcessOSALMsg()函数,在消息处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论