<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計應(yīng)用 > ZigBee協(xié)議網(wǎng)絡(luò)層的設(shè)計與實現(xiàn)

          ZigBee協(xié)議網(wǎng)絡(luò)層的設(shè)計與實現(xiàn)

          作者: 時間:2009-07-08 來源:網(wǎng)絡(luò) 收藏
          1 引言
          Zigbee是一種新興的短距離、低速率無線網(wǎng)絡(luò)技術(shù),主要用于近距離的無線通信,由于具有低功耗、低成本、可擴展以及良好的互操作能力等特性,在工業(yè)自動化、建筑自動化以及工業(yè)無線領(lǐng)域占有重要地位[1][2][3]。
          聯(lián)盟[4]成立于2001年8月,2002年下半年,英國Invensys公司、日本三菱電氣公司、美國摩托羅拉公司以及荷蘭飛利浦半導(dǎo)體公司等四大公司加盟聯(lián)盟,這一事件成為技術(shù)的里程碑。到目前為止,加盟ZigBee聯(lián)盟已經(jīng)涵蓋IT領(lǐng)域以及其它行業(yè)的200多家企業(yè),其中還包括來自我國的華為技術(shù)有限公司和中國科學(xué)院沈陽自動化研究所。
          2 棧架構(gòu)
          Zigbee棧軟件采用C語言編寫,開發(fā)環(huán)境采用AVR Studio4.12,硬件平臺采用的單片機為Atmega128,射頻模塊采用CC2420。采用的標(biāo)準(zhǔn)是ZigBee 1.0規(guī)范[5], 整個棧軟件采用單線程,考慮到Atmega128內(nèi)部RAM只有4K的空間,因此,各模塊之間采用共享緩沖區(qū)進行通信。Zigbee協(xié)議棧軟件的架構(gòu)如圖1所示。
          每個模塊具有一個執(zhí)行函數(shù),用于接收來自底層模塊的數(shù)據(jù)。在數(shù)據(jù)接收階段,底層模塊將接收到的數(shù)據(jù)幀在本層解析后,將需要向上層模塊發(fā)送的數(shù)據(jù)存放在共享的接收緩沖區(qū),同時通過全局變量的形式向上層模塊提供指示原語;在上層模塊的執(zhí)行函數(shù)中,首先通過判斷來自底層模塊的指示原語確定是否存在來自其它節(jié)點的數(shù)據(jù),如果存在則解析并處理,同時將需要傳遞給更高模塊的數(shù)據(jù)放入接收緩沖區(qū),同樣通過指示原語通知更高層模塊。

          圖1 Zigbee協(xié)議棧軟件架構(gòu)
          3 的設(shè)計與實現(xiàn)
          通過兩個服務(wù)實體分別提供兩類服務(wù),它們分別是數(shù)據(jù)服務(wù)和網(wǎng)絡(luò)層管理服務(wù)。1)數(shù)據(jù)服務(wù)實體:提供數(shù)據(jù)服務(wù),主要負責(zé)數(shù)據(jù)的發(fā)送和接收;2)管理服務(wù)實體:提供管理服務(wù),主要負責(zé)網(wǎng)絡(luò)層的管理和維護,包括網(wǎng)絡(luò)的發(fā)現(xiàn)和創(chuàng)建,設(shè)備的加入和離開以及路由的創(chuàng)建與維護。
          3.1 數(shù)據(jù)發(fā)送和接收
          網(wǎng)絡(luò)層的數(shù)據(jù)服務(wù)實體負責(zé)數(shù)據(jù)的接收和發(fā)送,接收處理模塊負責(zé)接收數(shù)據(jù),發(fā)送處理模塊負責(zé)發(fā)送數(shù)據(jù)。
          數(shù)據(jù)接收和發(fā)送處理模塊的功能和工作流程如下:
          1)數(shù)據(jù)接收處理模塊
          接收處理模塊負責(zé)從下層接收數(shù)據(jù),解析報文的網(wǎng)絡(luò)層頭部,分情況做相應(yīng)的處理:如果是重復(fù)報文,則丟棄;如果是發(fā)給本節(jié)點的數(shù)據(jù)報文或者廣播報文,則交給上層處理;如果是需要本節(jié)點轉(zhuǎn)發(fā)的報文,則將報文交給發(fā)送處理模塊處理。
          2)數(shù)據(jù)發(fā)送處理模塊
          發(fā)送處理模塊負責(zé)從上層或者接收處理模塊中接收數(shù)據(jù),根據(jù)不同的情況做相應(yīng)的處理:如果報文的剩余跳數(shù)不大于0,則視為“死報文”,丟棄之; 否則需要進行報文發(fā)送。首先查找路由表,如果找到了到目的節(jié)點的有效路由表項,則根據(jù)路由信息將報文發(fā)送出去;如果沒有,則根據(jù)報文的路由發(fā)現(xiàn)選項決定是否進行路由發(fā)現(xiàn),以及是通過樹型路由發(fā)送報文還是等待路由回復(fù)消息到達后再發(fā)送報文,具體的我們將在3.3節(jié)的路由發(fā)現(xiàn)和維護中進行詳細說明。
          3.2 網(wǎng)絡(luò)設(shè)備管理
          ZigBee的網(wǎng)絡(luò)中包括協(xié)調(diào)器設(shè)備、路由設(shè)備和終端節(jié)點設(shè)備,其中,協(xié)調(diào)器設(shè)備負責(zé)創(chuàng)建網(wǎng)絡(luò),路由設(shè)備可以參與網(wǎng)絡(luò)路由和數(shù)據(jù)轉(zhuǎn)發(fā)但是終端節(jié)點設(shè)備只能作為葉子節(jié)點而不能參與路由。設(shè)備管理主要包括網(wǎng)絡(luò)的發(fā)現(xiàn)和創(chuàng)建以及節(jié)點的加入和離開。
          節(jié)點進行網(wǎng)絡(luò)通信的第一步是由協(xié)調(diào)器設(shè)備負責(zé)創(chuàng)建網(wǎng)絡(luò)。協(xié)調(diào)器節(jié)點首先進行信道掃描來進行網(wǎng)絡(luò)發(fā)現(xiàn),根據(jù)掃描結(jié)果,選擇一個最佳的空閑信道并在該信道上創(chuàng)建網(wǎng)絡(luò)。在協(xié)調(diào)器節(jié)點創(chuàng)建網(wǎng)絡(luò)后,非協(xié)調(diào)器節(jié)點就可以加入網(wǎng)絡(luò)了。具體的步驟如下:1)進行網(wǎng)絡(luò)發(fā)現(xiàn)。如果指定了PANID(Personal Area Network ID,個域網(wǎng)ID),則發(fā)現(xiàn)相應(yīng)ID的個域網(wǎng)才進行加入,否則,加入到最先掃描到的網(wǎng)絡(luò)。2)選擇合適的父節(jié)點,發(fā)送加入網(wǎng)絡(luò)請求。從鄰居節(jié)點中選擇合適的節(jié)點作為自己的父節(jié)點,并向其發(fā)出加入網(wǎng)絡(luò)的請求。3)加入網(wǎng)絡(luò)。通過父節(jié)點加入網(wǎng)絡(luò),并獲得一個16位的網(wǎng)絡(luò)層地址。
          協(xié)調(diào)器節(jié)點創(chuàng)建網(wǎng)絡(luò)或者非協(xié)調(diào)器節(jié)點加入網(wǎng)絡(luò),其實現(xiàn)的難點和關(guān)鍵在于進行網(wǎng)絡(luò)發(fā)現(xiàn)。我們通過設(shè)計有限狀態(tài)機的方法來進行網(wǎng)絡(luò)發(fā)現(xiàn),其狀態(tài)轉(zhuǎn)換如圖2所示。

          圖2 網(wǎng)絡(luò)發(fā)現(xiàn)狀態(tài)轉(zhuǎn)換圖

          轉(zhuǎn)換圖中共有5個狀態(tài),各個狀態(tài)定義如表1所示:
          表1網(wǎng)絡(luò)發(fā)現(xiàn)狀態(tài)定義


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();