




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
8.4 ZigBee網(wǎng)絡(luò)多信道調(diào)度如果需要擴(kuò)大ZigBee網(wǎng)絡(luò)規(guī)模,只要網(wǎng)絡(luò)PAN ID不同,在一個(gè)信道上建立多個(gè)PAN網(wǎng)絡(luò)的方式是可行的,但是,IEEE 802.15.4標(biāo)準(zhǔn)MAC層信道接入技術(shù)采用的是CSMA/CA機(jī)制,過多的節(jié)點(diǎn)勢(shì)必會(huì)造成嚴(yán)重的信道退避沖突。IEEE 802.15.4標(biāo)準(zhǔn)使用的2.4GHz頻段具有16個(gè)信道。因此,利用ZigBee多信道特性可以建立多個(gè)PAN網(wǎng)絡(luò)。根據(jù)多個(gè)網(wǎng)絡(luò)的負(fù)載程度,設(shè)置物理信道以選擇性加入網(wǎng)絡(luò),實(shí)現(xiàn)網(wǎng)絡(luò)負(fù)載相對(duì)平衡;當(dāng)由于某種原因與網(wǎng)絡(luò)長(zhǎng)時(shí)間斷開連接后,節(jié)點(diǎn)能夠自動(dòng)地切換信道加入另一個(gè)可用網(wǎng)絡(luò),以增強(qiáng)網(wǎng)絡(luò)靈活性和可靠性。本節(jié)實(shí)驗(yàn)主要講述節(jié)點(diǎn)利用協(xié)議棧網(wǎng)絡(luò)層自動(dòng)切換信道和在應(yīng)用層設(shè)置信道兩種方式。實(shí)驗(yàn)?zāi)康呐c器材1)實(shí)驗(yàn)?zāi)康膗 深入理解Z-Stack節(jié)點(diǎn)入網(wǎng)過程以及信道概念。u 學(xué)會(huì)在Z-Stack中進(jìn)行信道設(shè)置以及切換。u 理解并學(xué)會(huì)使用非易失性存儲(chǔ)器(NV)相關(guān)操作。u Z-Stack中使用標(biāo)準(zhǔn)C語言函數(shù)庫。2)實(shí)驗(yàn)器材u 5個(gè)CC2530開發(fā)套件(2個(gè)協(xié)調(diào)器模塊,1個(gè)終端模塊,2個(gè)用于Packet Sniffer抓包)實(shí)驗(yàn)原理與步驟1實(shí)驗(yàn)原理1)網(wǎng)絡(luò)發(fā)現(xiàn)和節(jié)點(diǎn)信道自動(dòng)切換協(xié)調(diào)器上電后,進(jìn)行一系列的初始化設(shè)備,初始化網(wǎng)絡(luò)事件等過程后,請(qǐng)求建立形成一個(gè)新的網(wǎng)絡(luò)。當(dāng)網(wǎng)絡(luò)建立成功后,就可以等待其他終端設(shè)備和路由器節(jié)點(diǎn)加入。終端設(shè)備在經(jīng)過一系列的初始化過程后,首先要請(qǐ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ò)號(hào)、信道號(hào)等信息,請(qǐng)求加入網(wǎng)絡(luò)。如果加入網(wǎng)絡(luò)失敗,節(jié)點(diǎn)初始化網(wǎng)絡(luò)繼續(xù)上述過程。終端設(shè)備加入網(wǎng)絡(luò)后,如果與網(wǎng)絡(luò)斷開后,節(jié)點(diǎn)會(huì)初始化網(wǎng)絡(luò)等待再次加入先前的網(wǎng)絡(luò)。此時(shí),如果在另一個(gè)信道上存在一個(gè)網(wǎng)絡(luò),終端設(shè)備可以選擇加入這個(gè)網(wǎng)絡(luò),從而實(shí)現(xiàn)信道自動(dòng)切換,保證節(jié)點(diǎn)不離開ZigBee網(wǎng)絡(luò)。網(wǎng)絡(luò)啟動(dòng)與節(jié)點(diǎn)加入流程函數(shù)基本上都在Z-Stack ZDApp.c文件中。讀者可以在這個(gè)文件的關(guān)鍵函數(shù)處加入斷點(diǎn),追蹤程序流程。下面主要介紹終端設(shè)備的入網(wǎng)過程和無法自動(dò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ù)用于啟動(dòng)網(wǎng)絡(luò)加入過程,extendedDelay代表在網(wǎng)絡(luò)啟動(dòng)前需等待的時(shí)間。函數(shù)中啟動(dòng)網(wǎng)絡(luò)初始事件ZDO_NETWORK_INIT。osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );ZDO層任務(wù)事件處理函數(shù)ZDApp_event_loop對(duì)網(wǎng)絡(luò)初始化事件進(jìn)行處理,設(shè)置設(shè)備初始狀態(tài)為DEV_INIT。并啟動(dòng)該設(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ū)?huì)調(diào)用NLME_NetworkFormationRequest函數(shù)請(qǐng)求建立網(wǎng)絡(luò)。如果是終端設(shè)備,程序會(huì)啟動(dòng)網(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ù)的具體實(shí)現(xiàn),所以對(duì)理解網(wǎng)絡(luò)發(fā)現(xiàn)的具體實(shí)現(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ù)投遞一個(gè)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ù)實(shí)現(xiàn),其參數(shù)logicalChannel就是加入網(wǎng)絡(luò)所在的頻段。如果成功加入網(wǎng)絡(luò),節(jié)點(diǎn)將會(huì)分配到網(wǎng)絡(luò)地址和端點(diǎn)等信息,設(shè)為成功加入網(wǎng)絡(luò)狀態(tài)。如果該函數(shù)執(zhí)行失敗,則調(diào)用初始化網(wǎng)絡(luò)函數(shù)ZDApp_NetworkInit( )重新尋找網(wǎng)絡(luò)。在ZDApp_NetworkInit( )函數(shù)中又會(huì)觸發(fā)ZDO_NETWORK_INIT事件,進(jìn)入下一輪的網(wǎng)絡(luò)加入過程。(4)終端節(jié)點(diǎn)斷開網(wǎng)絡(luò)后,無法自動(dòng)切換信道的原因終端節(jié)點(diǎn)與網(wǎng)絡(luò)斷開后,就會(huì)重新孤立掃描程序,由于先前沒有加入過網(wǎng)絡(luò),通過孤立掃描程序加入網(wǎng)絡(luò)失敗。終端節(jié)點(diǎn)重啟網(wǎng)絡(luò)發(fā)現(xiàn)過程,具體過程已在上文中詳細(xì)闡述。當(dāng)再次執(zhí)行到網(wǎng)絡(luò)發(fā)現(xiàn)ZDO_NWK_DISC_CNF事件,而后在ZDApp_ProcessOSALMsg()函數(shù)中響應(yīng)該事件。如果此時(shí)網(wǎng)絡(luò)沒有恢復(fù),節(jié)點(diǎn)不再執(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是編譯選項(xiàng),允許信道掃描延遲。從以上程序可以看到,當(dāng)節(jié)點(diǎn)與父節(jié)點(diǎn)斷開連接后,子節(jié)點(diǎn)會(huì)不斷的重復(fù)執(zhí)行ZDApp_NetworkInit初始化網(wǎng)絡(luò),試圖加入先前的網(wǎng)絡(luò),直到與先前網(wǎng)絡(luò)重新建立連接。這就是終端節(jié)點(diǎn)無法加入到其他網(wǎng)絡(luò),實(shí)現(xiàn)自動(dòng)切換信道的原因。在continueJoining函數(shù)段添加增加節(jié)點(diǎn)請(qǐng)求入網(wǎng)NLME_JoinRequest函數(shù),即可實(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è)置信道的方式可能會(huì)影響到上層一些其他函數(shù)執(zhí)行,產(chǎn)生一些嚴(yán)重后果。本節(jié)介紹利用非易失存儲(chǔ)器(Non Volatile,NV)設(shè)置信道,啟動(dòng)節(jié)點(diǎn)實(shí)現(xiàn)應(yīng)用層設(shè)置信道。非易失存儲(chǔ)器,像硬盤,U盤(閃存)等存儲(chǔ)介質(zhì),掉電后其信息不丟失。而易失性存儲(chǔ)器,像內(nèi)存,斷電后存儲(chǔ)信息就會(huì)丟失。易失性存儲(chǔ)器有什么缺點(diǎn)呢?舉個(gè)例子說,你的IAR軟件在處于編輯時(shí)狀態(tài)時(shí),會(huì)將Z-Stack工程從硬盤裝入到內(nèi)存中。如果突然停電了,你想起剛敲打的幾行代碼還沒有保存到硬盤上,這時(shí)的你會(huì)有怎樣的反應(yīng)呢?與此類似,Z-Stack把一些重要的系統(tǒng)參數(shù)存儲(chǔ)到NV中。存入NV的系統(tǒng)參數(shù)通常包括網(wǎng)絡(luò)NIB,組表,設(shè)備表,綁定表,Profile ID,網(wǎng)絡(luò)密匙等信息。節(jié)點(diǎn)不必每次重啟時(shí)都需重新配置如此多的參數(shù),能夠迅速恢復(fù)到掉電前的系統(tǒng)狀態(tài)。OSAL主要有以下幾個(gè)重要的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è)置默認(rèn)的NV區(qū)條目。6. NLME_RestoreFromNV()從NV區(qū)中恢復(fù)條目。使用這幾個(gè)函數(shù)時(shí),讀者須加入NV_INIT和NV_RESTORE這兩個(gè)編譯選項(xiàng)。使用NV區(qū)設(shè)置信道,讀者可以把欲寫入的信道值使用osal_nv_write()函數(shù)寫入NV區(qū)中,然后使用Simple API中的zb_SystemReset()重啟系統(tǒng)。重啟之后,節(jié)點(diǎn)就可能在設(shè)定信道上工作。這里說“可能”的意思是節(jié)點(diǎn)設(shè)置的PAN ID和信道號(hào),可能不存在于現(xiàn)存網(wǎng)絡(luò)中的PAN ID和信道集合。換句話說,節(jié)點(diǎn)不能加入到現(xiàn)存網(wǎng)絡(luò)。所以,PAN ID和信道設(shè)置要與現(xiàn)存網(wǎng)絡(luò)PAN ID和信道號(hào)一致。2程序流程本實(shí)驗(yàn)是在TI Sensor Demo官方例程基礎(chǔ)上修改的。Sensor Demo工程主要分為傳感器節(jié)點(diǎn)(Sensor)和數(shù)據(jù)收集(Collect)節(jié)點(diǎn)兩種類型。Sensor節(jié)點(diǎn)為終端節(jié)點(diǎn),采集溫度、光照等信息。Collect節(jié)點(diǎn)一般為路由器或協(xié)調(diào)器節(jié)點(diǎn),主要用于數(shù)據(jù)匯集等。1)默認(rèn)信道設(shè)置在f8wConfig.cfg配置文件中進(jìn)行信道設(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信道列表值共計(jì)32位,如果使用某一信道,需將其對(duì)應(yīng)位(自右到左的順序,最右一位是信道0)置1即可。如果使用多個(gè)信道,需將多個(gè)位設(shè)置為1。這里編者設(shè)置了11和12兩個(gè)信道,信道列表值為0x00001800。如果使用2.4GHz所有的16個(gè)信道,信道列表值設(shè)置為0x07FFF100.為便于不同信道網(wǎng)絡(luò)切換,網(wǎng)絡(luò)PAN ID定義為固定值:-DZDAPP_CONFIG_PAN_ID=0x00122)終端節(jié)點(diǎn)自動(dòng)切換信道在ZDApp.c中ZDApp_ProcessOSALMsg函數(shù)處理網(wǎng)絡(luò)發(fā)現(xiàn)的continueJoining 程序段中加入如下語句,使得與網(wǎng)絡(luò)斷開連接后節(jié)點(diǎn)加入其它網(wǎng)絡(luò):/進(jìn)行網(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 當(dāng)節(jié)點(diǎn)與父節(jié)點(diǎn)斷開連接后,子節(jié)點(diǎn)會(huì)首先進(jìn)行網(wǎng)絡(luò)初始化,執(zhí)行continueJoining結(jié)構(gòu)中的語句。加入判斷語句后,子節(jié)點(diǎn)首先會(huì)執(zhí)行NLME_JoinRequest()函數(shù),該函數(shù)根據(jù)ZDO_NetworkDiscoveryConfirmCB( )所返回的網(wǎng)絡(luò)參數(shù)加入網(wǎng)絡(luò),子節(jié)點(diǎn)根據(jù)掃描到的信道和PANID來加入網(wǎng)絡(luò),從而實(shí)現(xiàn)信道的自動(dòng)切換。當(dāng)NLME_JoinRequest()的返回狀態(tài)不是Zsuccess,說明不在其他ZigBee網(wǎng)絡(luò)或者現(xiàn)存網(wǎng)絡(luò)不允許該節(jié)點(diǎn)加入。此時(shí)子節(jié)點(diǎn)執(zhí)行ZDApp_NetworkInit()函數(shù)來等待加入先前網(wǎng)絡(luò)。一旦先前網(wǎng)絡(luò)恢復(fù),子節(jié)點(diǎn)就會(huì)立即加入。如果程序中不添加ZDApp_NetworkInit函數(shù),節(jié)點(diǎn)不經(jīng)過重啟,將不會(huì)加入其它網(wǎng)絡(luò)。3)利用NV區(qū)設(shè)置信道信道設(shè)置較好的方式是根據(jù)網(wǎng)絡(luò)負(fù)載或信道干擾情況進(jìn)行動(dòng)態(tài)設(shè)置。由于篇幅限制,本實(shí)驗(yàn)利用在DemoSensor.c的按鍵SW4函數(shù)中觸發(fā)。(1)定義信道號(hào)和PAN ID為便于節(jié)點(diǎn)在兩個(gè)信道11和12間切換,編者使用兩個(gè)按鍵觸發(fā)信道設(shè)置。SW2鍵:newChannel=0x01001000;/0x18SW4鍵: newChannel=0x00000800;/0x0B 定義網(wǎng)絡(luò)重啟后的網(wǎng)絡(luò)號(hào),與在f8wConfig.cfg中配置PAN ID一致: newPanid=0x0012;/與協(xié)調(diào)器建立的PAN ID一致(2)NV區(qū)設(shè)置 將定義要寫入的網(wǎng)絡(luò)號(hào)和信道號(hào)寫入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ù)進(jìn)行協(xié)議棧重置。 zb_SystemReset();/協(xié)議棧重置, NV存儲(chǔ)器條目改變,相當(dāng)于手動(dòng)重置NV。/zb_StartRequest();/協(xié)議棧重啟,相當(dāng)于按重啟鍵/zb_writeconfiguration(ZCD_NV_STARTUP_OPTION,sizeof(unit8);/從上次保存點(diǎn)恢復(fù)Simple API(TI在應(yīng)用層進(jìn)一步封裝的函數(shù)接口)zb_SystemReset()與zb_StartRequest()都有重啟協(xié)議棧的功能。但是,zb_SystemReset()函數(shù)在重啟設(shè)備后NV區(qū)內(nèi)容會(huì)發(fā)生改變。而zb_StartRequest()只是重新請(qǐng)求啟動(dòng)協(xié)議棧,不會(huì)改變NV區(qū)內(nèi)容,也就是說,諸如一些網(wǎng)絡(luò)地址,綁定表等系統(tǒng)參數(shù)不會(huì)發(fā)生改變。重置NV區(qū)也可使用手動(dòng)方法:同時(shí)按下Push鍵和重啟鍵,然后松開重啟鍵,等待大約2s后,接著松開PUSH鍵。zb_writeconfiguration()為寫NV命令。如果具有ZCD_NV_STARTUP_OPTION選項(xiàng),節(jié)點(diǎn)會(huì)從上一次保存狀態(tài)恢復(fù)NV區(qū)狀態(tài),本次寫入時(shí)會(huì)自動(dòng)保存網(wǎng)絡(luò)狀態(tài)。如果不寫入ZCD_NV_STARTUP_OPTION選項(xiàng),節(jié)點(diǎn)會(huì)重新啟動(dòng)一個(gè)新網(wǎng)絡(luò)。4)獲取節(jié)點(diǎn)地址、PAN ID、信道等指示信息(1)獲取節(jié)點(diǎn)地址使用zb_GetDeviceInfo()獲取節(jié)點(diǎn)網(wǎng)絡(luò)地址信息。函數(shù)原型為:void zb_GetDeviceInfo ( uint8 param, void *pValue )參數(shù)param為設(shè)備信息標(biāo)識(shí)符,pValue為存儲(chǔ)設(shè)備信息的緩沖區(qū)。節(jié)點(diǎn)自身網(wǎng)絡(luò)地址,和父節(jié)點(diǎn)網(wǎng)絡(luò)地址都是16位短地址。因此,它們可共用一個(gè)緩沖區(qū):uint16 tmpAddr=0xffff;其標(biāo)識(shí)符分別為ZB_INFO_SHORT_ADDR,ZB_INFO_PARENT_SHORT_ADDR。因此,獲取節(jié)點(diǎn)自身地址和父節(jié)點(diǎn)地址函數(shù)可寫為:zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr);zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr);(2)獲取節(jié)點(diǎn)當(dāng)前PAN ID和信道號(hào)PAN ID和信道號(hào)存在網(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)這幾個(gè)參數(shù)是不能夠設(shè)置的。PAN ID和信道號(hào)可直接使用_NIB.nwkPanId和_NIB.nwkLogicalChannel。在程序中,需要加入“nwk.h”頭文件。(3)十六進(jìn)制格式化輸出信息上述網(wǎng)絡(luò)地址信息,信道號(hào),網(wǎng)絡(luò)號(hào)使用十六進(jìn)制在屏幕上輸出比較直觀。Z-Stack應(yīng)用開發(fā)使用C語言進(jìn)行編程,那么調(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ǐng)一個(gè)打印緩沖區(qū),專門用于在屏幕上輸出格式化字符串。static uint8 printf_buf32;如信道號(hào)就可以按照下面方式在屏幕上輸出:sprintf(printf_buf,CHANNEL:0x%X,_NIB.nwkLogicalChannel);3實(shí)驗(yàn)步驟本實(shí)驗(yàn)使用三個(gè)開發(fā)套件,兩個(gè)節(jié)點(diǎn)下載Collect程序,成為協(xié)調(diào)器,分別建立PAN網(wǎng)絡(luò),在信道11、12工作。剩余一個(gè)節(jié)點(diǎn)下載Sensor程序,成為終端設(shè)備,默認(rèn)工作信道為信道11和信道12。終端設(shè)備能夠動(dòng)態(tài)加入信道11和12上的網(wǎng)絡(luò)。1)將實(shí)驗(yàn)?zāi)夸浵碌南鄳?yīng)代碼依照readme.txt中的說明,拷貝到Sensor Demo對(duì)應(yīng)的文件夾下。如果出現(xiàn)編譯不成功情況,很可能沒有加入編譯選項(xiàng):NV_INIT,NV_RESTORE,MANAGED_SCAN。MANAGED_SCAN 只需加入到CollectEB工程編譯選項(xiàng)中。2)按照如表 所示,在配置f8wConfig.cfg中設(shè)置默認(rèn)信道列表并按照工程類型依次下載到相應(yīng)的設(shè)備中。表 節(jié)點(diǎn)的信道設(shè)置節(jié)點(diǎn)設(shè)備類型工程類型信道設(shè)置信道號(hào)節(jié)點(diǎn)1協(xié)調(diào)器CollectEBDEFAULT_CHANLIST=0x0000080011(0x0B)節(jié)點(diǎn)2協(xié)調(diào)器CollectEBDEFAULT_CHANLIST=0x0100000024(0x18)節(jié)點(diǎn)3終端設(shè)備SensorEBDEFAULT_CHANLIST=0x0100080011、24然后,定義網(wǎng)絡(luò)PAN ID:-DZDAPP_CONFIG_PAN_ID=0x00123)節(jié)點(diǎn)1和2上電后,分別按下節(jié)點(diǎn)1,2的SW1(上)鍵,它們重啟之后,會(huì)成為協(xié)調(diào)器,并建立PAN網(wǎng)絡(luò)。按下SW3(下)鍵,屏幕上出現(xiàn)它們的網(wǎng)絡(luò)地址為”0x0000”, PAN ID“0x0012”,信道號(hào)“0x0B”或“0x18”。4)將節(jié)點(diǎn)3上電,觀察節(jié)點(diǎn)3會(huì)加入上述哪個(gè)信道上的網(wǎng)絡(luò)。然后,將關(guān)閉那個(gè)信道上的協(xié)調(diào)器節(jié)點(diǎn)。觀察節(jié)點(diǎn)3能否會(huì)立即切換到另一個(gè)信道,加入此信道上的網(wǎng)絡(luò)。5)按下節(jié)點(diǎn)3的SW4(左)鍵和SW2(右)鍵,觀察節(jié)點(diǎn)能否在兩個(gè)信道上的網(wǎng)絡(luò)進(jìn)行切換。按照步驟4的方式,再次關(guān)閉協(xié)調(diào)器節(jié)點(diǎn),觀察節(jié)點(diǎn)3還能否自動(dòng)跳轉(zhuǎn)信道。6)去掉編譯選項(xiàng)NV_INIT和NV_RESTORE,重復(fù)上述實(shí)驗(yàn),觀察節(jié)點(diǎn)3能否自動(dòng)跳轉(zhuǎn)信道。4程序清單清單 終端節(jié)點(diǎn)自動(dòng)切換信道/* 函數(shù)段 void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )* 位置 ZDO/ZDApp.c * 描述 處理網(wǎng)絡(luò)發(fā)現(xiàn)事件,節(jié)點(diǎn)斷開網(wǎng)絡(luò)后,可自動(dòng)跳頻加入其它網(wǎng)絡(luò) */if ( continueJoining ) /進(jìn)行網(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ū)信道號(hào),初始化并重啟NV條目,實(shí)現(xiàn)信道設(shè)置*/ if ( keys & HAL_KEY_SW_2 ) newPanid=0x0012; newChannel=0x00001000;/0x0C /NLME_InitNV();/NV初始化 /NLME_SetDefaultNV();/設(shè)置默認(rèn)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é)議棧重啟,相當(dāng)于按重啟鍵 zb_SystemReset();/協(xié)議棧重啟,這時(shí)NV存儲(chǔ)器也會(huì)改變。/改變NV的手動(dòng)方法,同時(shí)按Push鍵和重啟鍵,然后松開重啟鍵,再松開PUSH鍵 if ( keys & HAL_KEY_SW_4 ) newPanid=0x0012; newChannel=0x00000800;/0x0B /NLME_InitNV();/NV初始化 /NLME_SetDefaultNV();/設(shè)置默認(rèn)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é)議棧重啟,相當(dāng)于按重啟鍵 zb_SystemReset();/協(xié)議棧重啟,這時(shí)NV存儲(chǔ)器也會(huì)改變。/改變NV的手動(dòng)方法,同時(shí)按Push鍵和重啟鍵,然后松開重啟鍵,再松開PUSH鍵 清單 讀取傳感器測(cè)出的外界溫度信息/* * 函數(shù)段 void zb_HandleKeys( uint8 shift, uint8 keys )* 位置 APP/DemoSensor.c APP/DemoCollect.c * 描述 獲取節(jié)點(diǎn)地址、PAN ID、信道等指示信息,并在屏幕上顯示*/ if ( keys & HAL_KEY_SW_3 ) zb_GetDeviceInfo(ZB_INFO_PARENT_SHORT_ADDR,&tmpAddr);/父節(jié)點(diǎn)地址 sprintf(printf_buf,parent:-0x%X,tmpAddr);/格式化輸出字符串 HalLcdWriteString(printf_buf,HAL_LCD_LINE_2); zb_GetDeviceInfo(ZB_INFO_SHORT_ADDR,&tmpAddr); /節(jié)點(diǎn)地址 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);/ 信道號(hào) HalLcdWriteString(printf_buf,HAL_LCD_LINE_5); 實(shí)驗(yàn)結(jié)果為記錄和分析兩個(gè)信道上的實(shí)驗(yàn)結(jié)果,編者在兩臺(tái)PC上使用Packet Sniffer分別抓取信道0x0B和0x18上的數(shù)據(jù)包。實(shí)驗(yàn)結(jié)果證明節(jié)點(diǎn)在與當(dāng)前網(wǎng)絡(luò)斷開后,可跳轉(zhuǎn)到另一個(gè)信道上的網(wǎng)絡(luò);通過手動(dòng)按鍵的方式,終端節(jié)點(diǎn)能夠在兩個(gè)信道上進(jìn)行切換。1. 節(jié)點(diǎn)1與節(jié)點(diǎn)2上電后,并按SW1(上)鍵后,會(huì)成為協(xié)調(diào)器,分別建立兩個(gè)PAN網(wǎng)絡(luò)。網(wǎng)絡(luò)建立成功后,網(wǎng)絡(luò)PAN ID為0x0012,協(xié)調(diào)器地址為0x0000。圖 節(jié)點(diǎn)1在信道0x0B上建立網(wǎng)絡(luò)圖 節(jié)點(diǎn)2在信道0x18上建立網(wǎng)絡(luò)2.節(jié)點(diǎn)3上電后,會(huì)與兩個(gè)協(xié)調(diào)器關(guān)聯(lián)。如圖 所示,在信道0x0B上,節(jié)點(diǎn)3(MAC地址:0x00124B0001658C6D)向協(xié)調(diào)器節(jié)點(diǎn)1(MAC地址:0x00124B0001658C6D)提出關(guān)聯(lián)請(qǐng)求。節(jié)點(diǎn)1收到關(guān)聯(lián)請(qǐng)求后,向節(jié)點(diǎn)回應(yīng)關(guān)聯(lián)請(qǐng)求成功的命令幀。圖 節(jié)點(diǎn)3與協(xié)調(diào)器節(jié)點(diǎn)1進(jìn)行關(guān)聯(lián)3.節(jié)點(diǎn)3加入?yún)f(xié)調(diào)器節(jié)點(diǎn)1建立的網(wǎng)絡(luò)中,分配的網(wǎng)絡(luò)短地址為0x796F,并向協(xié)調(diào)器發(fā)送數(shù)據(jù)請(qǐng)求的命令幀。如圖 所示,發(fā)送的數(shù)據(jù)幀APS負(fù)載為16 25 00 00,分別代表片內(nèi)溫度,電壓值,父節(jié)點(diǎn)設(shè)備地址。在串口調(diào)試助手中可以看出,協(xié)調(diào)器發(fā)送到串口中的相應(yīng)位也為16 25 00 00。圖 節(jié)點(diǎn)3向協(xié)調(diào)器節(jié)點(diǎn)1發(fā)送數(shù)據(jù)4.在抓包過程進(jìn)行到大約40s時(shí),協(xié)調(diào)器節(jié)點(diǎn)1被關(guān)閉。如圖 所示,節(jié)點(diǎn)3向協(xié)調(diào)器連續(xù)發(fā)送數(shù)據(jù)請(qǐng)求,沒有得到協(xié)調(diào)器的確認(rèn)。此時(shí),節(jié)點(diǎn)3向網(wǎng)絡(luò)中發(fā)送孤立通知的命令幀。由于協(xié)調(diào)器節(jié)點(diǎn)1已經(jīng)關(guān)閉,節(jié)點(diǎn)1也不會(huì)對(duì)孤立通知作出響應(yīng)。圖 節(jié)點(diǎn)3與信道0x0B上的協(xié)調(diào)器節(jié)點(diǎn)斷開連接此時(shí),如圖 所示,在0x18信道上的節(jié)點(diǎn)2(MAC 地址:0x00124B0001E401A2)也收到了孤立通知的命令幀。由于協(xié)調(diào)器節(jié)點(diǎn)2與終端節(jié)點(diǎn)3進(jìn)行過關(guān)聯(lián),會(huì)對(duì)節(jié)點(diǎn)3發(fā)送協(xié)調(diào)器重排列的命令。此時(shí),節(jié)點(diǎn)3加入了信道0x18上的網(wǎng)絡(luò),其分配的網(wǎng)絡(luò)短地址依然是0x796F。圖 節(jié)點(diǎn)3加入信道0x18上的網(wǎng)絡(luò)加入網(wǎng)絡(luò)后,終端可以可向協(xié)調(diào)器節(jié)點(diǎn)請(qǐng)求并發(fā)送數(shù)據(jù)。圖 節(jié)點(diǎn)3向信道0x18上的協(xié)調(diào)器節(jié)點(diǎn)2發(fā)送數(shù)據(jù)5.當(dāng)按下節(jié)點(diǎn)3的SW2(右)鍵,節(jié)點(diǎn)3會(huì)自動(dòng)重啟并加入到0x18信道的網(wǎng)絡(luò)上。此時(shí),節(jié)點(diǎn)3會(huì)與0x0B信道上的網(wǎng)絡(luò)斷開,并發(fā)送孤立通知命令幀。節(jié)點(diǎn)3重啟之后,設(shè)置在NV區(qū)的網(wǎng)絡(luò)PAN ID和信道號(hào)恢復(fù)到網(wǎng)絡(luò)存儲(chǔ)器。圖 節(jié)點(diǎn)3與0x0B信道上的網(wǎng)絡(luò)斷開連接節(jié)點(diǎn)3從NV區(qū)讀取的網(wǎng)絡(luò)號(hào)0x0012,信道號(hào)0x18。0x18信道上的協(xié)調(diào)器節(jié)點(diǎn)2會(huì)收到節(jié)點(diǎn)3發(fā)送的孤立通知命令幀,并對(duì)節(jié)點(diǎn)3發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 從隱私保護(hù)看醫(yī)療信息共享
- 信息技術(shù)與安全管理融合推動(dòng)醫(yī)療領(lǐng)域信息安全實(shí)踐
- 健康數(shù)據(jù)的管理與利用高職教育新方向
- 從人工智能技術(shù)的商業(yè)應(yīng)用到考慮法律邊界及社會(huì)責(zé)任
- 物業(yè)公司工程部年度工作計(jì)劃
- 幼兒園班主任互動(dòng)教學(xué)計(jì)劃
- 音樂產(chǎn)業(yè)創(chuàng)新師徒合作計(jì)劃
- 2025年塑料產(chǎn)品加工合同范本
- 中學(xué)數(shù)學(xué)課堂互動(dòng)教學(xué)計(jì)劃
- 2025解除勞動(dòng)合同通知書(公司不續(xù)約)
- golf高爾夫介紹課件
- 中國(guó)古代文學(xué)史(二)正式課件
- 物業(yè)管理服務(wù)品質(zhì)檢查表
- 六年級(jí)下冊(cè)第五單元16表里的生物-表里的生物-學(xué)習(xí)任務(wù)單
- 高中美術(shù)《匠心之用-雕塑藝術(shù)》“紀(jì)念與象征-空間中的實(shí)體藝術(shù)”課件
- 動(dòng)火安全作業(yè)票填寫模板2022年更新
- 2021年12月英語六級(jí)聽力試題、原文及答案 兩套
- 北師版七年級(jí)下冊(cè)數(shù)學(xué) 第1章 1.6.2 目標(biāo)三 整式的化簡(jiǎn)求值 習(xí)題課件
- 《貿(mào)易商務(wù)英語》課件Unit 4 Change
- TCWAN 0027-2022 TCEEIA 584-2022 新能源汽車鋁合金電池托盤焊接制造規(guī)范
- 煤礦井下絞車房管理制度
評(píng)論
0/150
提交評(píng)論