为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > ZigBee网络多信道调度

ZigBee网络多信道调度

2018-04-10 23页 doc 167KB 280阅读

用户头像

is_650122

暂无简介

举报
ZigBee网络多信道调度ZigBee网络多信道调度 8.4 ZigBee网络多信道调度 如果需要扩大ZigBee网络规模,只要网络PAN ID不同,在一个信道上建立多个PAN网络的方式是可行的,但是,IEEE 802.15.4标准MAC层信道接入技术采用的是CSMA/CA机制,过多的节点势必会造成严重的信道退避冲突。IEEE 802.15.4标准使用的2.4GHz频段具有16个信道。因此,利用ZigBee多信道特性可以建立多个PAN网络。根据多个网络的负载程度,设置物理信道以选择性加入网络,实现网络负载相对平衡;当由于某种原因与网络长时间断开连接...
ZigBee网络多信道调度
ZigBee网络多信道调度 8.4 ZigBee网络多信道调度 如果需要扩大ZigBee网络规模,只要网络PAN ID不同,在一个信道上建立多个PAN网络的方式是可行的,但是,IEEE 802.15.4标准MAC层信道接入技术采用的是CSMA/CA机制,过多的节点势必会造成严重的信道退避冲突。IEEE 802.15.4标准使用的2.4GHz频段具有16个信道。因此,利用ZigBee多信道特性可以建立多个PAN网络。根据多个网络的负载程度,设置物理信道以选择性加入网络,实现网络负载相对平衡;当由于某种原因与网络长时间断开连接后,节点能够自动地切换信道加入另一个可用网络,以增强网络灵活性和可靠性。本节实验主要讲述节点利用栈网络层自动切换信道和在应用层设置信道两种方式。 实验目的与器材 1)实验目的 , 深入理解Z-Stack节点入网过程以及信道概念。 , 学会在Z-Stack中进行信道设置以及切换。 , 理解并学会使用非易失性存储器(NV)相关操作。 , Z-Stack中使用标准C语言函数库。 2)实验器材 , 5个CC2530开发套件(2个协调器模块,1个终端模块,2个用于Packet Sniffer 抓包) 实验原理与步骤 1(实验原理 1)网络发现和节点信道自动切换 协调器上电后,进行一系列的初始化设备,初始化网络事件等过程后,请求建立形成一个新的网络。当网络建立成功后,就可以等待其他终端设备和路由器节点加入。 终端设备在经过一系列的初始化过程后,首先要请求网络层执行网络扫描发现已经存在的网络。然后,终端设备根据网络发现返回的网络号、信道号等信息,请求加入网络。如果加入网络失败,节点初始化网络继续上述过程。终端设备加入网络后,如果与网络断开后,节点会初始化网络等待再次加入先前的网络。此时,如果在另一个信道上存在一个网络,终端设备可以选择加入这个网络,从而实现信道自动切换,保证节点不离开ZigBee网络。 网络启动与节点加入函数基本上都在Z-Stack ZDApp.c文件中。读者可以在这个文件的关键函数处加入断点,追踪程序流程。 下面主要介绍终端设备的入网过程和无法自动调频原因。 (1)设备初始化 终端设备上电后,在ZDApp_Init中调用初始化设备函数: ZDOInitDevice( 0 ); ZDOInitDevice函数主要完成初始化任务ID,网络地址,网络服务,初始化NV,安全等参数。ZDOInitDevice函数最后触发初始化网络操作: ZDApp_NetworkInit( extendedDelay ); 此函数用于启动网络加入过程,extendedDelay代表在网络启动前需等待的时间。函数 中启动网络初始事件ZDO_NETWORK_INIT。 osal_start_timerEx( ZDAaskID, ZDO_NETWORK_INIT, delay ); ZDO层任务事件处理函数ZDApp_event_loop对网络初始化事件进行处理,设置设备初 始状态为DEV_INIT。并启动该设备 if ( events & ZDO_NETWORK_INIT ) { devState = DEV_INIT; ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEF AULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER ); return (events ^ ZDO_NETWORK_INIT); } (2)网络发现 如果是协调器,程序将会调用NLME_NetworkFormationRequest函数请求建立网络。如 果是终端设备,程序会启动网络发现过程: 在ZDO_StartDevice中,执行 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, zgDefaultStartin gScanDuration ); #endif } NLME_NetworkDiscoveryRequest()正是网络发现过程中最为关键的函数,但是由于TI 并没有给出该函数的具体实现,所以对理解网络发现的具体实现过程存在一定的困难。TI 提供了ZDO_NetworkDiscoveryConfirmCB( )回调函数。该函数返回网络发现的结果,包括 网络ID,网络频段等网络重要信息。 在ZDO_NetworkDiscoveryConfirmCB( )中最后触发 函数: ZDApp_SendMsg(ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscove ryCfm_t), (byte *)&msg ); 该函数向ZDAppTaskID任务投递一个ZDO_NWK_DISC_CNF事件。 (3)加入网络 在ZDApp_ProcessOSALMsg()函数中响应ZDO_NWK_DISC_CNF事件: case ZDO_NWK_DISC_CNF: …… if ( ZG_BUILD_JOINING_TYPE && ZG_DEVICE_JOINING_TYPE ) if ( devStartMode == MODE_JOIN ) { devState = DEV_NWK_JOINING; ZDApp_NodeProfileSync((ZDO_NetworkDiscoveryCfm_t *)msgPtr); if ( NLME_JoinRequest(…..) != ZSuccess ) { ZDApp_NetworkInit( (uint16)(NWK_START_DELAY + ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))) ); } } 其中网络的加入通过NLME_JoinRequest( )函数实现,其参数logicalChannel就是加入网络所在的频段。如果成功加入网络,节点将会分配到网络地址和端点等信息,设为成功加入网络状态。如果该函数执行失败,则调用初始化网络函数ZDApp_NetworkInit( )重新寻找网络。在ZDApp_NetworkInit( )函数中又会触发ZDO_NETWORK_INIT事件,进入下一轮的网络加入过程。 (4)终端节点断开网络后,无法自动切换信道的原因 终端节点与网络断开后,就会重新孤立扫描程序,由于先前没有加入过网络,通过孤立扫描程序加入网络失败。终端节点重启网络发现过程,具体过程已在上文中详细阐述。当再次执行到网络发现ZDO_NWK_DISC_CNF事件,而后在ZDApp_ProcessOSALMsg()函数中响应该事件。如果此时网络没有恢复,节点不再执行网络加入过程,而是执行continueJoining代码段,即执行以下程序: case ZDO_NWK_DISC_CNF: ……. if ( (((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->hdr.status == ZDO_SUCCESS) && (z doDiscCounter > NUM_DISC_ATTEMPTS) ) ……… //如果指示网络发现不成功或者成功次数不符合规定 else if ( continueJoining ) { #if defined ( MANAGED_SCAN ) ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); #else zdoDiscCounter++; ZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY + ((uint16)(osal_rand()& BEACON_REQ_DELAY_MASK))) ); #endif } MANAGED_SCAN是编译选项,允许信道扫描延迟。从以上程序可以看到,当节点与父节点断开连接后,子节点会不断的重复执行ZDApp_NetworkInit初始化网络,试图加入先前的网络,直到与先前网络重新建立连接。这就是终端节点无法加入到其他网络,实现自动切换信道的原因。在continueJoining函数段添加增加节点请求入网NLME_JoinRequest函数,即可实现信道跳转,加入到其他网络。 2)使用NV区设置信道 利用mac_low_level.h文件中macRadioSetChannel(uint8 channel),ZmacSetReq(ZMACChannel)能够实现信道设置。但是,这种在MAC层设置信道的方式可能会影响到上层一些其他函数执行,产生一些严重后果。本节介绍利用非易失存储器(Non Volatile, NV)设置信道,启动节点实现应用层设置信道。 非易失存储器,像硬盘,U盘(闪存)等存储介质,掉电后其信息不丢失。而易失性存储器,像内存,断电后存储信息就会丢失。易失性存储器有什么缺点呢,举个例子说,你的IAR软件在处于编辑时状态时,会将Z-Stack工程从硬盘装入到内存中。如果突然停电了,你想起刚敲打的几行代码还没有保存到硬盘上,这时的你会有怎样的反应呢,与此类似,Z-Stack把一些重要的系统参数存储到NV中。存入NV的系统参数通常包括网络NIB,组表,设备表,绑定表,Profile ID,网络密匙等信息。节点不必每次重启时都需重新配置如此多的参数,能够迅速恢复到掉电前的系统状态。 OSAL主要有以下几个重要的NV函数: 1. osal_nv_item_init()初始化nv条目。 2. osal_nv_read()读取nv条目。 3. osal_nv_write()写入nv条目。 4. NLME_InitNV( void ) NV区初始化。 5. NLME_SetDefaultNV()设置默认的NV区条目。 6. NLME_RestoreFromNV()从NV区中恢复条目。 使用这几个函数时,读者须加入NV_INIT和NV_RESTORE这两个编译选项。 使用NV区设置信道,读者可以把欲写入的信道值使用osal_nv_write()函数写入NV区中,然后使用Simple API中的zb_SystemReset()重启系统。重启之后,节点就可能在设定信道上工作。这里说“可能”的意思是节点设置的PAN ID和信道号,可能不存在于现存网络中的PAN ID和信道集合。换句话说,节点不能加入到现存网络。所以,PAN ID和信道设置要与现存网络PAN ID和信道号一致。 2(程序流程 本实验是在TI Sensor Demo官方例程基础上修改的。Sensor Demo工程主要分为传感器节点(Sensor)和数据收集(Collect)节点两种类型。Sensor节点为终端节点,采集温度、光照等信息。Collect节点一般为路由器或协调器节点,主要用于数据汇集等。 1)默认信道设置 在f8wConfig.cfg配置文件中进行信道设置: /* Default channel is Channel 11 - 0x0B */ // Channels are defined in the following: // 0 : 868 MHz 0x00000001 // 1 - 10 : 915 MHz 0x000007FE // 11 - 26 : 2.4 GHz 0x07FFF800 // //-DMAX_CHANNELS_868MHZ 0x00000001 //-DMAX_CHANNELS_915MHZ 0x000007FE //-DMAX_CHANNELS_24GHZ 0x07FFF800 //-DDEFAULT_CHANLIST=0x04000000 // 26 - 0x1A //-DDEFAULT_CHANLIST=0x02000000 // 25 - 0x19 //-DDEFAULT_CHANLIST=0x01000000 // 24 - 0x18 //-DDEFAULT_CHANLIST=0x00800000 // 23 - 0x17 //-DDEFAULT_CHANLIST=0x00400000 // 22 - 0x16 //-DDEFAULT_CHANLIST=0x00200000 // 21 - 0x15 //-DDEFAULT_CHANLIST=0x00100000 // 20 - 0x14 //-DDEFAULT_CHANLIST=0x00080000 // 19 - 0x13 //-DDEFAULT_CHANLIST=0x00040000 // 18 - 0x12 //-DDEFAULT_CHANLIST=0x00020000 // 17 - 0x11 //-DDEFAULT_CHANLIST=0x00010000 // 16 - 0x10 //-DDEFAULT_CHANLIST=0x00008000 // 15 - 0x0F //-DDEFAULT_CHANLIST=0x00006000 // 13和14 - 0x0E //-DDEFAULT_CHANLIST=0x00002000 // 13 - 0x0D //-DDEFAULT_CHANLIST=0x00001000 // 12 - 0x0C //-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B 0x00000800 -DDEFAULT_CHANLIST=0x01000800 // 11 and 24- 0x0B 0x18 信道列表值共计32位,如果使用某一信道,需将其对应位(自右到左的顺序,最右一位是信道0)置1即可。如果使用多个信道,需将多个位设置为1。这里编者设置了11和12两个信道,信道列表值为0x00001800。如果使用2.4GHz所有的16个信道,信道列表值设置为0x07FFF100. 为便于不同信道网络切换,网络PAN ID定义为固定值: -DZDAPP_CONFIG_PAN_ID=0x0012 2)终端节点自动切换信道 在ZDApp.c中ZDApp_ProcessOSALMsg函数处理网络发现的continueJoining 程序段中加入如下语句,使得与网络断开连接后节点加入其它网络: //进行网络初始化 ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); if (NLME_JoinRequest(…...) != ZSuccess ) { #if defined ( MANAGED_SCAN ) ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); #else zdoDiscCounter++; ZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY+ ((uint16)(os al_rand()& BEACON_REQ_DELAY_MASK))) ); #endif } 当节点与父节点断开连接后,子节点会首先进行网络初始化,执行continueJoining结构中的语句。加入判断语句后,子节点首先会执行NLME_JoinRequest()函数,该函数根据ZDO_NetworkDiscoveryConfirmCB( )所返回的网络参数加入网络,子节点根据扫描到的信道和PANID来加入网络,从而实现信道的自动切换。当NLME_JoinRequest()的返回状态不是Zsuccess,说明不在其他ZigBee网络或者现存网络不允许该节点加入。此时子节点执行ZDApp_NetworkInit()函数来等待加入先前网络。一旦先前网络恢复,子节点就会立即加入。如果程序中不添加ZDApp_NetworkInit函数,节点不经过重启,将不会加入其它网络。 3)利用NV区设置信道 信道设置较好的方式是根据网络负载或信道干扰情况进行动态设置。由于篇幅限制,本实验利用在DemoSensor.c的按键SW4函数中触发。 (1)定义信道号和PAN ID 为便于节点在两个信道11和12间切换,编者使用两个按键触发信道设置。 SW2键: newChannel=0x01001000;//0x18 SW4键: newChannel=0x00000800;//0x0B 定义网络重启后的网络号,与在f8wConfig.cfg中配置PAN ID一致: newPanid=0x0012;//与协调器建立的PAN ID一致 (2)NV区设置 将定义要写入的网络号和信道号写入NV区中 osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);//写NV 上述函数需要包含在OSAL_Nv.h头文件中,需要加入如下语句: #include "OSAL_Nv.h"//写NV条目 (3)设备重启 最后,使用zb_SystemReset()函数进行协议栈重置。 zb_SystemReset();//协议栈重置, NV存储器条目改变,相当于手动重置NV。 //zb_StartRequest();//协议栈重启,相当于按重启键 //zb_writeconfiguration(ZCD_NV_STARTUP_OPTION,sizeof(unit8)); //从上次保存点恢复 Simple API(TI在应用层进一步封装的函数接口)zb_SystemReset()与zb_StartRequest() 都有重启协议栈的功能。但是,zb_SystemReset()函数在重启设备后NV区内容会发生改变。而zb_StartRequest()只是重新请求启动协议栈,不会改变NV区内容,也就是说,诸如一些网络地址,绑定表等系统参数不会发生改变。重置NV区也可使用手动方法:同时按下Push键和重启键,然后松开重启键,等待大约2s后,接着松开PUSH键。 zb_writeconfiguration()为写NV命令。如果具有ZCD_NV_STARTUP_OPTION选项,节点会从上一次保存状态恢复NV区状态,本次写入时会自动保存网络状态。如果不写入ZCD_NV_STARTUP_OPTION选项,节点会重新启动一个新网络。 4)获取节点地址、PAN ID、信道等指示信息 (1)获取节点地址 使用zb_GetDeviceInfo()获取节点网络地址信息。函数原型为: void zb_GetDeviceInfo ( uint8 param, void *pValue ) 参数param为设备信息标识符,pValue为存储设备信息的缓冲区。 节点自身网络地址,和父节点网络地址都是16位短地址。因此,它们可共用一个缓冲区: uint16 tmpAddr=0xffff; 其标识符分别为ZB_INFO_SHORT_ADDR,ZB_INFO_PARENT_SHORT_ADDR。因此,获取节点自身地址和父节点地址函数可写为: zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr); zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr); (2)获取节点当前PAN ID和信道号 PAN ID和信道号存在网络层信息库(NIB)中,可以直接从NIB信息库中读出。 在nwk.h头文件中网络信息描述符为: extern nwkIB_t _NIB; typedef struct { ……. // non-settable uint16 nwkDevAddress; byte nwkLogicalChannel; uint16 nwkCoordAddress; byte nwkCoordExtAddress[Z_EXTADDR_LEN]; uint16 nwkPanId; ….. } 读者可以发现这几个参数是不能够设置的。PAN ID和信道号可直接使用_NIB.nwkPanId和_NIB.nwkLogicalChannel。在程序中,需要加入“nwk.h”头文件。 (3)十六进制格式化输出信息 上述网络地址信息,信道号,网络号使用十六进制在屏幕上输出比较直观。Z-Stack应用开发使用C语言进行编程,那么调用常用的C语言库函数,是肯定的。C语言中sprintf()函数经常用来格式化输出字符串。函数原型如下: int sprintf( char *buffer, const char *format, [ argument] … ); buffer是指向写入字符串的缓冲区,format说明写入字符串格式。sprintf函数需要加入stdio.h头文件。 读者可申请一个打印缓冲区,专门用于在屏幕上输出格式化字符串。 static uint8 printf_buf[32]; 如信道号就可以按照下面方式在屏幕上输出: sprintf(printf_buf,"CHANNEL:0x%X",_NIB.nwkLogicalChannel); 3(实验步骤 本实验使用三个开发套件,两个节点下载Collect程序,成为协调器,分别建立PAN网络,在信道11、12工作。剩余一个节点下载Sensor程序,成为终端设备,默认工作信道为信道11和信道12。终端设备能够动态加入信道11和12上的网络。 1)将实验目录下的相应代码依照readme.txt中的说明,拷贝到Sensor Demo对应的文件夹下。如果出现编译不成功情况,很可能没有加入编译选项:NV_INIT,NV_RESTORE,MANAGED_SCAN。MANAGED_SCAN 只需加入到CollectEB工程编译选项中。 2)按照如表 所示,在配置f8wConfig.cfg中设置默认信道列表并按照工程类型依次下载到相应的设备中。 表 节点的信道设置 节点 设备类型 工程类型 信道设置 信道号 协调器 节点1 DEFAULT_CHANLIST=0x00000800 11(0x0B) CollectEB 协调器 节点2 DEFAULT_CHANLIST=0x01000000 24(0x18) CollectEB 终端设备 节点3 DEFAULT_CHANLIST=0x01000800 11、24 SensorEB 然后,定义网络PAN ID: -DZDAPP_CONFIG_PAN_ID=0x0012 3)节点1和2上电后,分别按下节点1,2的SW1(上)键,它们重启之后,会成为协调器,并建立PAN网络。按下SW3(下)键,屏幕上出现它们的网络地址为”0x0000”, PAN ID“0x0012”,信道号“0x0B”或“0x18”。 4)将节点3上电,观察节点3会加入上述哪个信道上的网络。然后,将关闭那个信道上的协调器节点。观察节点3能否会立即切换到另一个信道,加入此信道上的网络。 5)按下节点3的SW4(左)键和SW2(右)键,观察节点能否在两个信道上的网络进行切换。按照步骤4的方式,再次关闭协调器节点,观察节点3还能否自动跳转信道。 6)去掉编译选项NV_INIT和NV_RESTORE,重复上述实验,观察节点3能否自动跳转 信道。 4(程序清单 清单 终端节点自动切换信道 /****************************************************************************** * 函数段 void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr ) * 位置 ZDO/ZDApp.c * 描述 处理网络发现事件,节点断开网络后,可自动跳频加入其它网络 *****************************************************************************/ if ( continueJoining ) { //进行网络初始化 ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); if ( NLME_JoinRequest( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->extendedPAN ID,BUILD_UINT16( ((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->panIdLSB, ((ZDO _NetworkDiscoveryCfm_t *)msgPtr)->panIdMSB ),((ZDO_NetworkDiscoveryCfm_t *)msgPtr)->logicalChannel,ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuc cess ) { #if defined ( MANAGED_SCAN ) ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); #else zdoDiscCounter++; ZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY+ ((uint16)(os al_rand()& BEACON_REQ_DELAY_MASK))) ); #endif } } 清单 利用NV区设置信道 /****************************************************************************** * 函数段 void zb_HandleKeys( uint8 shift, uint8 keys ) * 位置 APP/DemoSensor.c * 描述 定义并写入NV区信道号,初始化并重启NV条目,实现信道设置 *****************************************************************************/ if ( keys & HAL_KEY_SW_2 ) { newPanid=0x0012; newChannel=0x00001000;//0x0C //NLME_InitNV();//NV初始化 //NLME_SetDefaultNV();//设置默认nv osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);//写NV //zb_StartRequest();//协议栈重启,相当于按重启键 zb_SystemReset();//协议栈重启,这时NV存储器也会改变。 //改变NV的手动方法,同时按Push键和重启键,然后松开重启键,再松开PUSH键 } if ( keys & HAL_KEY_SW_4 ) { newPanid=0x0012; newChannel=0x00000800;//0x0B //NLME_InitNV();//NV初始化 //NLME_SetDefaultNV();//设置默认nv osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);//写NV //zb_StartRequest();//协议栈重启,相当于按重启键 zb_SystemReset();//协议栈重启,这时NV存储器也会改变。 //改变NV的手动方法,同时按Push键和重启键,然后松开重启键,再松开PUSH键 } 清单 读取传感器测出的外界温度信息 /****************************************************************************** * 函数段 void zb_HandleKeys( uint8 shift, uint8 keys ) * 位置 APP/DemoSensor.c APP/DemoCollect.c * 描述 获取节点地址、PAN ID、信道等指示信息,并在屏幕上显示 *****************************************************************************/ if ( keys & HAL_KEY_SW_3 ) { zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr);//父节点地址 sprintf(printf_buf,"parent:-0x%X",tmpAddr);//格式化输出字符串 HalLcdWriteString(printf_buf,HAL_LCD_LINE_2); zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr); //节点地址 sprintf(printf_buf,"addr:-0x%X",tmpAddr); HalLcdWriteString(printf_buf,HAL_LCD_LINE_3); sprintf(printf_buf,"PAN ID:-0x%X",_NIB.nwkPanId);//输出PAN ID HalLcdWriteString(printf_buf,HAL_LCD_LINE_4); sprintf(printf_buf,"CHANNEL:0x%X",_NIB.nwkLogicalChannel);// 信道号 HalLcdWriteString(printf_buf,HAL_LCD_LINE_5); } 实验结果 为记录和分析两个信道上的实验结果,编者在两台PC上使用Packet Sniffer分别抓取信 道0x0B和0x18上的数据包。实验结果证明节点在与当前网络断开后,可跳转到另一个信 道上的网络;通过手动按键的方式,终端节点能够在两个信道上进行切换。 1. 节点1与节点2上电后,并按SW1(上)键后,会成为协调器,分别建立两个PAN网 络。网络建立成功后,网络PAN ID为0x0012,协调器地址为0x0000。 图 节点1在信道0x0B上建立网络 图 节点2在信道0x18上建立网络 2.节点3上电后,会与两个协调器关联。如图 所示,在信道0x0B上,节点3(MAC地址:0x00124B0001658C6D)向协调器节点1(MAC地址:0x00124B0001658C6D)提出关联请求。节点1收到关联请求后,向节点回应关联请求成功的命令帧。 图 节点3与协调器节点1进行关联 3.节点3加入协调器节点1建立的网络中,分配的网络短地址为0x796F,并向协调器发送数据请求的命令帧。如图 所示,发送的数据帧APS负载为16 25 00 00,分别代表片内温度,电压值,父节点设备地址。在串口调试助手中可以看出,协调器发送到串口中的相应位也为16 25 00 00。 图 节点3向协调器节点1发送数据 4.在抓包过程进行到大约40s时,协调器节点1被关闭。如图 所示,节点3向协调器连续发送数据请求,没有得到协调器的确认。此时,节点3向网络中发送孤立通知的命令帧。由于协调器节点1已经关闭,节点1也不会对孤立通知作出响应。 图 节点3与信道0x0B上的协调器节点断开连接 此时,如图 所示,在0x18信道上的节点2(MAC 地址:0x00124B0001E401A2)也收到了孤立通知的命令帧。由于协调器节点2与终端节点3进行过关联,会对节点3发送协调器重排列的命令。此时,节点3加入了信道0x18上的网络,其分配的网络短地址依然是0x796F。 图 节点3加入信道0x18上的网络 加入网络后,终端可以可向协调器节点请求并发送数据。 图 节点3向信道0x18上的协调器节点2发送数据 5.当按下节点3的SW2(右)键,节点3会自动重启并加入到0x18信道的网络上。此时,节点3会与0x0B信道上的网络断开,并发送孤立通知命令帧。节点3重启之后,设置在NV区的网络PAN ID和信道号恢复到网络存储器。 图 节点3与0x0B信道上的网络断开连接 节点3从NV区读取的网络号0x0012,信道号0x18。0x18信道上的协调器节点2会收 到节点3发送的孤立通知命令帧,并对节点3发送协调器重排列命令。之后,节点3加入到信道0x18上的网络,网络短地址为0x796F。 图 节点3重新加入到0x18上的网络 6.当按下节点3的SW4键,节点3会重新加入到信道0x0B上的网络。信道0x0B上的协调器节点1会收到节点3发送的孤立通知命令帧,并向节点3发送协调器重排列命令帧。节点3重启之后,PAN ID和信道号变为重启前的设定值,并成功加入网络,短地址为0x796F。 图 节点3切回到0x0B信道 实验问题 问题1:在ZDO/ZDApp.c中的continueJoining段中去掉ZDApp_NetworkInit( MANAG EDSCAN_DELAY_BETWEEN_SCANS )语句,关闭节点所在网络的协调器,终端节点能否自动跳转信道,如果不能跳转,节点重启之后,能否加入另外一个信道的协调器, 问题2:读者按照先节点1,后节点3,再节点2上电启动方式重复上述实验,节点能否实现信道自动切换。由此,读者能借助抓包数据,分析和解释终端节点必须与两个信道上的网络实现关联,才能实现的信道跳转吗, 提示:一个节点可能由于设备故障,节点配置等原因与协调器节点失去同步,会成为孤儿节点。孤儿节点的信息会保留在协调器设备的邻居表中,孤儿节点会向周围发送孤立通知,协调器收到孤立通知后查看邻居表,确定是否允许该设备加入网络。 问题3:读者去掉continueJoining程序段加入网络初始化ZDApp_NetworkInit语句,节点能否能够实现信道自动跳转。读者能够追踪节点与网络断开后,重新入网的流程吗, 提示:读者可以在SensorEB工程ZDApp.c/ZDApp_ProcessOSALMsg网络发现事件处理的代码段和ZDApp.c/ZDApp_ProcessNetworkJoin孤立节点加入网络代码段加入断点,并调试跟踪终端节点的流程,以验证自己的想法。 问题4:请读者改变终端节点默认的信道列表值,利用NV区设置信道值,观察节点能否跳转到一个不在默认信道上的建立的网络中,请读者利用NV区设置一个与其他信道不同的PAN ID值,观察节点重启后,能否加入到指定信道的网络中,请读者尝试利用在一个信道上通过设备不同的PAN ID值,能否在一个信道建立多个网络,并能够自动切换网络。 问题5:读者尝试添加或去掉zb_writeconfiguration,zb_StartRequest(),macRadioSetCha nnel(),NLME_InitNV();和NLME_SetDefaultNV();NV_INIT和NV_RESOTE等函数或编译选项,观察其对终端节点信道调度的影响。 问题6:实验步骤5描述的问题,利用NV区设置信道会影响节点的信道自动跳转吗,如果存在影响,读者能够提出解决此问题的方法吗,如果不能,请读者尝试别的信道方法吗, 提示:编者实验得出:如果去掉NV_INIT和NV_RESOTE,节点重启后,可重新加入网络,并能实现信道跳转。但是,手动设置信道不起作用;利用NV区函数NLME_InitNV();和NLME_SetDefaultNV();节点网络信道的属性值会发生改变,但是在跳转的信道上抓包,竟不会收到数据的奇怪现象。 对于本实验的问题2和问题6,编者目前尚未有很好的解决方法。使用了NV区设置后,当节点与网络断开连接后不再会重新加入其他网络。编者看来这貌似是一个“鱼和熊掌不可兼得”的命题。读者能够解决这一看似“不可调和”矛盾吗,如果可以,请联系我们。
/
本文档为【ZigBee网络多信道调度】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索