已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
8.4 ZigBee網(wǎng)絡(luò)多信道調(diào)度如果需要擴大ZigBee網(wǎng)絡(luò)規(guī)模,只要網(wǎng)絡(luò)PAN ID不同,在一個信道上建立多個PAN網(wǎng)絡(luò)的方式是可行的,但是,IEEE 802.15.4標準MAC層信道接入技術(shù)采用的是CSMA/CA機制,過多的節(jié)點勢必會造成嚴重的信道退避沖突。IEEE 802.15.4標準使用的2.4GHz頻段具有16個信道。因此,利用ZigBee多信道特性可以建立多個PAN網(wǎng)絡(luò)。根據(jù)多個網(wǎng)絡(luò)的負載程度,設(shè)置物理信道以選擇性加入網(wǎng)絡(luò),實現(xiàn)網(wǎng)絡(luò)負載相對平衡;當由于某種原因與網(wǎng)絡(luò)長時間斷開連接后,節(jié)點能夠自動地切換信道加入另一個可用網(wǎng)絡(luò),以增強網(wǎng)絡(luò)靈活性和可靠性。本節(jié)實驗主要講述節(jié)點利用協(xié)議棧網(wǎng)絡(luò)層自動切換信道和在應(yīng)用層設(shè)置信道兩種方式。實驗?zāi)康呐c器材1)實驗?zāi)康膗 深入理解Z-Stack節(jié)點入網(wǎng)過程以及信道概念。u 學(xué)會在Z-Stack中進行信道設(shè)置以及切換。u 理解并學(xué)會使用非易失性存儲器(NV)相關(guān)操作。u Z-Stack中使用標準C語言函數(shù)庫。2)實驗器材u 5個CC2530開發(fā)套件(2個協(xié)調(diào)器模塊,1個終端模塊,2個用于Packet Sniffer抓包)實驗原理與步驟1實驗原理1)網(wǎng)絡(luò)發(fā)現(xiàn)和節(jié)點信道自動切換協(xié)調(diào)器上電后,進行一系列的初始化設(shè)備,初始化網(wǎng)絡(luò)事件等過程后,請求建立形成一個新的網(wǎng)絡(luò)。當網(wǎng)絡(luò)建立成功后,就可以等待其他終端設(shè)備和路由器節(jié)點加入。終端設(shè)備在經(jīng)過一系列的初始化過程后,首先要請求網(wǎng)絡(luò)層執(zhí)行網(wǎng)絡(luò)掃描發(fā)現(xiàn)已經(jīng)存在的網(wǎng)絡(luò)。然后,終端設(shè)備根據(jù)網(wǎng)絡(luò)發(fā)現(xiàn)返回的網(wǎng)絡(luò)號、信道號等信息,請求加入網(wǎng)絡(luò)。如果加入網(wǎng)絡(luò)失敗,節(jié)點初始化網(wǎng)絡(luò)繼續(xù)上述過程。終端設(shè)備加入網(wǎng)絡(luò)后,如果與網(wǎng)絡(luò)斷開后,節(jié)點會初始化網(wǎng)絡(luò)等待再次加入先前的網(wǎng)絡(luò)。此時,如果在另一個信道上存在一個網(wǎng)絡(luò),終端設(shè)備可以選擇加入這個網(wǎng)絡(luò),從而實現(xiàn)信道自動切換,保證節(jié)點不離開ZigBee網(wǎng)絡(luò)。網(wǎng)絡(luò)啟動與節(jié)點加入流程函數(shù)基本上都在Z-Stack ZDApp.c文件中。讀者可以在這個文件的關(guān)鍵函數(shù)處加入斷點,追蹤程序流程。下面主要介紹終端設(shè)備的入網(wǎng)過程和無法自動調(diào)頻原因。(1)設(shè)備初始化終端設(shè)備上電后,在ZDApp_Init中調(diào)用初始化設(shè)備函數(shù):ZDOInitDevice( 0 );ZDOInitDevice函數(shù)主要完成初始化任務(wù)ID,網(wǎng)絡(luò)地址,網(wǎng)絡(luò)服務(wù),初始化NV,安全等參數(shù)。ZDOInitDevice函數(shù)最后觸發(fā)初始化網(wǎng)絡(luò)操作: ZDApp_NetworkInit( extendedDelay );此函數(shù)用于啟動網(wǎng)絡(luò)加入過程,extendedDelay代表在網(wǎng)絡(luò)啟動前需等待的時間。函數(shù)中啟動網(wǎng)絡(luò)初始事件ZDO_NETWORK_INIT。osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );ZDO層任務(wù)事件處理函數(shù)ZDApp_event_loop對網(wǎng)絡(luò)初始化事件進行處理,設(shè)置設(shè)備初始狀態(tài)為DEV_INIT。并啟動該設(shè)備 if ( events & ZDO_NETWORK_INIT ) devState = DEV_INIT; ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER ); return (events ZDO_NETWORK_INIT); (2)網(wǎng)絡(luò)發(fā)現(xiàn)如果是協(xié)調(diào)器,程序?qū){(diào)用NLME_NetworkFormationRequest函數(shù)請求建立網(wǎng)絡(luò)。如果是終端設(shè)備,程序會啟動網(wǎng)絡(luò)發(fā)現(xiàn)過程:在ZDO_StartDevice中,執(zhí)行 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 NLME_NetworkDiscoveryRequest()正是網(wǎng)絡(luò)發(fā)現(xiàn)過程中最為關(guān)鍵的函數(shù),但是由于TI并沒有給出該函數(shù)的具體實現(xiàn),所以對理解網(wǎng)絡(luò)發(fā)現(xiàn)的具體實現(xiàn)過程存在一定的困難。TI提供了ZDO_NetworkDiscoveryConfirmCB( )回調(diào)函數(shù)。該函數(shù)返回網(wǎng)絡(luò)發(fā)現(xiàn)的結(jié)果,包括網(wǎng)絡(luò)ID,網(wǎng)絡(luò)頻段等網(wǎng)絡(luò)重要信息。 在ZDO_NetworkDiscoveryConfirmCB( )中最后觸發(fā)函數(shù): ZDApp_SendMsg(ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (byte *)&msg );該函數(shù)向ZDAppTaskID任務(wù)投遞一個ZDO_NWK_DISC_CNF事件。(3)加入網(wǎng)絡(luò)在ZDApp_ProcessOSALMsg()函數(shù)中響應(yīng)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) ); 其中網(wǎng)絡(luò)的加入通過NLME_JoinRequest( )函數(shù)實現(xiàn),其參數(shù)logicalChannel就是加入網(wǎng)絡(luò)所在的頻段。如果成功加入網(wǎng)絡(luò),節(jié)點將會分配到網(wǎng)絡(luò)地址和端點等信息,設(shè)為成功加入網(wǎng)絡(luò)狀態(tài)。如果該函數(shù)執(zhí)行失敗,則調(diào)用初始化網(wǎng)絡(luò)函數(shù)ZDApp_NetworkInit( )重新尋找網(wǎng)絡(luò)。在ZDApp_NetworkInit( )函數(shù)中又會觸發(fā)ZDO_NETWORK_INIT事件,進入下一輪的網(wǎng)絡(luò)加入過程。(4)終端節(jié)點斷開網(wǎng)絡(luò)后,無法自動切換信道的原因終端節(jié)點與網(wǎng)絡(luò)斷開后,就會重新孤立掃描程序,由于先前沒有加入過網(wǎng)絡(luò),通過孤立掃描程序加入網(wǎng)絡(luò)失敗。終端節(jié)點重啟網(wǎng)絡(luò)發(fā)現(xiàn)過程,具體過程已在上文中詳細闡述。當再次執(zhí)行到網(wǎng)絡(luò)發(fā)現(xiàn)ZDO_NWK_DISC_CNF事件,而后在ZDApp_ProcessOSALMsg()函數(shù)中響應(yīng)該事件。如果此時網(wǎng)絡(luò)沒有恢復(fù),節(jié)點不再執(zhí)行網(wǎng)絡(luò)加入過程,而是執(zhí)行continueJoining代碼段,即執(zhí)行以下程序:case ZDO_NWK_DISC_CNF:.if ( (ZDO_NetworkDiscoveryCfm_t *)msgPtr)-hdr.status = ZDO_SUCCESS) & (zdoDiscCounter NUM_DISC_ATTEMPTS) ) /如果指示網(wǎng)絡(luò)發(fā)現(xiàn)不成功或者成功次數(shù)不符合規(guī)定 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是編譯選項,允許信道掃描延遲。從以上程序可以看到,當節(jié)點與父節(jié)點斷開連接后,子節(jié)點會不斷的重復(fù)執(zhí)行ZDApp_NetworkInit初始化網(wǎng)絡(luò),試圖加入先前的網(wǎng)絡(luò),直到與先前網(wǎng)絡(luò)重新建立連接。這就是終端節(jié)點無法加入到其他網(wǎng)絡(luò),實現(xiàn)自動切換信道的原因。在continueJoining函數(shù)段添加增加節(jié)點請求入網(wǎng)NLME_JoinRequest函數(shù),即可實現(xiàn)信道跳轉(zhuǎn),加入到其他網(wǎng)絡(luò)。2)使用NV區(qū)設(shè)置信道利用mac_low_level.h文件中macRadioSetChannel(uint8 channel),ZmacSetReq(ZMACChannel)能夠?qū)崿F(xiàn)信道設(shè)置。但是,這種在MAC層設(shè)置信道的方式可能會影響到上層一些其他函數(shù)執(zhí)行,產(chǎn)生一些嚴重后果。本節(jié)介紹利用非易失存儲器(Non Volatile,NV)設(shè)置信道,啟動節(jié)點實現(xiàn)應(yīng)用層設(shè)置信道。非易失存儲器,像硬盤,U盤(閃存)等存儲介質(zhì),掉電后其信息不丟失。而易失性存儲器,像內(nèi)存,斷電后存儲信息就會丟失。易失性存儲器有什么缺點呢?舉個例子說,你的IAR軟件在處于編輯時狀態(tài)時,會將Z-Stack工程從硬盤裝入到內(nèi)存中。如果突然停電了,你想起剛敲打的幾行代碼還沒有保存到硬盤上,這時的你會有怎樣的反應(yīng)呢?與此類似,Z-Stack把一些重要的系統(tǒng)參數(shù)存儲到NV中。存入NV的系統(tǒng)參數(shù)通常包括網(wǎng)絡(luò)NIB,組表,設(shè)備表,綁定表,Profile ID,網(wǎng)絡(luò)密匙等信息。節(jié)點不必每次重啟時都需重新配置如此多的參數(shù),能夠迅速恢復(fù)到掉電前的系統(tǒng)狀態(tài)。OSAL主要有以下幾個重要的NV函數(shù):1. osal_nv_item_init()初始化nv條目。 2. osal_nv_read()讀取nv條目。3. osal_nv_write()寫入nv條目。4. NLME_InitNV( void ) NV區(qū)初始化。5. NLME_SetDefaultNV()設(shè)置默認的NV區(qū)條目。6. NLME_RestoreFromNV()從NV區(qū)中恢復(fù)條目。使用這幾個函數(shù)時,讀者須加入NV_INIT和NV_RESTORE這兩個編譯選項。使用NV區(qū)設(shè)置信道,讀者可以把欲寫入的信道值使用osal_nv_write()函數(shù)寫入NV區(qū)中,然后使用Simple API中的zb_SystemReset()重啟系統(tǒng)。重啟之后,節(jié)點就可能在設(shè)定信道上工作。這里說“可能”的意思是節(jié)點設(shè)置的PAN ID和信道號,可能不存在于現(xiàn)存網(wǎng)絡(luò)中的PAN ID和信道集合。換句話說,節(jié)點不能加入到現(xiàn)存網(wǎng)絡(luò)。所以,PAN ID和信道設(shè)置要與現(xiàn)存網(wǎng)絡(luò)PAN ID和信道號一致。2程序流程本實驗是在TI Sensor Demo官方例程基礎(chǔ)上修改的。Sensor Demo工程主要分為傳感器節(jié)點(Sensor)和數(shù)據(jù)收集(Collect)節(jié)點兩種類型。Sensor節(jié)點為終端節(jié)點,采集溫度、光照等信息。Collect節(jié)點一般為路由器或協(xié)調(diào)器節(jié)點,主要用于數(shù)據(jù)匯集等。1)默認信道設(shè)置在f8wConfig.cfg配置文件中進行信道設(shè)置:/* 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位,如果使用某一信道,需將其對應(yīng)位(自右到左的順序,最右一位是信道0)置1即可。如果使用多個信道,需將多個位設(shè)置為1。這里編者設(shè)置了11和12兩個信道,信道列表值為0x00001800。如果使用2.4GHz所有的16個信道,信道列表值設(shè)置為0x07FFF100.為便于不同信道網(wǎng)絡(luò)切換,網(wǎng)絡(luò)PAN ID定義為固定值:-DZDAPP_CONFIG_PAN_ID=0x00122)終端節(jié)點自動切換信道在ZDApp.c中ZDApp_ProcessOSALMsg函數(shù)處理網(wǎng)絡(luò)發(fā)現(xiàn)的continueJoining 程序段中加入如下語句,使得與網(wǎng)絡(luò)斷開連接后節(jié)點加入其它網(wǎng)絡(luò):/進行網(wǎng)絡(luò)初始化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)(osal_rand()& BEACON_REQ_DELAY_MASK) ); #endif 當節(jié)點與父節(jié)點斷開連接后,子節(jié)點會首先進行網(wǎng)絡(luò)初始化,執(zhí)行continueJoining結(jié)構(gòu)中的語句。加入判斷語句后,子節(jié)點首先會執(zhí)行NLME_JoinRequest()函數(shù),該函數(shù)根據(jù)ZDO_NetworkDiscoveryConfirmCB( )所返回的網(wǎng)絡(luò)參數(shù)加入網(wǎng)絡(luò),子節(jié)點根據(jù)掃描到的信道和PANID來加入網(wǎng)絡(luò),從而實現(xiàn)信道的自動切換。當NLME_JoinRequest()的返回狀態(tài)不是Zsuccess,說明不在其他ZigBee網(wǎng)絡(luò)或者現(xiàn)存網(wǎng)絡(luò)不允許該節(jié)點加入。此時子節(jié)點執(zhí)行ZDApp_NetworkInit()函數(shù)來等待加入先前網(wǎng)絡(luò)。一旦先前網(wǎng)絡(luò)恢復(fù),子節(jié)點就會立即加入。如果程序中不添加ZDApp_NetworkInit函數(shù),節(jié)點不經(jīng)過重啟,將不會加入其它網(wǎng)絡(luò)。3)利用NV區(qū)設(shè)置信道信道設(shè)置較好的方式是根據(jù)網(wǎng)絡(luò)負載或信道干擾情況進行動態(tài)設(shè)置。由于篇幅限制,本實驗利用在DemoSensor.c的按鍵SW4函數(shù)中觸發(fā)。(1)定義信道號和PAN ID為便于節(jié)點在兩個信道11和12間切換,編者使用兩個按鍵觸發(fā)信道設(shè)置。SW2鍵:newChannel=0x01001000;/0x18SW4鍵: newChannel=0x00000800;/0x0B 定義網(wǎng)絡(luò)重啟后的網(wǎng)絡(luò)號,與在f8wConfig.cfg中配置PAN ID一致: newPanid=0x0012;/與協(xié)調(diào)器建立的PAN ID一致(2)NV區(qū)設(shè)置 將定義要寫入的網(wǎng)絡(luò)號和信道號寫入NV區(qū)中 osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);/寫NV上述函數(shù)需要包含在OSAL_Nv.h頭文件中,需要加入如下語句:#include OSAL_Nv.h/寫NV條目(3)設(shè)備重啟 最后,使用zb_SystemReset()函數(shù)進行協(xié)議棧重置。 zb_SystemReset();/協(xié)議棧重置, NV存儲器條目改變,相當于手動重置NV。/zb_StartRequest();/協(xié)議棧重啟,相當于按重啟鍵/zb_writeconfiguration(ZCD_NV_STARTUP_OPTION,sizeof(unit8);/從上次保存點恢復(fù)Simple API(TI在應(yīng)用層進一步封裝的函數(shù)接口)zb_SystemReset()與zb_StartRequest()都有重啟協(xié)議棧的功能。但是,zb_SystemReset()函數(shù)在重啟設(shè)備后NV區(qū)內(nèi)容會發(fā)生改變。而zb_StartRequest()只是重新請求啟動協(xié)議棧,不會改變NV區(qū)內(nèi)容,也就是說,諸如一些網(wǎng)絡(luò)地址,綁定表等系統(tǒng)參數(shù)不會發(fā)生改變。重置NV區(qū)也可使用手動方法:同時按下Push鍵和重啟鍵,然后松開重啟鍵,等待大約2s后,接著松開PUSH鍵。zb_writeconfiguration()為寫NV命令。如果具有ZCD_NV_STARTUP_OPTION選項,節(jié)點會從上一次保存狀態(tài)恢復(fù)NV區(qū)狀態(tài),本次寫入時會自動保存網(wǎng)絡(luò)狀態(tài)。如果不寫入ZCD_NV_STARTUP_OPTION選項,節(jié)點會重新啟動一個新網(wǎng)絡(luò)。4)獲取節(jié)點地址、PAN ID、信道等指示信息(1)獲取節(jié)點地址使用zb_GetDeviceInfo()獲取節(jié)點網(wǎng)絡(luò)地址信息。函數(shù)原型為:void zb_GetDeviceInfo ( uint8 param, void *pValue )參數(shù)param為設(shè)備信息標識符,pValue為存儲設(shè)備信息的緩沖區(qū)。節(jié)點自身網(wǎng)絡(luò)地址,和父節(jié)點網(wǎng)絡(luò)地址都是16位短地址。因此,它們可共用一個緩沖區(qū):uint16 tmpAddr=0xffff;其標識符分別為ZB_INFO_SHORT_ADDR,ZB_INFO_PARENT_SHORT_ADDR。因此,獲取節(jié)點自身地址和父節(jié)點地址函數(shù)可寫為:zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr);zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr);(2)獲取節(jié)點當前PAN ID和信道號PAN ID和信道號存在網(wǎng)絡(luò)層信息庫(NIB)中,可以直接從NIB信息庫中讀出。在nwk.h頭文件中網(wǎng)絡(luò)信息描述符為:extern nwkIB_t _NIB;typedef struct. / non-settable uint16 nwkDevAddress; byte nwkLogicalChannel; uint16 nwkCoordAddress; byte nwkCoordExtAddressZ_EXTADDR_LEN;uint16 nwkPanId;.讀者可以發(fā)現(xiàn)這幾個參數(shù)是不能夠設(shè)置的。PAN ID和信道號可直接使用_NIB.nwkPanId和_NIB.nwkLogicalChannel。在程序中,需要加入“nwk.h”頭文件。(3)十六進制格式化輸出信息上述網(wǎng)絡(luò)地址信息,信道號,網(wǎng)絡(luò)號使用十六進制在屏幕上輸出比較直觀。Z-Stack應(yīng)用開發(fā)使用C語言進行編程,那么調(diào)用常用的C語言庫函數(shù)?答案是肯定的。C語言中sprintf()函數(shù)經(jīng)常用來格式化輸出字符串。函數(shù)原型如下:int sprintf( char *buffer, const char *format, argument );buffer是指向?qū)懭胱址木彌_區(qū),format說明寫入字符串格式。sprintf函數(shù)需要加入stdio.h頭文件。讀者可申請一個打印緩沖區(qū),專門用于在屏幕上輸出格式化字符串。static uint8 printf_buf32;如信道號就可以按照下面方式在屏幕上輸出:sprintf(printf_buf,CHANNEL:0x%X,_NIB.nwkLogicalChannel);3實驗步驟本實驗使用三個開發(fā)套件,兩個節(jié)點下載Collect程序,成為協(xié)調(diào)器,分別建立PAN網(wǎng)絡(luò),在信道11、12工作。剩余一個節(jié)點下載Sensor程序,成為終端設(shè)備,默認工作信道為信道11和信道12。終端設(shè)備能夠動態(tài)加入信道11和12上的網(wǎng)絡(luò)。1)將實驗?zāi)夸浵碌南鄳?yīng)代碼依照readme.txt中的說明,拷貝到Sensor Demo對應(yīng)的文件夾下。如果出現(xiàn)編譯不成功情況,很可能沒有加入編譯選項:NV_INIT,NV_RESTORE,MANAGED_SCAN。MANAGED_SCAN 只需加入到CollectEB工程編譯選項中。2)按照如表 所示,在配置f8wConfig.cfg中設(shè)置默認信道列表并按照工程類型依次下載到相應(yīng)的設(shè)備中。表 節(jié)點的信道設(shè)置節(jié)點設(shè)備類型工程類型信道設(shè)置信道號節(jié)點1協(xié)調(diào)器CollectEBDEFAULT_CHANLIST=0x0000080011(0x0B)節(jié)點2協(xié)調(diào)器CollectEBDEFAULT_CHANLIST=0x0100000024(0x18)節(jié)點3終端設(shè)備SensorEBDEFAULT_CHANLIST=0x0100080011、24然后,定義網(wǎng)絡(luò)PAN ID:-DZDAPP_CONFIG_PAN_ID=0x00123)節(jié)點1和2上電后,分別按下節(jié)點1,2的SW1(上)鍵,它們重啟之后,會成為協(xié)調(diào)器,并建立PAN網(wǎng)絡(luò)。按下SW3(下)鍵,屏幕上出現(xiàn)它們的網(wǎng)絡(luò)地址為”0x0000”, PAN ID“0x0012”,信道號“0x0B”或“0x18”。4)將節(jié)點3上電,觀察節(jié)點3會加入上述哪個信道上的網(wǎng)絡(luò)。然后,將關(guān)閉那個信道上的協(xié)調(diào)器節(jié)點。觀察節(jié)點3能否會立即切換到另一個信道,加入此信道上的網(wǎng)絡(luò)。5)按下節(jié)點3的SW4(左)鍵和SW2(右)鍵,觀察節(jié)點能否在兩個信道上的網(wǎng)絡(luò)進行切換。按照步驟4的方式,再次關(guān)閉協(xié)調(diào)器節(jié)點,觀察節(jié)點3還能否自動跳轉(zhuǎn)信道。6)去掉編譯選項NV_INIT和NV_RESTORE,重復(fù)上述實驗,觀察節(jié)點3能否自動跳轉(zhuǎn)信道。4程序清單清單 終端節(jié)點自動切換信道/* 函數(shù)段 void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )* 位置 ZDO/ZDApp.c * 描述 處理網(wǎng)絡(luò)發(fā)現(xiàn)事件,節(jié)點斷開網(wǎng)絡(luò)后,可自動跳頻加入其它網(wǎng)絡(luò) */if ( continueJoining ) /進行網(wǎng)絡(luò)初始化ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS ); if ( NLME_JoinRequest( (ZDO_NetworkDiscoveryCfm_t *)msgPtr)-extendedPANID,BUILD_UINT16( (ZDO_NetworkDiscoveryCfm_t *)msgPtr)-panIdLSB, (ZDO_NetworkDiscoveryCfm_t *)msgPtr)-panIdMSB ),(ZDO_NetworkDiscoveryCfm_t *)msgPtr)-logicalChannel,ZDO_Config_Node_Descriptor.CapabilityFlags ) != ZSuccess ) #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 清單 利用NV區(qū)設(shè)置信道/* * 函數(shù)段 void zb_HandleKeys( uint8 shift, uint8 keys )* 位置 APP/DemoSensor.c * 描述 定義并寫入NV區(qū)信道號,初始化并重啟NV條目,實現(xiàn)信道設(shè)置*/ if ( keys & HAL_KEY_SW_2 ) newPanid=0x0012; newChannel=0x00001000;/0x0C /NLME_InitNV();/NV初始化 /NLME_SetDefaultNV();/設(shè)置默認nv osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);/寫NV /zb_StartRequest();/協(xié)議棧重啟,相當于按重啟鍵 zb_SystemReset();/協(xié)議棧重啟,這時NV存儲器也會改變。/改變NV的手動方法,同時按Push鍵和重啟鍵,然后松開重啟鍵,再松開PUSH鍵 if ( keys & HAL_KEY_SW_4 ) newPanid=0x0012; newChannel=0x00000800;/0x0B /NLME_InitNV();/NV初始化 /NLME_SetDefaultNV();/設(shè)置默認nv osal_nv_write(ZCD_NV_PANID, 0, sizeof(newPanid), &newPanid); osal_nv_write(ZCD_NV_CHANLIST,0,sizeof(newChannel),&newChannel);/寫NV /zb_StartRequest();/協(xié)議棧重啟,相當于按重啟鍵 zb_SystemReset();/協(xié)議棧重啟,這時NV存儲器也會改變。/改變NV的手動方法,同時按Push鍵和重啟鍵,然后松開重啟鍵,再松開PUSH鍵 清單 讀取傳感器測出的外界溫度信息/* * 函數(shù)段 void zb_HandleKeys( uint8 shift, uint8 keys )* 位置 APP/DemoSensor.c APP/DemoCollect.c * 描述 獲取節(jié)點地址、PAN ID、信道等指示信息,并在屏幕上顯示*/ if ( keys & HAL_KEY_SW_3 ) zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr);/父節(jié)點地址 sprintf(printf_buf,parent:-0x%X,tmpAddr);/格式化輸出字符串 HalLcdWriteString(printf_buf,HAL_LCD_LINE_2); zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr); /節(jié)點地址 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); 實驗結(jié)果為記錄和分析兩個信道上的實驗結(jié)果,編者在兩臺PC上使用Packet Sniffer分別抓取信道0x0B和0x18上的數(shù)據(jù)包。實驗結(jié)果證明節(jié)點在與當前網(wǎng)絡(luò)斷開后,可跳轉(zhuǎn)到另一個信道上的網(wǎng)絡(luò);通過手動按鍵的方式,終端節(jié)點能夠在兩個信道上進行切換。1. 節(jié)點1與節(jié)點2上電后,并按SW1(上)鍵后,會成為協(xié)調(diào)器,分別建立兩個PAN網(wǎng)絡(luò)。網(wǎng)絡(luò)建立成功后,網(wǎng)絡(luò)PAN ID為0x0012,協(xié)調(diào)器地址為0x0000。圖 節(jié)點1在信道0x0B上建立網(wǎng)絡(luò)圖 節(jié)點2在信道0x18上建立網(wǎng)絡(luò)2.節(jié)點3上電后,會與兩個協(xié)調(diào)器關(guān)聯(lián)。如圖 所示,在信道0x0B上,節(jié)點3(MAC地址:0x00124B0001658C6D)向協(xié)調(diào)器節(jié)點1(MAC地址:0x00124B0001658C6D)提出關(guān)聯(lián)請求。節(jié)點1收到關(guān)聯(lián)請求后,向節(jié)點回應(yīng)關(guān)聯(lián)請求成功的命令幀。圖 節(jié)點3與協(xié)調(diào)器節(jié)點1進行關(guān)聯(lián)3.節(jié)點3加入?yún)f(xié)調(diào)器節(jié)點1建立的網(wǎng)絡(luò)中,分配的網(wǎng)絡(luò)短地址為0x796F,并向協(xié)調(diào)器發(fā)送數(shù)據(jù)請求的命令幀。如圖 所示,發(fā)送的數(shù)據(jù)幀APS負載為16 25 00 00,分別代表片內(nèi)溫度,電壓值,父節(jié)點設(shè)備地址。在串口調(diào)試助手中可以看出,協(xié)調(diào)器發(fā)送到串口中的相應(yīng)位也為16 25 00 00。圖 節(jié)點3向協(xié)調(diào)器節(jié)點1發(fā)送數(shù)據(jù)4.在抓包過程進行到大約40s時,協(xié)調(diào)器節(jié)點1被關(guān)閉。如圖 所示,節(jié)點3向協(xié)調(diào)器連續(xù)發(fā)送數(shù)據(jù)請求,沒有得到協(xié)調(diào)器的確認。此時,節(jié)點3向網(wǎng)絡(luò)中發(fā)送孤立通知的命令幀。由于協(xié)調(diào)器節(jié)點1已經(jīng)關(guān)閉,節(jié)點1也不會對孤立通知作出響應(yīng)。圖 節(jié)點3與信道0x0B上的協(xié)調(diào)器節(jié)點斷開連接此時,如圖 所示,在0x18信道上的節(jié)點2(MAC 地址:0x00124B0001E401A2)也收到了孤立通知的命令幀。由于協(xié)調(diào)器節(jié)點2與終端節(jié)點3進行過關(guān)聯(lián),會對節(jié)點3發(fā)送協(xié)調(diào)器重排列的命令。此時,節(jié)點3加入了信道0x18上的網(wǎng)絡(luò),其分配的網(wǎng)絡(luò)短地址依然是0x796F。圖 節(jié)點3加入信道0x18上的網(wǎng)絡(luò)加入網(wǎng)絡(luò)后,終端可以可向協(xié)調(diào)器節(jié)點請求并發(fā)送數(shù)據(jù)。圖 節(jié)點3向信道0x18上的協(xié)調(diào)器節(jié)點2發(fā)送數(shù)據(jù)5.當按下節(jié)點3的SW2(右)鍵,節(jié)點3會自動重啟并加入到0x18信道的網(wǎng)絡(luò)上。此時,節(jié)點3會與0x0B信道上的網(wǎng)絡(luò)斷開,并發(fā)送孤立通知命令幀。節(jié)點3重啟之后,設(shè)置在NV區(qū)的網(wǎng)絡(luò)PAN ID和信道號恢復(fù)到網(wǎng)絡(luò)存儲器。圖 節(jié)點3與0x0B信道上的網(wǎng)絡(luò)斷開連接節(jié)點3從NV區(qū)讀取的網(wǎng)絡(luò)號0x0012,信道號0x18。0x18信道上的協(xié)調(diào)器節(jié)點2會收到節(jié)點3發(fā)送的孤立通知命令幀,并對節(jié)點3發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024適用型貸款利息合同書樣本版
- 2025年度彩色印刷設(shè)備升級改造合同3篇
- 2024年度城市基礎(chǔ)設(shè)施建設(shè)項目合同
- 二零二五年度綠色能源開發(fā)項目承包合同范本3篇
- 2025年度航空航天零部件定制設(shè)計與運輸服務(wù)合同3篇
- 2024物業(yè)委托經(jīng)營管理合同
- 2025年水果種植基地與冷鏈物流公司合作合同3篇
- 二零二五版科技型企業(yè)貸款合同中的物權(quán)擔(dān)保與研發(fā)成果3篇
- 2025年蔬菜廢棄物資源化利用合作合同3篇
- 二零二五年版市政工程招標投標合同模板3篇
- 物業(yè)民法典知識培訓(xùn)課件
- 2023年初中畢業(yè)生信息技術(shù)中考知識點詳解
- 2024-2025學(xué)年山東省德州市高中五校高二上學(xué)期期中考試地理試題(解析版)
- 《萬方數(shù)據(jù)資源介紹》課件
- 麻風(fēng)病病情分析
- 《急診科建設(shè)與設(shè)備配置標準》
- 第一章-地震工程學(xué)概論
- JJF(陜) 063-2021 漆膜沖擊器校準規(guī)范
- TSGD7002-2023-壓力管道元件型式試驗規(guī)則
- 2024年度家庭醫(yī)生簽約服務(wù)培訓(xùn)課件
- 建筑工地節(jié)前停工安全檢查表
評論
0/150
提交評論