無(wú)線傳感器網(wǎng)絡(luò)CSMA協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
3.1 信號(hào)強(qiáng)度閾值的更新機(jī)制
閾值的動(dòng)態(tài)更新必須使用大量的實(shí)時(shí)RSSI值作為統(tǒng)計(jì)值,且需要把RSSI值分為兩類: 一類是信道繁忙時(shí)的RSSI,本文稱為busyRSSI;另一類是信道空閑時(shí)的RSSI值,本文稱為noiseRSSI。這兩個(gè)值可以在物理層每接收到一個(gè)數(shù)據(jù)包時(shí)獲取,因?yàn)镃C2420接收到一個(gè)數(shù)據(jù)包時(shí)將在數(shù)據(jù)包的倒數(shù)第二個(gè)字節(jié)(FCS域)自動(dòng)填充接收時(shí)的RSSI值,因此busyRSSI值就無(wú)條件地得到了;而在剛接收完數(shù)據(jù)包后信道一般都是空閑的,所以這時(shí)立即讀取當(dāng)前的RSSI值,就可以得到noiseRSSI值。為避免例外,可將得到的noiseRSSI值與minSignal進(jìn)行比較,如果大于等于minSignal就丟棄。
在獲得busyRSSI和noiseRSSI后就對(duì)其進(jìn)行統(tǒng)計(jì)操作,為實(shí)現(xiàn)這個(gè)目的需要維護(hù)一個(gè)統(tǒng)計(jì)變量avgSignal,用來統(tǒng)計(jì)所有的busyRSSI值。avgSignal的初值等于minSignal的初值即初始閾值,并按1/4的權(quán)重進(jìn)行統(tǒng)計(jì),即avgSignal = (avgSignal?1) + ((avgSignal + busyRSSI)?2)。noiseRSSI的值并不需要統(tǒng)計(jì),這是因?yàn)樽x出noiseRSSI的值很穩(wěn)定幾乎不變。
noiseLevel閾值的更新相對(duì)簡(jiǎn)單,因?yàn)樵肼曅盘?hào)強(qiáng)度十分穩(wěn)定,因此不必對(duì)noiseRSSI做統(tǒng)計(jì),每次讀取noiseRSSI后可直接對(duì)noiseLevel進(jìn)行更新。更新規(guī)則也是采用1/4權(quán)重,即noiseLevel = (noiseLevel ? 1) + ((noiseLevel + noiseRSSI) ? 2)。
minSignal閾值需要針對(duì)兩種互補(bǔ)的情況來進(jìn)行更新調(diào)整。第一種情況是一段時(shí)間內(nèi)的采樣結(jié)果全是信道空閑,說明所有的采樣值都小于minSignal,因此有可能minSignal的值過高,應(yīng)對(duì)其調(diào)整將其適當(dāng)降低。該情況在監(jiān)測(cè)信道結(jié)果為空閑時(shí)觸發(fā)更新,更新方法是直接利用當(dāng)前的busyRSSI來更新;只要busyRSSI的值小于當(dāng)前的minSignal值,那么就將busyRSSI的值作為最新的minSignal值。這樣做是因?yàn)樵赽usyRSSI的信號(hào)強(qiáng)度下已經(jīng)能夠接收數(shù)據(jù)了,而busyRSSI又比當(dāng)前的minSignal要小,所以更接近實(shí)際的閾值。
第二種情況是對(duì)第一種情況的補(bǔ)充。在做了第一種情況的修改后,如果長(zhǎng)時(shí)間內(nèi)監(jiān)測(cè)到的都是信道繁忙(如載波監(jiān)聽?zhēng)状位赝撕蠖挤祷胤泵Γ?那么就可能是minSignal的值設(shè)置得太低,因此要適當(dāng)調(diào)高該值,以避免使用第一種更新方式后由于設(shè)置的minSignal值太低而導(dǎo)致不能使用信道的情況。該情況提供一個(gè)接口由上層(MAC層)來調(diào)用更新。更新需要借助統(tǒng)計(jì)量avgSignal,更新的偽代碼如下(其中initBusySingal指的是minSignal的最初值):
//如果minSignal大于或等于初值,就說明沒有進(jìn)行第一種
//更新,所以沒有進(jìn)行第二種更新的必要
if (minSignal initBusySignal){
//更合理地提高minSignal值,不能一下將minSignal大幅度提
//高,且要保證更新后minSignal比initBusySignal小
if (avgSignal initBusySignal){
minSignal = (minSignal + avgSignal) ? 1;
}
else{
minSignal = (minSignal + initBusySignal) ? 1;
}
}
initBusySignal的選擇將在后面介紹,它的選擇對(duì)更新機(jī)制尤為重要。因?yàn)閙inSignal的更新機(jī)制建立的基礎(chǔ)就是initBusySignal非常接近實(shí)際臨界值。initBusySignal本身也是經(jīng)過大量測(cè)試后選擇的一個(gè)信道活動(dòng)最小強(qiáng)度值,而它肯定會(huì)大于(最小等于)實(shí)際的臨界值,所以minSignal更新后應(yīng)該比initBusySignal小才對(duì)。
3.2 信號(hào)強(qiáng)度閾值初始值的選擇
信號(hào)強(qiáng)度閾值的初始值必須根據(jù)實(shí)際測(cè)試緄拇罅殼慷戎道瓷瓚ǎ如果設(shè)置失誤,將導(dǎo)致信道狀態(tài)判斷不準(zhǔn)確。本文假設(shè)兩個(gè)初值分別是initNoiseSignal和initBusySignal。下面給出部分測(cè)試強(qiáng)度的數(shù)據(jù),如表1所列。測(cè)試時(shí)使用兩個(gè)節(jié)點(diǎn),且兩個(gè)節(jié)點(diǎn)都是使用新電池(即電源充沛)。表中,“阻隔”指的是一堵大約10 cm厚的墻。
表1 信號(hào)強(qiáng)度測(cè)試數(shù)據(jù)
在雙方節(jié)點(diǎn)能通信的前提下,本文測(cè)到的busyRSSI的最小值為0x54。根據(jù)上一小節(jié)的論述,initBusySignal的值可以略高,但因?yàn)樵撝凳窃陔娏砍渥闱矣凶韪舻那闆r下測(cè)試緄淖钚∏康髦擔(dān)因此可以直接取為busyRSSI的最小值,即initBusySignal的值設(shè)置為0x54。對(duì)于initNoiseSignal的取值,從表1可以看出,檢測(cè)到的RSSI值非常穩(wěn)定,信道空閑時(shí)噪聲強(qiáng)度幅度不大,因此取值比0x4D略大就可以了。本文中initNoiseSignal取值為0x4E。
3.3 本文實(shí)現(xiàn)的信道監(jiān)測(cè)機(jī)制的優(yōu)點(diǎn)
本文實(shí)現(xiàn)的信道監(jiān)測(cè)機(jī)制比較完善且十分靈活。完善是指信道活動(dòng)狀態(tài)判定規(guī)則十分完備,不僅有基本判定和擴(kuò)展判定,而且還有閾值更新機(jī)制,進(jìn)一步確保了判定結(jié)果的正確性;靈活是指向調(diào)用方提供了采樣窗口數(shù)的設(shè)置,使得調(diào)用方可以在每次監(jiān)測(cè)時(shí)使用不同的采樣窗口數(shù),可以被LPL、BMAC等有特殊要求的基于競(jìng)爭(zhēng)的MAC協(xié)議直接調(diào)用。
本文實(shí)現(xiàn)的CAMA協(xié)議是基于使用廣泛的非持續(xù)性CSMA協(xié)議的,即節(jié)點(diǎn)在發(fā)送數(shù)據(jù)包之前先監(jiān)測(cè)信道,如果監(jiān)測(cè)到信道空閑,則該節(jié)點(diǎn)就自己開始發(fā)送數(shù)據(jù)包。反之,如果監(jiān)測(cè)結(jié)果為信道繁忙,即信道已經(jīng)被鄰居節(jié)點(diǎn)占用,則該節(jié)點(diǎn)回退一段隨機(jī)時(shí)間后,再次開始監(jiān)測(cè),重復(fù)上面的操作。
在具體實(shí)現(xiàn)CSMA協(xié)議時(shí),本文結(jié)合信道監(jiān)測(cè)提供的接口對(duì)協(xié)議做了一些優(yōu)化調(diào)整。另外,由于無(wú)線傳感器網(wǎng)絡(luò)中節(jié)點(diǎn)間距離很短,一般忽略傳播延遲,因此具體的實(shí)現(xiàn)與標(biāo)準(zhǔn)的CSMA協(xié)議有些不同,但原理一致,其實(shí)現(xiàn)如下:
如果節(jié)點(diǎn)要發(fā)送數(shù)據(jù)包,需要先進(jìn)行載波監(jiān)聽,首先隨機(jī)選擇一個(gè)采樣窗口數(shù)(即信道采樣次數(shù)),該采樣數(shù)屬于某一個(gè)范圍,本文選擇為8~32。采樣數(shù)隨機(jī)選擇的目的是減少?zèng)_突,舉例說明:假設(shè)信道目前空閑,A、B、C三個(gè)節(jié)點(diǎn)都是鄰居節(jié)點(diǎn),且A、B節(jié)點(diǎn)有數(shù)據(jù)包要發(fā)送給節(jié)點(diǎn)C;A、B兩個(gè)鄰居節(jié)點(diǎn)同時(shí)開始監(jiān)測(cè),如果采樣窗口數(shù)固定,根據(jù)信道監(jiān)測(cè)的規(guī)則,信道空閑必須等到采樣數(shù)用完才能下結(jié)論,那么A、B節(jié)點(diǎn)都在用完所有的采樣數(shù)后得縲諾攬障械慕崧郟然后都發(fā)送數(shù)據(jù)包,這樣數(shù)據(jù)在節(jié)點(diǎn)C處就發(fā)生了沖突,最后A、B兩節(jié)點(diǎn)就必須依靠隨機(jī)回退一段時(shí)間后再次監(jiān)測(cè)信道。采用隨機(jī)的采樣窗口數(shù)可以降低上面情況的發(fā)生率。因?yàn)椴蓸哟翱跀?shù)小的節(jié)點(diǎn)(假設(shè)為節(jié)點(diǎn)A)先得出信道空閑的結(jié)論并發(fā)送數(shù)據(jù)包,采樣窗口數(shù)大的節(jié)點(diǎn)B在后面的采樣中發(fā)現(xiàn)信道繁忙(因?yàn)楣?jié)點(diǎn)A已經(jīng)占用了信道)就回退,避免了發(fā)生沖突。
回退時(shí)間的選擇也是值得推敲的一個(gè)參數(shù)。CC2420是以數(shù)據(jù)包為單位發(fā)送的射頻芯片,其最大數(shù)據(jù)包的長(zhǎng)度為128字節(jié),加上同步頭5字節(jié),總共是133字節(jié)。CC2420的發(fā)送速率是250 kb/s,即發(fā)送一個(gè)字節(jié)的時(shí)間為32 μs,因此發(fā)送一個(gè)最大數(shù)據(jù)包的時(shí)間為133×32=4 256 μs。根據(jù)信道采樣規(guī)則,只要一采樣到信道占用,就可以結(jié)束本次監(jiān)測(cè)并得出信道繁忙的結(jié)論,因此回退時(shí)間應(yīng)該要大于數(shù)據(jù)包的發(fā)送時(shí)間。又因?yàn)椴蓸哟翱跀?shù)已經(jīng)采用了隨機(jī)選取,所以回退時(shí)間可以使用固定值。因此可以將回退時(shí)間固定為4.5 ms,回退功能的具體實(shí)現(xiàn)只需要一個(gè)定時(shí)器輔助就可以了。
最后,要處理信道強(qiáng)度閾值更新的問題。如果MAC層連續(xù)對(duì)信道監(jiān)測(cè)的結(jié)果都是繁忙,且累計(jì)超過一個(gè)預(yù)設(shè)的閾值Y,就必須要調(diào)用MAC層提供的接口來對(duì)minSignal閾值進(jìn)行更新,參照上節(jié)信號(hào)強(qiáng)度閾值的更新機(jī)制。根據(jù)實(shí)際的測(cè)試分析,Y的取值一般為30~60。
結(jié)語(yǔ)
本文靈活利用CC2420射頻芯片的特點(diǎn),設(shè)計(jì)并實(shí)現(xiàn)了一整套從物理層到MAC層的無(wú)線傳感器網(wǎng)絡(luò)CSMA協(xié)議的實(shí)現(xiàn);并詳細(xì)闡述了協(xié)議中信道監(jiān)測(cè)使用的所有判定規(guī)則及各關(guān)鍵閾值參數(shù)的選擇。經(jīng)過實(shí)際的多節(jié)點(diǎn)通信測(cè)試,該CSMA協(xié)議可以正確、穩(wěn)定地進(jìn)行信道活動(dòng)監(jiān)測(cè),并實(shí)時(shí)動(dòng)態(tài)地調(diào)整閾值;并且該CSMA協(xié)議的設(shè)計(jì)可以完全嵌入應(yīng)用到其他MAC層協(xié)議中,輔助其他協(xié)議完成信道競(jìng)爭(zhēng)或信道檢測(cè)。
評(píng)論