李曉芳
(太原科技大學 應科學院,太原 030024)
目前,無線傳感器網絡時間同步技術的研究重點已經從單跳網絡發(fā)展到多跳網絡。現(xiàn)有的多跳時間同步算法充分體現(xiàn)了同步功耗和同步精度以及同步周期間的折衷,本文著重解決的問題就是在不顯著增加同步功耗的前提下擴展同步周期,本文的硬件平臺為Silicon Labs公司的Si1000無線MCU芯片。
無線傳感器網絡的拓撲結構主要有星型網、樹型網和網狀網,本文以應用較多的星型網和樹型網結合的多級網絡結構為例進行同步過程的設計。
一個典型的網絡結構如圖1所示。網絡中的節(jié)點可以分為根節(jié)點、樹枝節(jié)點和樹葉節(jié)點3種類型。其中,最上端的0-0為根節(jié)點,網絡中間的如0-1、0-2、5-8等為樹枝節(jié)點,網絡末端的1-3、4-7等為樹葉節(jié)點。每兩個相連接的節(jié)點互稱為父子節(jié)點,如0-1和1-4互為父子節(jié)點。其中0-1是1-4的父節(jié)點,1-4是0-1的子節(jié)點,而1-4是4-7的父節(jié)點,4-7是1-4的子節(jié)點。在對節(jié)點編址時,每
一般情況下,在網絡中,根節(jié)點為網關節(jié)點,樹葉節(jié)點和樹枝節(jié)點均為簇頭,每個簇頭在為其他簇頭作數(shù)據(jù)轉發(fā)的同時,均可以接收傳感器節(jié)點的數(shù)據(jù)。簇頭的數(shù)量由ID號的位數(shù)決定,如果用一個字節(jié)來表示ID號,則網絡一個節(jié)點都有兩個地址信息,其中低位地址表示本節(jié)點在網絡中的唯一的ID號,高位地址表示該節(jié)點的父節(jié)點在網絡中的ID號。這種表示方式的優(yōu)勢在于,每個節(jié)點只跟自己的父節(jié)點和子節(jié)點通信,不與其他節(jié)點交互信息,即使收到其他節(jié)點的數(shù)據(jù)包,也會當作無效數(shù)據(jù)丟掉。這樣,每個節(jié)點的程序相對簡單,網絡的層數(shù)可以不受限制,網絡層數(shù)和網絡內節(jié)點數(shù)的增加,不會導致每個節(jié)點的程序復雜度的增加。中簇頭的最大數(shù)量為255個。
圖1 一個典型的樹型網絡
根據(jù)傳感器節(jié)點與簇頭節(jié)點的緊密程度,可以將傳感器節(jié)點劃分為若干個區(qū)域,每個區(qū)域設置一個簇頭,簇頭與采集節(jié)點之間采用星型網連接。
在無線傳感器網絡剛建立時,由于某些原因導致節(jié)點間的同步狀態(tài)丟失時,需要進行時鐘同步的“初始化”,采用即時同步的方式進行。
即時同步技術是星型網絡結構中一種高效的同步技術,同步以網關節(jié)點為起點,并由近及遠的同步樹型網絡結構中的各簇頭節(jié)點,之后簇頭節(jié)點再分別同步各自的傳感器節(jié)點。
下面以簇頭同步傳感器節(jié)點為例說明同步過程,同步的時序如圖2所示。
圖2 簇頭節(jié)點同步傳感器節(jié)點時序
一般情況下,傳感器節(jié)點在剛上電或復位之后,處于低功耗模式,實驗時,以5s為一個周期,即節(jié)點睡眠狀態(tài)4 995ms,接收狀態(tài)5ms,如果沒有有效數(shù)據(jù),則繼續(xù)轉入睡眠狀態(tài),如此循環(huán)下去。5ms稱為數(shù)據(jù)偵聽窗口。由于節(jié)點的個體差異、晶振的漂移等因素的影響,經過一段時間后,各個節(jié)點的數(shù)據(jù)接收窗口的起始時間差距就比較大了。如果簇頭要讓所有的傳感器節(jié)點都收到同步命令,必須連續(xù)發(fā)送5s。這個同步命令包括了簇頭的低位地址和一個不斷累加的序列號,共3個字節(jié)。若以115.2kbps的速率傳輸,發(fā)送一個同步命令需1.72ms,連續(xù)不斷地發(fā)送,從1開始,每發(fā)送一次,序列號加1。這樣,序列號本身就攜帶著時間信息。在實際編程中,共發(fā)送2 907次,約為5s。
簇頭連續(xù)發(fā)送5s同步序列后,轉入低功耗模式,5s結束時的時間點稱為同步時間點,即圖中的10s點的位置。如圖2所示,所有的傳感器節(jié)點在數(shù)據(jù)接收窗口內都至少能收到一條完整的喚醒命令。以收到的第一條完整的同步命令為有效命令,根據(jù)序列號,節(jié)點能夠判斷自己在時間軸上所處的位置,經過計算后,得到自己距同步時間點的時長t。可以看到,經過5s的持續(xù)同步后,所有傳感器節(jié)點均可以同步到同步時間點。
傳感器節(jié)點的同步流程圖如圖3所示。
圖3 傳感器節(jié)點的同步流程圖
網關節(jié)點同步簇頭節(jié)點的時序與傳感器節(jié)點類似,只是將通信速率降低到4 800bps,相對應的簇頭的偵聽窗口為50ms,睡眠4 950ms,網關發(fā)送的同步命令字為本地ID+末端簇頭ID+一個不斷累加的序列號,共3個字節(jié)。以4 800bps的波特率發(fā)送,每個同步命令需要22ms,實際編程中,共發(fā)送227次,約為5s。經過即時同步后,網絡中的各個節(jié)點均被同步到網關節(jié)點的時鐘上。
理想情況下,標稱值相同的晶振應該有相同的振蕩頻率,但是實際并非如此。晶振在標定頻率之外還有一個參數(shù),稱之為精度,單位是ppm,即每百萬次中的誤差次數(shù)。一顆標定為32.768kHz,20ppm的晶振,意味著每振蕩一百萬次,會偏差20次,正負都有可能。在本實驗系統(tǒng)中,采用的是32.768kHz,20ppm的晶振。
如果第N級節(jié)點和第N+1級節(jié)點所采用的兩顆晶振的偏差方向相反,則10min后兩級節(jié)點的時鐘偏差至多為2×12=24ms。
時鐘偏差臨界點時刻示意圖如圖4所示。
圖4 時鐘偏差示意圖
這里選擇10min作為本算法的補償周期是由物理層的具體特性決定的。在低功耗模式中,簇頭的偵聽窗口為50ms,被上層節(jié)點喚醒的通信波特率是4.8kbps。經過試驗得出:物理層發(fā)送一個有效載荷為3個字節(jié)的同步命令幀所需的時間約為22ms。
即使10min后的同步偏差達到24ms,第N層節(jié)點和第N+1層節(jié)點仍然有50-24=26ms的偵測窗口重疊期。如果第N層節(jié)點以兩個命令幀的密度向第N+1層節(jié)點發(fā)送同步指令,底層節(jié)點仍有機會捕獲到其中一個命令幀,因為26ms>22ms。以上均屬臨界時間狀態(tài),如果兩級節(jié)點的晶振偏差方向相同,則捕獲到上層同步指令的幾率還會增加。
要想保證兩級節(jié)點的可靠同步,必須在10min內執(zhí)行一次同步算法,否則低層節(jié)點將偏離出高層節(jié)點的發(fā)送窗口,即高層發(fā)送的命令,低層節(jié)點將不會收到。
將第N+1層節(jié)點的時鐘同步到第N層節(jié)點并實現(xiàn)自校正的步驟如下:
① 由第N層節(jié)點發(fā)起同步。首先第N層節(jié)點利用即時同步技術將低層(N+1)節(jié)點的時鐘同步到同步時間點t0,同時第N層節(jié)點將t0作為自身時間的零時初始時刻。
② t0+600s后,第N層節(jié)點向第N+1層節(jié)點發(fā)送兩個時間校驗命令幀,幀格式如下所示。
同步命令頭(幀序號) 第N層節(jié)點時間 第N 層節(jié)點時間0x81或者0x82 tN高字節(jié) tN 低字節(jié)
③ 第N+1層節(jié)點判斷收到的時間校驗命令幀的序號(第一個字節(jié))和第N層節(jié)點的時間tN(后兩個字節(jié))。
④ 計算出第N+1層節(jié)點的本地時鐘tN+1與tN的差值Δt。
⑤ 將Δt作為一個常數(shù),每隔10min補償?shù)絫N+1中一次。
兩層節(jié)點以第N層和第N+1層節(jié)點為例說明軟件的流程。第N層節(jié)點的流程圖如圖5所示。
由于所有節(jié)點在上電后處于低功耗模式,且各層節(jié)點不同步,所以需要初始第一次同步動作。第N層簇頭連續(xù)發(fā)送“本地ID+時間序列”同步幀,利用即時同步技術,將兩層節(jié)點同步到“零時”。
Sync是一個unsigned char型變量,可以追蹤時間的增長。在實際中,采用芯片內部的RTC進行計時,Sync的初始值為0,每發(fā)生一次RTC中斷事件,Sync的值加1。RTC中斷事件每5s發(fā)生一次,所以當Sync=120時,意味著10min的補償時刻到了。
在發(fā)送本地時鐘時,為了保證第N+1層節(jié)點能可靠地收到時間校正信號,采用了兩次發(fā)送同樣內容的方法。兩次發(fā)送幀中所帶的時間信息完全相同,物理層完成兩次發(fā)送的時間差是22ms。幀頭0x81和0x82用來幫助下層節(jié)點區(qū)分收到的是哪一次發(fā)送的時間校正信號。
第N+1層節(jié)點的軟件流程圖如圖6所示。
圖6 第N+1層節(jié)點的軟件流程圖
當收到父節(jié)點ID幀頭時,利用即時同步機制第一次將本節(jié)點和上一層節(jié)點初始同步。當收到0x81或者0x82幀頭時,進行兩層節(jié)點間的時鐘校對:把本地時鐘和上一層時鐘的差值D_value保存,并把收到的上一層參考時鐘寫入本地RTC的CAPTUREn寄存器中。
本層節(jié)點每600s進行一次晶振偏移補償:將本地時鐘減去D_value,然后寫入RTC寄存器,完成校對。
由于傳感器節(jié)點的偵聽窗口為5ms,若同樣采用精度為20ppm的晶振,經過計算,需要在第1min的時候進行時鐘校驗,否則就會超出偵聽窗口。
實驗采用兩塊基于Si1000芯片的節(jié)點電路板,其中一塊作為第N層節(jié)點,另一塊作為第N+1層節(jié)點。
在兩級節(jié)點的軟件中加入測試信號輸出:每過5s,RTC中斷事件會把MCU喚醒,同時會在MCU的一個端口輸出一個低電平脈沖。將脈沖信號輸入到示波器的兩個輸入通道中,記錄波形。
將示波器的時域解析度放大至5μs,會發(fā)現(xiàn)在初始的即時同步后,兩個節(jié)點之間存在絕對誤差e=5.4μs,如圖7所示。如果不加以干預,兩節(jié)點的時鐘偏差會逐步擴大,最終導致網絡的不同步。
圖7 初始同步誤差e
數(shù)據(jù)采集的方法是,將這對節(jié)點每隔3min測量一次脈沖的時間差Δt,連續(xù)記錄一個小時,將結果保存到表1中(兩節(jié)點每10min誤差17ms)。
對比試驗:將上述兩節(jié)點軟件中的自校正機制移除,即僅用即時同步機制初始同步一次,其后的晶振偏移不再校正。每隔3min記錄一次Δt,將結果保存到表1中。
表1 兩級節(jié)點時鐘偏差對比分析表
用MATLAB繪制兩種同步方式的對比曲線如圖8所示。
圖8 兩級節(jié)點時鐘偏差對比分析曲線圖
由實驗結果可以看到,僅僅做了一次即時同步的一對節(jié)點,它們的時鐘偏差在不斷擴大,其呈現(xiàn)線性特征,每10min的時鐘偏差約為17ms。
采用了自校正技術的同步算法的一對節(jié)點,具有本地晶振振蕩偏差自動補償機制。每隔10min,它們之間的偏差就會被校正。節(jié)點間的同步有效時間顯著延長。在實際測試中,經過16個小時的實驗后觀測,仍能達到理想的同步效果。
本文基于Si1000芯片平臺,實現(xiàn)了一種將無線傳感器網絡節(jié)點的同步周期進行擴展的方法,利用即時同步技術進行節(jié)點間同步的初始化,隨后每間隔一段時間,節(jié)點主動校準自己的時鐘,從而實現(xiàn)了在沒有顯著增加能量消耗的前提下,擴展同步周期,提高同步精度。編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。
[1] Elson J,Rmer K.Wireless sensor networks:A new regime for time synchronization[J].ACM SIGCOMM Computer Communication Review,2003,33(1):149-154.
[2] Sivrikaya F,Yener B.Time synchronization in sensor networks:A survey[J].IEEE Network Magazine,Special Issue on Ad Hoc Networking:Data Communications &Topology Control,2004,18(4):45-50.
[3] 許劍新,馮冬芹.基于本地時鐘自校正的無線傳感器網絡同步方法[J].傳感技術學報,2008,21(8):1148-1152.
[4] 肖琳,程利娟,王福豹.一種低功耗無線傳感器網絡時間同步算法[J].計算機研究與發(fā)展,2008,45(1):126-130.