CSMA協議作為網絡中實現信道競爭機制的協議,正逐漸應用在無線傳感器網絡中。本文深入研究了射頻芯片CC2420的各種特性,針對其特性設計并實現了一個完善的CSMA機制,包括物理層信道信號強度采樣、強度閾值的動態更新以及MAC層的CSMA機制;詳細闡述了信道監測中使用的判定規則、各關鍵閾值參數的選擇,以及對CSMA機制的優化。
關鍵詞? CSMA? IEEE 802.15.4? CC2420? 信號強度采樣? 無線傳感器網絡
CSMA協議是網絡中運用得最為廣泛的競爭協議,因此無線傳感器網絡的MAC層大多使用CSMA機制來提供競爭信道的功能。隨著IEEE 802.15.4標準的制定,各射頻芯片廠家也紛紛推出了性能更好、功能更強的射頻芯片。TI公司(原Chipcon)推出CC2420來替代原來無線傳感器網絡使用最多的射頻芯片CC1000。由于各射頻芯片特性功能各不相同,為了使CSMA協議達到更好的性能,根據射頻芯片的具體特性來重新優化設計CSMA機制也就變得很有必要。
本文使用TI公司的MSP4301611超低功耗MCU,以及CC2420射頻芯片作為硬件實驗平臺,充分利用CC2420部分IEEE 802.15.4協議MAC封裝的特性,設計并實現了一個全新的、靈活的CSMA協議。
1? 信道監測的設計
實現CSMA協議的最基本的條件就是物理層必須提供可靠、實用的信道監測手段,因此首先要了解射頻芯片的一些特性。
1.1? CC2420的相關特性
CC2420是TI公司推出的2.4 GHz射頻芯片,其硬件封裝支持部分IEEE 802.15.4的MAC層協議規定。CC2420的功能結構如圖1所示,CC2420的數字接口具有自動CRC校驗、自動加密的功能,并維護兩個緩沖區(一個接收FIFO,一個發送FIFO)。數字接口通過SPI通信接口與微處理器相連。CC2420是以數據包為單位的射頻芯片,即必須從微處理器收滿一個數據包,才會發送該數據包。數字接口收滿一整包后,自動添加CRC校驗,并送入調制模塊進行數據調制和整形,最后發送出去。當監測到信道有數據時,將數據經過模/數轉換后送入數字解調器中進行幀同步;如果同步就將數據填入接收緩沖區中,最后填充當前信道內的RSSI(Receive Signal Strength Indicator,接收信號強度指示器)信息。
CC2420提供一個讀取RSSI值的命令,開發者可以調用該命令來得到當前信道的信號強度值,并通過對該值的解析來判定當前信道是空閑還是繁忙。另外,CC2420在接收到數據包時,可以自動在數據包的倒數第二個字節里填充當前接收數據包時的RSSI值。這種特性對于信號強度閾值的更新維護十分有用。
1.2? 信道監測的設計
CC2420提供了一項CSMACA的功能,稱為CCA(Clear Channel Assessment,空閑信道評估),它使用一個寄存器來設置閾值。當CC2420收到CCA命令后,就開始采樣RSSI值,只有采樣到的RSSI值小于寄存器中的閾值時才允許發送數據。CCA雖然實現了信道監測的基本功能,但是也有其自身的缺點: 不夠靈活且開放程度不夠,只能進行一次完整的通道監測,并不能設置采樣次數。這就限制了它在其他協議中的使用,例如在LPL(Low Power Listening,低功耗偵聽)協議中,只需要進行一次采樣作為偵聽。另外,它的判定機制并不夠完善,只有一個閾值,因而開發者難以找到合適的閾值。
本文參照CCA的閾值機制,設置上下閾值并利用CC2420讀取RSSI采樣值的命令,用軟件來完成信道監測工作。本文使用的信道監測及判定的基本原理就是: 先設置兩個適當的信號強度閾值,一個是最小信號強度minSignal,其含義是信道中有數據發送時的最小信號強度值;另一個是噪聲強度noiseStrength,其含義是信道空閑時的信號強度值。然后物理層在一段時間內不斷地進行RSSI采樣,并把采樣結果按照某種規則(在實現中有具體說明)與閾值進行比較,從而得到信道的活動狀態。而且為了更準確地反映信道狀態,在不能判斷信道活動狀態時,還應有擴展采樣機制。
另外,這兩個信號強度閾值并不是一直不變的,它們必須根據信道一段時期的信號強度情況來動態更新,因此本文還實現了一種閾值更新機制,它能根據當前的信道信號強度和一些強度統計信息來動態地更新閾值。
從接口上看,物理層的信道監測只是提供給MAC層的CSMA協議一個探測信道的接口。為了設計一個靈活的信道探測接口給上層,就必須給上層一些調整的接口,例如可以讓上層來設定具體某次監測的采樣次數,這樣上層就可以根據不同的實際情況來設定采樣數。圖2為物理層信道監測提供的接口與MAC層CSMA的關系簡圖。
2? 信道監測的實現
2.1? 信道活動狀態判斷的基本規則
采樣得到的RSSI值是一個有符號的振幅值,它只有一個字節。這樣的值并不利于分析,所以統一將其值上升128,即對讀出的RSSI值統一加上128,因此轉換后的值都是為正的,后面提到的RSSI值指的都是轉換后的值。
假設上層設定信道采樣窗口數為N。為了完成連續的N次采樣,需要使用一個采樣定時器。CC2420的RSSI采樣時間約為128 μs,再加上硬件延遲以及軟件處理延遲時間,采樣定時器設置為1 ms循環觸發(這1 ms的采樣在CSMA中稱為“采樣窗口”)。每次定時器觸發后,就向CC2420發送命令讀取當前信道的RSSI值,然后采用如下規則進行信道活動狀態判斷:
① ?如果采樣到的RSSI值大于等于閾值minSignal,那么就判定信道正被其他節點使用,即使采樣未滿N次也不再采樣,并立即通知上層協議信道正被使用。反之如果該次采樣監測岀的值小于或等于minSignal,那么本次采樣不做任何判斷,繼續下次的采樣。
②? 如果一直采樣到最后,且最后一次的RSSI值小于noiseLevel(噪聲強度),那么就判定信道為空閑,并給出修改閾值標志,通知上層可以發送數據。注意,只要判定為信道空閑,就要給出更新閾值標志,原因將在后面的閾值維護中說明。
如上所述,只要采樣值大于等于minSignal,就判定信道是繁忙的,而判定信道空閑時卻要求所有的采樣都小于minSignal,且最后一次的采樣值要小于noiseLevel。然而上面兩個規則并不完善,并不能處理任何情況,以下兩種情況就不能得出結論: 最后一次采樣岀錯沒有得到RSSI值,或者最后一次采樣的RSSI值介于noiseLevel和minSignal之間。此時就必須使用擴展規則。
2.2? 信道活動狀態判斷的擴展規則
擴展規則是為了處理基本規則不能解決的問題。擴展規則其實就是擴展m次采樣,在這m次的擴展采樣中使用對應的擴展規則來判定信道狀態。擴展規則涉及一些統計的方法,需要維護一個extCSVal的統計變量。擴展規則如下:
①? 擴展采樣中,判定信道繁忙的規則與基本規則一樣。只要檢查到采樣RSSI值大于等于minSignal,就判定為信道忙,然后結束擴展采樣。
②? 信道空閑的判定與基本規則不同,因為已經處于擴展采樣,所以只要檢查到采樣RSSI值小于noiseLevel,就可判定信道為空閑,同時給出更新閾值的標志。
③? 如果在擴展采樣中并沒有出現以上兩種情況,那么就必須要計算extCSVal來做判斷。先說明賦給extCSVal的初值,如果最后一次基本采樣的RSSI值介于兩閾值之間,那么直接將這個RSSI值賦給extCSVal;如果最后一次基本采樣讀取RSSI失敗,那么將第一次擴展采樣得到的介于兩閾值之間的RSSI值賦給extCSVal。如果extCSVal已經賦值,而擴展采樣中又得到了介于兩閾值之間的RSSI值,那么更新extCSVal值:extCSVal = (extCSVal + RSSI)?1(即取平均值)。
④? 如果m次擴展采樣,依靠前兩個規則仍然不能判斷信道狀態,且最后一次擴展采樣的結果仍然介于兩者之間,那就使用統計值extCSVal來輔助判斷。規則如下:如果extCSVal> = ((minSignal + noiseLevel)?1),那么就判定信道忙;反之,則判定信道空閑。
⑤ ?最后是最壞的一種情況:當擴展采樣的最后一次采樣發生錯誤,讀取RSSI值失敗時,并不知道信道的實際狀況,但也不能一直擴展下去,所以判斷為信道繁忙以避免出錯。
通過基本規則和擴展規則已經可以得出一個準確性較高的信道活動狀態判定,擴展規則彌補了基本規則可能會出現的錯誤。在實際的測試中,如果兩個閾值的初值選擇得很合適,那么一般并不會進入擴展采樣。若閾值初值選擇得不貼切,如mingSignal初值過大,則noiseLevel初值過小時都會導致進入擴展采樣。
這里還需要說明的是m的取值。本文中采樣定時器設置為1 ms,即1 ms采樣一次。擴展采樣次數m取值越大,準確性自然就越高,但是整個網絡性能有所下降(花去的額外時間過多)。m的值也不能過小,不然extCSVal統計值就不能發揮其作用。由于本文使用的初始閾值是經過大量測試確定的精確值(參照信號強度閾值初值的選擇),因此使用該初始閾值進行的測試結果顯示: 只有極少情況進入擴展采樣(約5 000次監測進入一次擴展采樣)。鑒于這種實際情況,m的取值不需要很大,本文取其值為3。如果初始閾值不能精確設定,那么可將m值放大。
3? 信號強度閾值的選擇和更新維護
從信道監測的基本規則和擴展規則可以看出,信號強度的兩個閾值對信道狀態的判定十分重要,因此這兩個閾值的初始值選擇必須十分慎重;而且必須要根據當前信道狀態動態更新閾值的機制。
3.1? 信號強度閾值的更新機制
閾值的動態更新必須使用大量的實時RSSI值作為統計值,且需要把RSSI值分為兩類: 一類是信道繁忙時的RSSI,本文稱為busyRSSI;另一類是信道空閑時的RSSI值,本文稱為noiseRSSI。這兩個值可以在物理層每接收到一個數據包時獲取,因為CC2420接收到一個數據包時將在數據包的倒數第二個字節(FCS域)自動填充接收時的RSSI值,因此busyRSSI值就無條件地得到了;而在剛接收完數據包后信道一般都是空閑的,所以這時立即讀取當前的RSSI值,就可以得到noiseRSSI值。為避免例外,可將得到的noiseRSSI值與minSignal進行比較,如果大于等于minSignal就丟棄。
在獲得busyRSSI和noiseRSSI后就對其進行統計操作,為實現這個目的需要維護一個統計變量avgSignal,用來統計所有的busyRSSI值。avgSignal的初值等于minSignal的初值即初始閾值,并按1/4的權重進行統計,即avgSignal = (avgSignal?1) + ((avgSignal + busyRSSI)?2)。noiseRSSI的值并不需要統計,這是因為讀出noiseRSSI的值很穩定幾乎不變。
noiseLevel閾值的更新相對簡單,因為噪聲信號強度十分穩定,因此不必對noiseRSSI做統計,每次讀取noiseRSSI后可直接對noiseLevel進行更新。更新規則也是采用1/4權重,即noiseLevel = (noiseLevel ? 1) + ((noiseLevel + noiseRSSI) ? 2)。
minSignal閾值需要針對兩種互補的情況來進行更新調整。第一種情況是一段時間內的采樣結果全是信道空閑,說明所有的采樣值都小于minSignal,因此有可能minSignal的值過高,應對其調整將其適當降低。該情況在監測信道結果為空閑時觸發更新,更新方法是直接利用當前的busyRSSI來更新;只要busyRSSI的值小于當前的minSignal值,那么就將busyRSSI的值作為最新的minSignal值。這樣做是因為在busyRSSI的信號強度下已經能夠接收數據了,而busyRSSI又比當前的minSignal要小,所以更接近實際的閾值。
第二種情況是對第一種情況的補充。在做了第一種情況的修改后,如果長時間內監測到的都是信道繁忙(如載波監聽幾次回退后都返回繁忙),那么就可能是minSignal的值設置得太低,因此要適當調高該值,以避免使用第一種更新方式后由于設置的minSignal值太低而導致不能使用信道的情況。該情況提供一個接口由上層(MAC層)來調用更新。更新需要借助統計量avgSignal,更新的偽代碼如下(其中initBusySingal指的是minSignal的最初值):
//如果minSignal大于或等于初值,就說明沒有進行第一種
//更新,所以沒有進行第二種更新的必要
if (minSignal < initBusySignal){
//更合理地提高minSignal值,不能一下將minSignal大幅度提
//高,且要保證更新后minSignal比initBusySignal小
if (avgSignal < initBusySignal){
minSignal = (minSignal + avgSignal) ? 1;
}
else{
minSignal = (minSignal + initBusySignal) ? 1;
}
}
initBusySignal的選擇將在后面介紹,它的選擇對更新機制尤為重要。因為minSignal的更新機制建立的基礎就是initBusySignal非常接近實際臨界值。initBusySignal本身也是經過大量測試后選擇的一個信道活動最小強度值,而它肯定會大于(最小等于)實際的臨界值,所以minSignal更新后應該比initBusySignal小才對。
3.2? 信號強度閾值初始值的選擇
信號強度閾值的初始值必須根據實際測試岀的大量強度值來設定,如果設置失誤,將導致信道狀態判斷不準確。本文假設兩個初值分別是initNoiseSignal和initBusySignal。下面給出部分測試強度的數據,如表1所列。測試時使用兩個節點,且兩個節點都是使用新電池(即電源充沛)。表中,“阻隔”指的是一堵大約10 cm厚的墻。
在雙方節點能通信的前提下,本文測到的busyRSSI的最小值為0x54。根據上一小節的論述,initBusySignal的值可以略高,但因為該值是在電量充足且有阻隔的情況下測試岀的最小強調值,因此可以直接取為busyRSSI的最小值,即initBusySignal的值設置為0x54。對于initNoiseSignal的取值,從表1可以看出,檢測到的RSSI值非常穩定,信道空閑時噪聲強度幅度不大,因此取值比0x4D略大就可以了。本文中initNoiseSignal取值為0x4E。
3.3? 本文實現的信道監測機制的優點
本文實現的信道監測機制比較完善且十分靈活。完善是指信道活動狀態判定規則十分完備,不僅有基本判定和擴展判定,而且還有閾值更新機制,進一步確保了判定結果的正確性;靈活是指向調用方提供了采樣窗口數的設置,使得調用方可以在每次監測時使用不同的采樣窗口數,可以被LPL、BMAC等有特殊要求的基于競爭的MAC協議直接調用。
4??CSMA協議的實現
本文實現的CAMA協議是基于使用廣泛的非持續性CSMA協議的,即節點在發送數據包之前先監測信道,如果監測到信道空閑,則該節點就自己開始發送數據包。反之,如果監測結果為信道繁忙,即信道已經被鄰居節點占用,則該節點回退一段隨機時間后,再次開始監測,重復上面的操作。
在具體實現CSMA協議時,本文結合信道監測提供的接口對協議做了一些優化調整。另外,由于無線傳感器網絡中節點間距離很短,一般忽略傳播延遲,因此具體的實現與標準的CSMA協議有些不同,但原理一致,其實現如下:
如果節點要發送數據包,需要先進行載波監聽,首先隨機選擇一個采樣窗口數(即信道采樣次數),該采樣數屬于某一個范圍,本文選擇為8~32。采樣數隨機選擇的目的是減少沖突,舉例說明:假設信道目前空閑,A、B、C三個節點都是鄰居節點,且A、B節點有數據包要發送給節點C;A、B兩個鄰居節點同時開始監測,如果采樣窗口數固定,根據信道監測的規則,信道空閑必須等到采樣數用完才能下結論,那么A、B節點都在用完所有的采樣數后得岀信道空閑的結論,然后都發送數據包,這樣數據在節點C處就發生了沖突,最后A、B兩節點就必須依靠隨機回退一段時間后再次監測信道。采用隨機的采樣窗口數可以降低上面情況的發生率。因為采樣窗口數小的節點(假設為節點A)先得出信道空閑的結論并發送數據包,采樣窗口數大的節點B在后面的采樣中發現信道繁忙(因為節點A已經占用了信道)就回退,避免了發生沖突。
回退時間的選擇也是值得推敲的一個參數。CC2420是以數據包為單位發送的射頻芯片,其最大數據包的長度為128字節,加上同步頭5字節,總共是133字節。CC2420的發送速率是250 kb/s,即發送一個字節的時間為32 μs,因此發送一個最大數據包的時間為133×32=4 256 μs。根據信道采樣規則,只要一采樣到信道占用,就可以結束本次監測并得出信道繁忙的結論,因此回退時間應該要大于數據包的發送時間。又因為采樣窗口數已經采用了隨機選取,所以回退時間可以使用固定值。因此可以將回退時間固定為4.5 ms,回退功能的具體實現只需要一個定時器輔助就可以了。
最后,要處理信道強度閾值更新的問題。如果MAC層連續對信道監測的結果都是繁忙,且累計超過一個預設的閾值Y,就必須要調用MAC層提供的接口來對minSignal閾值進行更新,參照上節信號強度閾值的更新機制。根據實際的測試分析,Y的取值一般為30~60。
結語
本文靈活利用CC2420射頻芯片的特點,設計并實現了一整套從物理層到MAC層的無線傳感器網絡CSMA協議的實現;并詳細闡述了協議中信道監測使用的所有判定規則及各關鍵閾值參數的選擇。經過實際的多節點通信測試,該CSMA協議可以正確、穩定地進行信道活動監測,并實時動態地調整閾值;并且該CSMA協議的設計可以完全嵌入應用到其他MAC層協議中,輔助其他協議完成信道競爭或信道檢測。
評論
查看更多