技術(shù)領(lǐng)域:本發(fā)明涉及一種無線傳感器網(wǎng)絡(luò),特別是無線傳感器網(wǎng)絡(luò)的數(shù)據(jù)匯集。
背景技術(shù):
:
近年來隨著物聯(lián)網(wǎng)的快速發(fā)展,無線傳感器網(wǎng)絡(luò)開始在人們的生活中扮演著越來越重要的角色。無線傳感器網(wǎng)絡(luò)綜合了傳感器技術(shù)、嵌入式計算技術(shù)、現(xiàn)代網(wǎng)絡(luò)及無線通信技術(shù)、分布式信息處理技術(shù)等多種領(lǐng)域,被廣泛地應(yīng)用于多種應(yīng)用場景,如農(nóng)業(yè)養(yǎng)殖、生態(tài)監(jiān)測、工業(yè)設(shè)施檢測、自然災(zāi)害預(yù)測、智能交通控制、智能家居及軍事場合等。
無線傳感器網(wǎng)絡(luò)常用的拓撲結(jié)構(gòu)主要有星型、樹型、網(wǎng)狀等拓撲結(jié)構(gòu)。其中樹型拓撲為分層結(jié)構(gòu),具有方便分支管理、易于擴展(容易加入新的分支或新的節(jié)點、故障隔離容易等優(yōu)點。對于一些具有固定數(shù)據(jù)采集周期、數(shù)據(jù)傳輸量小頻率低、通訊范圍大且需要分區(qū)域管理的無線傳感器網(wǎng)絡(luò)應(yīng)用領(lǐng)域,使用樹型拓撲相比其他拓撲結(jié)構(gòu)更為合適。但是傳統(tǒng)的樹型傳感器網(wǎng)絡(luò)在組網(wǎng)方面,動態(tài)拓撲能力差,傳感器節(jié)點非常依賴它的上一級節(jié)點,一旦上一級節(jié)點出現(xiàn)故障,其下的傳感器節(jié)點都將從網(wǎng)絡(luò)中脫離。同時傳統(tǒng)的樹型傳感器網(wǎng)絡(luò)在數(shù)據(jù)匯集方面,常使用兩種匯集方法:一是傳感器節(jié)點按照固定時間間隔從低功耗休眠中喚醒,測量環(huán)境參數(shù)完成后隨機等待一段時間,主動發(fā)送數(shù)據(jù);二是傳感器節(jié)點按照固定時間間隔從休眠中喚醒,測量環(huán)境參數(shù)完成后等待協(xié)調(diào)器發(fā)送的匯集指令,被動發(fā)送數(shù)據(jù)。前者易出現(xiàn)多個節(jié)點數(shù)據(jù)并發(fā),造成消息碰撞,需多次重發(fā),浪費多余能耗,后者為了保障節(jié)點能接收到匯集指令,節(jié)點需要提前較長時間喚醒,同樣浪費多余能耗。
技術(shù)實現(xiàn)要素:
:
針對以上問題,本發(fā)明是設(shè)計出的一種符合實際需求的樹型傳感器網(wǎng)絡(luò)的自組網(wǎng)和低功耗數(shù)據(jù)匯集方法。
一種樹型傳感器網(wǎng)絡(luò)的自組網(wǎng)和低功耗數(shù)據(jù)匯集方法,對應(yīng)的傳感器網(wǎng)絡(luò)為三層樹型拓撲結(jié)構(gòu),由監(jiān)測服務(wù)器主機、中繼網(wǎng)關(guān)、協(xié)調(diào)器和傳感器節(jié)點組成。樹型拓撲結(jié)構(gòu)的第一層為監(jiān)測服務(wù)器主機,可連接多個中繼網(wǎng)關(guān);樹型拓撲結(jié)構(gòu)的第二層為中繼網(wǎng)關(guān)加協(xié)調(diào)器,每個中繼網(wǎng)關(guān)只對應(yīng)一個協(xié)調(diào)器因此在拓撲關(guān)系中兩者可視為一體,中繼網(wǎng)關(guān)負責(zé)與監(jiān)測服務(wù)器主機連接,協(xié)調(diào)器負責(zé)與傳感器節(jié)點連接;樹型拓撲結(jié)構(gòu)的最后一層為傳感器節(jié)點。傳感器節(jié)點與協(xié)調(diào)器通過無線通信,協(xié)調(diào)器與中繼網(wǎng)關(guān)通過串口通訊,傳感器節(jié)點負責(zé)在現(xiàn)場測量各種環(huán)境數(shù)據(jù),并將數(shù)據(jù)通過無線發(fā)送給協(xié)調(diào)器,協(xié)調(diào)器一方面通過無線與傳感器節(jié)點進行通訊,負責(zé)傳感器網(wǎng)絡(luò)的建立,和傳感器節(jié)點測量數(shù)據(jù)的采集;另一方面通過串口與中繼網(wǎng)關(guān)進行通訊,負責(zé)向中繼網(wǎng)關(guān)轉(zhuǎn)發(fā)傳感器節(jié)點測量數(shù)據(jù),和接收中繼網(wǎng)關(guān)的指令;中繼網(wǎng)關(guān)的作用是當(dāng)各節(jié)點的測量數(shù)據(jù)在中繼網(wǎng)關(guān)中數(shù)據(jù)匯集后,由網(wǎng)關(guān)對數(shù)據(jù)進行融合,最后通過網(wǎng)絡(luò)將數(shù)據(jù)發(fā)送至監(jiān)測服務(wù)器;
所述傳感器節(jié)點的工作步驟包括節(jié)點首次接入網(wǎng)絡(luò)階段、重新接入網(wǎng)絡(luò)階段、數(shù)據(jù)測量發(fā)送階段;具體步驟如下:
節(jié)點通電后,初始化硬件配置。
讀取控制器片內(nèi)eeprom中的自身節(jié)點地址信息,默認地址為0x0000;
1.節(jié)點地址是否為0x0000,如果是,則判斷自身為未組網(wǎng)的新節(jié)點,進入節(jié)點首次接入網(wǎng)絡(luò)階段,即步驟4-7;否則判斷不是新節(jié)點,進入步驟8;
首次接入網(wǎng)絡(luò)階段:
2.在信道0廣播新節(jié)點請求入網(wǎng)指令;
3.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,判斷是否收到協(xié)調(diào)器回復(fù)的允許新節(jié)點入網(wǎng)指令,如果是,則進入步驟6,否則,返回步驟4;
4.讀取新節(jié)點允許入網(wǎng)指令,記錄協(xié)調(diào)器分配的節(jié)點地址寫入eeprom,記錄使用信道,標記自身狀態(tài)為正常狀態(tài),標記剛?cè)刖W(wǎng);
5.在信道0向現(xiàn)協(xié)調(diào)器回復(fù)節(jié)點確認入網(wǎng)指令,進入步驟8;
6.判斷自身狀態(tài)是否為故障狀態(tài),如果是,進入重新接入網(wǎng)絡(luò)階段,即步驟9-18,否則進入數(shù)據(jù)測量發(fā)送階段,即步驟19-28;
7.重新接入網(wǎng)絡(luò)階段:
8.判斷原有節(jié)點請求入網(wǎng)指令廣播次數(shù)是否達到規(guī)定次數(shù),如果是,進入步驟14,否則進入步驟10;
9.在通道0廣播原有節(jié)點請求入網(wǎng)指令;
10.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,判斷是否收到原協(xié)調(diào)器回復(fù)的允許原有節(jié)點入網(wǎng)指令,如果是,則進入步驟12,否則,進入步驟13;
11.標記自身為正常狀態(tài),標記剛?cè)刖W(wǎng),記錄指令中的使用信道,返回步驟8;
12.隨機等待一段時間,返回步驟9;
13.在通道0廣播待托管節(jié)點請求入網(wǎng)指令;
14.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,判斷是否收到協(xié)調(diào)器回復(fù)的允許待托管節(jié)點入網(wǎng)指令,如果是,則進入步驟16,否則,進入步驟18;
15.讀取指令,記錄使用信道,標記自身狀態(tài)為正常狀態(tài),標記剛?cè)刖W(wǎng);
16.在信道0向托管協(xié)調(diào)器回復(fù)待托管節(jié)點確認入網(wǎng)指令,返回步驟8;
17.等待30秒,將原有節(jié)點請求入網(wǎng)指令廣播次數(shù)清零,返回步驟9;
18.數(shù)據(jù)測量發(fā)送階段:
19.判斷是否剛?cè)刖W(wǎng),如果是,則進入步驟20,否則進入步驟22;
20.給所有測量數(shù)據(jù)賦值為0;
21.切換至使用信道接收狀態(tài),一直等待現(xiàn)網(wǎng)絡(luò)中協(xié)調(diào)器發(fā)送的數(shù)據(jù)采集指令,接收到指令后,進入步驟24;
22.打開傳感器模塊供電電源,測量環(huán)境參數(shù);
23.關(guān)閉傳感器供電電源,喚醒無線模塊,切換至使用信道接收狀態(tài),等待協(xié)調(diào)器指令,等待時間為t_wait_collect,判斷是否接收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)采集指令,如果是,進入步驟24,否則進入步驟28;
24.記錄下次采集數(shù)據(jù)時間間隔t_collect、故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add,計算下次低功耗處理器喚醒定時時間t_wake=t_collect-t_measure–(n_error_add*t_wait),無線模塊喚醒后接收等待時長t_wait_collect=n_error*t_wait,定時器定時t_wake;
25.在使用信道向協(xié)調(diào)器發(fā)送節(jié)點發(fā)送測量數(shù)據(jù)指令;
26.關(guān)閉所有不用資源,進入休眠;
27.定時時間t_wake到后,定時器中斷喚醒低功耗處理器,返回步驟8;
28.標記自身故障狀態(tài),返回步驟8;
所述協(xié)調(diào)器工作步驟包括協(xié)調(diào)器入網(wǎng)階段、監(jiān)聽廣播階段和數(shù)據(jù)匯集階段;
具體步驟如下:
協(xié)調(diào)器入網(wǎng)階段:
1.協(xié)調(diào)器通電后,初始化硬件配置;
2.向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器請求入網(wǎng)指令;
3.收到網(wǎng)關(guān)回復(fù)的批準協(xié)調(diào)器入網(wǎng)指令后,記錄協(xié)調(diào)器地址、原有節(jié)點數(shù)和使用信道,標記所有節(jié)點為故障狀態(tài);
4.在信道0廣播協(xié)調(diào)器信道選擇指令;
5.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,判斷是否收到其他協(xié)調(diào)器回復(fù)的協(xié)調(diào)器信道占用指令,如果是,判斷該信道被占用,進入步驟6,否則判斷該信道可用,進入步驟9;
6.判斷是否協(xié)調(diào)器選擇信道指令發(fā)送次數(shù)等于信道總數(shù)減1次,如果是,判斷信道選擇失敗,進入步驟7,否則進入步驟8;
7.向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器信道選擇失敗指令,等待一段時間后,清空協(xié)調(diào)器選擇信道指令發(fā)送次數(shù),返回步驟4;
8.改變協(xié)調(diào)器選擇信道指令中選用信道,返回步驟4;
9.確定使用信道channel_used向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器信道選擇成功指令;
10.收到網(wǎng)關(guān)回復(fù)網(wǎng)絡(luò)建立成功指令后,更新定時器定時時間t_collect,定時器定時;
11.切換至信道0接收狀態(tài),監(jiān)聽廣播;
12.判斷定時器定時時間是否達到,如果沒有到達,進入監(jiān)聽廣播階段,即步驟13-27,否則進入數(shù)據(jù)匯集階段,即步驟28-39;
監(jiān)聽廣播階段:
13.判斷是否收到節(jié)點或其他協(xié)調(diào)器廣播的指令,如果是,進入步驟14,否則返回步驟12;
14.讀取指令,判斷指令類別,如果是協(xié)調(diào)器信道選擇指令,進入步驟15,如果是節(jié)點請求入網(wǎng)指令,進入步驟19;
處理其他協(xié)調(diào)器信道選擇指令子流程:
15.判斷協(xié)調(diào)器信道選擇指令中選用信道和自身使用信道是否相同,如果是,判斷信道沖突,進入步驟16,否則進入步驟17;
16.在信道0回復(fù)協(xié)調(diào)器信道占用指令;
17.判斷自身托管節(jié)點中是否有節(jié)點地址首字節(jié)同發(fā)送協(xié)調(diào)器信道選擇指令的協(xié)調(diào)器的地址,如果有這樣的節(jié)點,進入步驟18,否則返回步驟11;
18.標記該托管節(jié)點為故障狀態(tài),向網(wǎng)關(guān)發(fā)送節(jié)點故障指令,返回步驟11;
處理節(jié)點請求入網(wǎng)指令子流程:
19.讀取指令,判斷指令類型,如果是新節(jié)點請求入網(wǎng)指令,進入步驟20;如果是原有節(jié)點請求入網(wǎng)指令,進入步驟23;如果是原有節(jié)點請求入網(wǎng)指令,進入步驟21,如果是待托管節(jié)點請求入網(wǎng)指令,進入步驟25;
20.分配節(jié)點地址,在信道0向節(jié)點發(fā)送允許新節(jié)點入網(wǎng)指令;
21.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,如果接收到節(jié)點確認入網(wǎng)指令(包含節(jié)點地址),則進入步驟22,否則,返回步驟11;
22.更新節(jié)點數(shù)目s_node=s_node+1,標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送新節(jié)點入網(wǎng)指令,返回步驟11;
23.在信道0向節(jié)點發(fā)送允許原有節(jié)點入網(wǎng)指令;
24.標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送原有節(jié)點入網(wǎng)指令,返回步驟11;
25.在信道0向節(jié)點發(fā)送允許待托管節(jié)點入網(wǎng)指令;
26.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,如果接收到待托管節(jié)點確認入網(wǎng)指令,則進入步驟27,否則,返回步驟11;
27.記錄該托管節(jié)點地址,標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送待托管節(jié)點入網(wǎng)指令;返回步驟11;
數(shù)據(jù)匯集階段:
28.定時器定時時間達到后,向網(wǎng)關(guān)發(fā)送獲取下次采集數(shù)據(jù)時間指令;
29.收到網(wǎng)關(guān)回復(fù)的通知下次采集數(shù)據(jù)時間指令后,更新定時器定時時間t_collect,定時器定時;
30.讀取第一個節(jié)點的地址和狀態(tài),清零故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add;
31.該節(jié)點狀態(tài)是否為正常狀態(tài),進入步驟32,否則,進入步驟36;
32.在使用信道channel_used上向節(jié)點發(fā)送數(shù)據(jù)采集指令;
33.切換至使用信道channel_used接收狀態(tài),開始定時t_wait時間,等待回復(fù),如果定時時間內(nèi)接收到節(jié)點發(fā)送測量數(shù)據(jù)指令,則進入步驟34,否則,進入步驟35;
34.記錄測量數(shù)據(jù),向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器數(shù)據(jù)傳輸指令,等待定時時間到,進入步驟37;
35.標記節(jié)點為故障狀態(tài),更新故障節(jié)點總數(shù)n_error=n_error+1,新增故障節(jié)點數(shù)n_error_add=n_error_add+1,向網(wǎng)關(guān)發(fā)送節(jié)點故障指令,進入步驟37;
36.更新故障節(jié)點總數(shù)n_error=n_error+1;
37.該節(jié)點是否為最后一個節(jié)點,如果是,進入步驟37,否則進入步驟38;
38.向網(wǎng)關(guān)發(fā)送本輪數(shù)據(jù)采集完畢指令,返回步驟11;
39.讀取下一個節(jié)點的地址和狀態(tài),返回步驟31。
相比傳統(tǒng)樹形傳感器網(wǎng)絡(luò),本發(fā)明的優(yōu)點有:
1.規(guī)定傳感器節(jié)點和協(xié)調(diào)器之間廣播時固定使用信道0,與其他階段的兩者之間網(wǎng)絡(luò)通信信道區(qū)分開。這使得需要廣播的協(xié)調(diào)器選擇信道指令和傳感器節(jié)點入網(wǎng)指令只需在單一信道中廣播,而無需掃描多個信道,在降低協(xié)調(diào)器選擇信道過程和傳感器節(jié)點入網(wǎng)過程的復(fù)雜性的同時,又避免傳感器節(jié)點在入網(wǎng)過程中因掃描多個信道而產(chǎn)生的額外能耗,從而延長了網(wǎng)絡(luò)壽命。
2.當(dāng)協(xié)調(diào)器出現(xiàn)故障,短時間掉線時,其連接的傳感器節(jié)點能自動重新接入網(wǎng)絡(luò)。當(dāng)協(xié)調(diào)器出現(xiàn)故障,長時間掉線時,其連接的傳感器節(jié)點能在保留原本網(wǎng)絡(luò)拓撲結(jié)構(gòu)信息的前提下,接入其他協(xié)調(diào)器建立的網(wǎng)絡(luò),這使得用戶得到的傳感器節(jié)點測量數(shù)據(jù)因為協(xié)調(diào)器故障而缺失的情況大大減少,優(yōu)化了測量數(shù)據(jù)的完整性。
3.出現(xiàn)故障的協(xié)調(diào)器重新上線重建新網(wǎng)絡(luò)時,原有節(jié)點能快速回歸到該協(xié)調(diào)器建立的網(wǎng)絡(luò)中,包括已經(jīng)接入其他協(xié)調(diào)器網(wǎng)絡(luò)的傳感器節(jié)點,也能快速退出現(xiàn)有網(wǎng)絡(luò),回歸到原協(xié)調(diào)器建立的網(wǎng)絡(luò)。同時傳感器節(jié)點出現(xiàn)故障后重新上線,也能快速回歸到原網(wǎng)絡(luò)。這兩者保證了網(wǎng)絡(luò)拓撲結(jié)構(gòu)的穩(wěn)定性,使得網(wǎng)絡(luò)的拓撲結(jié)構(gòu)不會因為協(xié)調(diào)器或傳感器節(jié)點故障而遭受破壞。
4.在數(shù)據(jù)匯集過程中采用傳感器節(jié)點接收到協(xié)調(diào)器指令后被動發(fā)送測量數(shù)據(jù)的方法,避免了多節(jié)點并發(fā)情況。同時使用了一種相對簡單且不需要rtc時鐘的動態(tài)時間同步策略,使傳感器節(jié)點在每次數(shù)據(jù)匯集過程中都會動態(tài)地根據(jù)當(dāng)前網(wǎng)絡(luò)的拓撲情況和拓撲變化情況,相應(yīng)地調(diào)整下一次傳感器節(jié)點喚醒時間和無線模塊無線接收等待時長,避免了節(jié)點過早喚醒和無線長時間接收等待造成的能耗浪費,從而延長了網(wǎng)絡(luò)壽命。
附圖說明:
附圖1為傳感器節(jié)點硬件結(jié)構(gòu)圖。
附圖2為協(xié)調(diào)器硬件結(jié)構(gòu)圖。
附圖3為樹形網(wǎng)絡(luò)結(jié)構(gòu)圖。
附圖4為傳感器節(jié)點工作總流程圖。
附圖5為節(jié)點首次接入網(wǎng)絡(luò)階段流程圖。
附圖6為節(jié)點重新入網(wǎng)階段流程圖。
附圖7為節(jié)點數(shù)據(jù)測量發(fā)送階段流程圖。
附圖8為協(xié)調(diào)器工作總流程圖。
附圖9為協(xié)調(diào)器入網(wǎng)流程圖。
附圖10為協(xié)調(diào)器監(jiān)聽廣播階段流程圖。
附圖11為協(xié)調(diào)器處理其他協(xié)調(diào)器信道選擇指令子流程。
附圖12為協(xié)調(diào)器處理節(jié)點請求入網(wǎng)指令子流程圖。
附圖13為協(xié)調(diào)器數(shù)據(jù)匯集階段流程圖。
具體實施方式:
下面結(jié)合實例和附圖對本發(fā)明實現(xiàn)方法和原理進一步說明。
本發(fā)明的傳感器節(jié)點與協(xié)調(diào)器通過433m無線通信,協(xié)調(diào)器與中繼網(wǎng)關(guān)通過串口通訊。
傳感器節(jié)點(簡稱節(jié)點):負責(zé)在現(xiàn)場測量各種環(huán)境數(shù)據(jù),并將數(shù)據(jù)通過433m無線發(fā)送給協(xié)調(diào)器。
傳感器節(jié)點由電源模塊、433m無線模塊、低功耗處理器和傳感器模塊構(gòu)成,硬件結(jié)構(gòu)圖如圖1所示。
其中,電源模塊為其他三個模塊供電,同時低功耗處理器能切斷傳感器模塊供電。低功耗處理器與433m無線模塊之間通過spi總線進行數(shù)據(jù)傳輸,低功耗處理器與傳感器模塊根據(jù)傳感器的不同通過iic總線或adc進行數(shù)據(jù)傳輸。
協(xié)調(diào)器:一方面通過433m無線與傳感器節(jié)點進行通訊,負責(zé)傳感器網(wǎng)絡(luò)的建立,和傳感器節(jié)點測量數(shù)據(jù)的采集。另一方面通過串口與中繼網(wǎng)關(guān)進行通訊,負責(zé)向中繼網(wǎng)關(guān)轉(zhuǎn)發(fā)傳感器節(jié)點測量數(shù)據(jù),和接收中繼網(wǎng)關(guān)的指令。
協(xié)調(diào)器由電源模塊、433m無線模塊、低功耗處理器和傳感器模塊構(gòu)成,硬件結(jié)構(gòu)圖如圖2所示。
其中,電源模塊為其他兩個模塊供電。低功耗處理器與433m無線模塊之間通過spi總線進行數(shù)據(jù)傳輸。
中繼網(wǎng)關(guān)(簡稱網(wǎng)關(guān)):當(dāng)各節(jié)點的測量數(shù)據(jù)在中繼網(wǎng)關(guān)中數(shù)據(jù)匯集后,由網(wǎng)關(guān)對數(shù)據(jù)進行融合,最后通過網(wǎng)絡(luò)將數(shù)據(jù)發(fā)送至監(jiān)測服務(wù)器。
傳感器、協(xié)調(diào)器、中繼網(wǎng)關(guān)和監(jiān)測服務(wù)器主機構(gòu)成的樹型網(wǎng)絡(luò)結(jié)構(gòu)圖如圖3所示。
其中監(jiān)測服務(wù)器主機作為樹型網(wǎng)絡(luò)的第一層,每個中繼網(wǎng)關(guān)對應(yīng)一個協(xié)調(diào)器視為一體作為樹型網(wǎng)絡(luò)的第二層,傳感器節(jié)點作為樹型網(wǎng)絡(luò)的第三層。
名稱解釋:
如果節(jié)點a沒有加入過任何網(wǎng)絡(luò)的節(jié)點,則稱節(jié)點a為新節(jié)點。當(dāng)新節(jié)點a加入到協(xié)調(diào)器a的網(wǎng)絡(luò)中,則稱節(jié)點a為是協(xié)調(diào)器a的現(xiàn)有節(jié)點,協(xié)調(diào)器a是節(jié)點a的現(xiàn)協(xié)調(diào)器。當(dāng)現(xiàn)有節(jié)點a因為故障而脫離網(wǎng)絡(luò),則稱節(jié)點a為協(xié)調(diào)器a的原有節(jié)點,協(xié)調(diào)器a是節(jié)點a的原協(xié)調(diào)器。當(dāng)協(xié)調(diào)器a的原有節(jié)點a加入?yún)f(xié)調(diào)器b網(wǎng)絡(luò),則稱節(jié)點a是協(xié)調(diào)器b的托管節(jié)點,協(xié)調(diào)器b是節(jié)點a的托管協(xié)調(diào)器,節(jié)點a是協(xié)調(diào)器a的被托管節(jié)點(屬于原有節(jié)點范疇)。
將傳感器節(jié)點的運行狀態(tài)分為兩種狀態(tài):一.未組網(wǎng)或者已組網(wǎng)但與協(xié)調(diào)器斷開連接的狀態(tài)(簡稱故障狀態(tài));二.已組網(wǎng)并與協(xié)調(diào)器連接正常狀態(tài)(簡稱正常狀態(tài))。
協(xié)調(diào)器和節(jié)點向外發(fā)送數(shù)據(jù)后等待應(yīng)答時間均為t_wait,超時不再等待。等待應(yīng)答時間t_wait根據(jù)實際應(yīng)用中單次應(yīng)答所需時間決定。
節(jié)點首次接入網(wǎng)絡(luò)階段、重新接入網(wǎng)絡(luò)階段,無線信道為信道0(廣播信道),在數(shù)據(jù)測量發(fā)送階段,無線信道為對應(yīng)網(wǎng)絡(luò)的使用信道。
傳感器節(jié)點工作流程:主要包括節(jié)點首次接入網(wǎng)絡(luò)階段、重新接入網(wǎng)絡(luò)階段、數(shù)據(jù)測量發(fā)送階段。
注1:除了未入網(wǎng)的新節(jié)點接收允許入網(wǎng)指令之外,其余節(jié)點只能接收指令中節(jié)點地址符合自身地址的協(xié)調(diào)器指令。
注2:在監(jiān)聽廣播階段,協(xié)調(diào)器收發(fā)指令都使用信道0(廣播信道);在數(shù)據(jù)匯集階段,協(xié)調(diào)器收發(fā)指令都使用協(xié)調(diào)器入網(wǎng)階段選擇的使用信道channel_used。
注3:在數(shù)據(jù)匯集階段,協(xié)調(diào)器發(fā)出向節(jié)點發(fā)送數(shù)據(jù)采集指令后,無論是否收到回復(fù),都需要等待t_wait時間后,才能進入下一步驟。
1.節(jié)點通電后,初始化硬件配置。
2.讀取控制器片內(nèi)eeprom中的自身節(jié)點地址信息(默認地址為0x0000)。
3.節(jié)點地址是否為0x0000?如果是,則判斷自身為未組網(wǎng)的新節(jié)點,進入節(jié)點首次接入網(wǎng)絡(luò)階段(步驟4-7)。否則判斷不是新節(jié)點,進入步驟8。
首次接入網(wǎng)絡(luò)階段(步驟4-7):
4.在信道0(廣播信道)廣播新節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。
5.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,是否收到協(xié)調(diào)器回復(fù)的允許新節(jié)點入網(wǎng)指令(包含分配的節(jié)點地址和使用信道)?如果是,則進入步驟6。否則,返回步驟4。
注1:等待時間t_wait根據(jù)實際采用的433m無線模塊單次應(yīng)答所需時間決定。
注2:節(jié)點地址(2字節(jié))由網(wǎng)關(guān)地址(1字節(jié))和入網(wǎng)序號(1字節(jié))構(gòu)成。這樣的好處在于根據(jù)節(jié)點地址就能知道網(wǎng)絡(luò)結(jié)構(gòu)信息,即連接的網(wǎng)關(guān)地址和網(wǎng)絡(luò)序號。
6.讀取新節(jié)點允許入網(wǎng)指令,記錄協(xié)調(diào)器分配的節(jié)點地址寫入eeprom,記錄使用信道。標記自身狀態(tài)為正常狀態(tài),標記剛?cè)刖W(wǎng)。
注1:節(jié)點地址寫入eeprom是為了保證節(jié)點掉電后仍能保持原網(wǎng)絡(luò)結(jié)構(gòu)信息。
注2:使用信道不寫入eeprom是因為協(xié)調(diào)器故障掉電,重新上電需要重新選擇信道建立網(wǎng)絡(luò),在eeprom中寫入使用信道沒有意義。
7.在信道0向現(xiàn)協(xié)調(diào)器回復(fù)節(jié)點確認入網(wǎng)指令(包含節(jié)點地址)。進入步驟8。
8.自身狀態(tài)是否為故障狀態(tài)?如果是,進入重新接入網(wǎng)絡(luò)階段(步驟9-18),否則進入數(shù)據(jù)測量發(fā)送階段(步驟19-28)。
重新接入網(wǎng)絡(luò)階段(步驟9-18):
(嘗試連接原協(xié)調(diào)器)
9.判斷原有節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)廣播次數(shù)是否達到規(guī)定次數(shù)(可根據(jù)需要設(shè)置)?如果是,進入步驟14,否則進入步驟10。
10.在通道0廣播原有節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。
11.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,是否收到原協(xié)調(diào)器回復(fù)的允許原有節(jié)點入網(wǎng)指令(包含節(jié)點地址和使用信道)?如果是,則進入步驟12。否則,進入步驟13。
12.標記自身為正常狀態(tài),標記剛?cè)刖W(wǎng),記錄指令中的使用信道。返回步驟8。
13.隨機等待一段時間,返回步驟9。
(請求其他協(xié)調(diào)器托管)
14.在通道0廣播待托管節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。
15.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,是否收到協(xié)調(diào)器回復(fù)的允許待托管節(jié)點入網(wǎng)指令(包含節(jié)點地址和使用信道)?如果是,則進入步驟16。否則,進入步驟18。
16.讀取指令,記錄使用信道。標記自身狀態(tài)為正常狀態(tài),標記剛?cè)刖W(wǎng)。
17.在信道0向托管協(xié)調(diào)器回復(fù)待托管節(jié)點確認入網(wǎng)指令(包含節(jié)點地址)。返回步驟8。
18.等待30秒(根據(jù)需要設(shè)置),將原有節(jié)點請求入網(wǎng)指令廣播次數(shù)清零。返回步驟9。
數(shù)據(jù)測量發(fā)送階段(步驟19-28):
19.判斷是否剛?cè)刖W(wǎng)?如果是,則進入步驟20,否則進入步驟22。
20.給所有測量數(shù)據(jù)賦值為0。
注:在接入網(wǎng)絡(luò)后的首次數(shù)據(jù)發(fā)送階段僅為了和協(xié)調(diào)器時間同步,不測量環(huán)境數(shù)據(jù)。
21.切換至使用信道接收狀態(tài),一直等待現(xiàn)網(wǎng)絡(luò)中協(xié)調(diào)器發(fā)送的數(shù)據(jù)采集指令(包含節(jié)點地址、下次采集數(shù)據(jù)時間間隔t_collect、故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add)。接收到指令后,進入步驟24。
注:一直接收狀態(tài)等待是因為節(jié)點剛接入網(wǎng)絡(luò)和協(xié)調(diào)器之間時間還未同步。
22.打開傳感器模塊供電電源,測量環(huán)境參數(shù)。
23.關(guān)閉傳感器供電電源。喚醒無線模塊。切換至使用信道接收狀態(tài),等待協(xié)調(diào)器指令,等待時間為t_wait_collect,是否接收到協(xié)調(diào)器發(fā)送的數(shù)據(jù)采集指令?如果是,進入步驟24,否則進入步驟28。
24.記錄下次采集數(shù)據(jù)時間間隔t_collect、故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add,計算下次低功耗處理器喚醒定時時間t_wake=t_collect-t_measure-(n_error_add*t_wait)。無線模塊喚醒后接收等待時長t_wait_collect=t_wait+n_error*t_wait。定時器定時t_wake。
注1:t_measure為節(jié)點上傳感器測量數(shù)據(jù)所需時間總和,由實際節(jié)點所擁有的傳感器類型和數(shù)目決定。計算t_wake時減去t_measure是因為傳感器模塊測量環(huán)境數(shù)據(jù)需要時間t_measure,所以節(jié)點需要提前t_measure喚醒測量。
注2:計算t_wake時減去n_error_add*t_wait是因為下一次數(shù)據(jù)采集比這一次減少了n_error_add個節(jié)點,導(dǎo)致下一次協(xié)調(diào)器發(fā)送的數(shù)據(jù)采集指令會比這一次提早到達n_error_add*t_wait時間。
注3:計算t_wait_collect時加上n_error*t_wait是因為在到達下一次數(shù)據(jù)采集之前,最多可能會有n_error個節(jié)點從故障狀態(tài)恢復(fù)正常,導(dǎo)致下一次數(shù)據(jù)采集指令最多晚n_error*t_wait時間到達。
25.在使用信道向協(xié)調(diào)器發(fā)送節(jié)點發(fā)送測量數(shù)據(jù)指令(包含節(jié)點地址和測量數(shù)據(jù))。
26.關(guān)閉所有不用資源,進入休眠。
27.定時時間t_wake到后,定時器中斷喚醒低功耗處理器。返回步驟8。
28.標記自身故障狀態(tài),返回步驟8。
協(xié)調(diào)器工作流程:主要包括協(xié)調(diào)器入網(wǎng)階段、監(jiān)聽廣播階段和數(shù)據(jù)匯集階段。
注1:在監(jiān)聽廣播階段,協(xié)調(diào)器收發(fā)指令都使用信道0(廣播信道);在數(shù)據(jù)匯集階段,協(xié)調(diào)器收發(fā)指令都使用協(xié)調(diào)器入網(wǎng)階段選擇的使用信道channel_used。
1.協(xié)調(diào)器通電后,初始化硬件配置。
協(xié)調(diào)器入網(wǎng)階段(步驟2-12):
2.向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器請求入網(wǎng)指令。
3.收到網(wǎng)關(guān)回復(fù)的批準協(xié)調(diào)器入網(wǎng)指令(包含分配的協(xié)調(diào)器地址、原有節(jié)點數(shù)s_node和使用信道)后,記錄協(xié)調(diào)器地址、原有節(jié)點數(shù)和使用信道。標記所有節(jié)點為故障狀態(tài)。
注1:因為該網(wǎng)絡(luò)結(jié)構(gòu)中協(xié)調(diào)器附屬于網(wǎng)關(guān),是一對一關(guān)系,所以設(shè)定分配的協(xié)調(diào)器地址同網(wǎng)關(guān)地址。
注2:網(wǎng)關(guān)只傳輸原有節(jié)點數(shù),而不傳輸具體節(jié)點地址是因為節(jié)點地址(2字節(jié))由協(xié)調(diào)器地址(1字節(jié))和入網(wǎng)序號(1字節(jié))構(gòu)成,協(xié)調(diào)器能根據(jù)原有節(jié)點數(shù)目自動生成原有節(jié)點地址。
4.在信道0廣播協(xié)調(diào)器信道選擇指令(包含協(xié)調(diào)器地址和選用信道)。
5.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,是否收到其他協(xié)調(diào)器回復(fù)的協(xié)調(diào)器信道占用指令(包含協(xié)調(diào)器地址和使用信道)?如果是,判斷該信道被占用,進入步驟6,否則判斷該信道可用,進入步驟9。
6.是否協(xié)調(diào)器選擇信道指令發(fā)送次數(shù)等于信道總數(shù)減1次?如果是,判斷信道選擇失敗,進入步驟7,否則進入步驟8。
7.向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器信道選擇失敗指令,等待一段時間后(根據(jù)需要修改),清空協(xié)調(diào)器選擇信道指令發(fā)送次數(shù),返回步驟4。
8.改變協(xié)調(diào)器選擇信道指令中選用信道,返回步驟4。
9.確定使用信道channel_used向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器信道選擇成功指令(包含協(xié)調(diào)器地址和使用信道)。
10.收到網(wǎng)關(guān)回復(fù)網(wǎng)絡(luò)建立成功指令(包含距下次采集數(shù)據(jù)時間間隔t_collect)后,更新定時器定時時間t_collect,定時器定時。
11.切換至信道0接收狀態(tài),監(jiān)聽廣播。
12.定時器定時時間是否達到?如果沒有到達,進入監(jiān)聽廣播階段(步驟13-27),否則進入數(shù)據(jù)匯集階段(步驟28-39)。
監(jiān)聽廣播階段(步驟13-27):
13.是否收到節(jié)點或其他協(xié)調(diào)器廣播的指令?如果是,進入步驟14,否則返回步驟12。
14.讀取指令,判斷指令類別。如果是協(xié)調(diào)器信道選擇指令(包含協(xié)調(diào)器地址和選用信道),進入步驟15。如果是節(jié)點請求入網(wǎng)指令(包含節(jié)點地址),進入步驟19。
處理其他協(xié)調(diào)器信道選擇指令子流程:
15.協(xié)調(diào)器信道選擇指令中選用信道和自身使用信道是否相同?如果是,判斷信道沖突,進入步驟16。否則進入步驟17。
16.在信道0回復(fù)協(xié)調(diào)器信道占用指令(包含協(xié)調(diào)器地址和使用信道)。
17.自身托管節(jié)點中是否有節(jié)點地址首字節(jié)(即協(xié)調(diào)器地址)同發(fā)送協(xié)調(diào)器信道選擇指令的協(xié)調(diào)器的地址?如果有這樣的節(jié)點,進入步驟18,否則返回步驟11。
18.標記該托管節(jié)點為故障狀態(tài),向網(wǎng)關(guān)發(fā)送節(jié)點故障指令(包含節(jié)點地址),返回步驟11。
注:標記該托管節(jié)點為故障狀態(tài)后,下次數(shù)據(jù)匯集不會詢問該托管節(jié)點,該托管節(jié)點將判斷自身故障狀態(tài),啟動重新入網(wǎng)流程,優(yōu)先加入原協(xié)調(diào)器建立的網(wǎng)絡(luò)。從而實現(xiàn)了原協(xié)調(diào)器重新上線后,被托管節(jié)點回歸原協(xié)調(diào)器建立的網(wǎng)絡(luò)的功能。
處理節(jié)點請求入網(wǎng)指令子流程:
19.讀取指令,判斷指令類型?如果是新節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別),進入步驟20。如果是原有節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別),進入步驟23。如果是原有節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別),進入步驟21。如果是待托管節(jié)點請求入網(wǎng)指令(包含節(jié)點的地址和傳感器類別),進入步驟25。
20.分配節(jié)點地址,在信道0向節(jié)點發(fā)送允許新節(jié)點入網(wǎng)指令(包含節(jié)點地址)。
注:節(jié)點地址(2字節(jié))由協(xié)調(diào)器地址(1字節(jié))和入網(wǎng)序號n(1字節(jié))構(gòu)成。入網(wǎng)序號n=原有節(jié)點數(shù)s_node+1。
21.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,如果接收到節(jié)點確認入網(wǎng)指令(包含節(jié)點地址),則進入步驟22。否則,返回步驟11。
注:等待時間t_wait根據(jù)實際采用的433m無線模塊單次應(yīng)答所需時間決定。
22.更新節(jié)點數(shù)目s_node=s_node+1,標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送新節(jié)點入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。返回步驟11。
23.在信道0向節(jié)點發(fā)送允許原有節(jié)點入網(wǎng)指令(包含節(jié)點地址)。
24.標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送原有節(jié)點入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。返回步驟11。
25.在信道0向節(jié)點發(fā)送允許待托管節(jié)點入網(wǎng)指令(包含節(jié)點地址和使用信道)。
26.切換至信道0接收狀態(tài),等待回復(fù),等待時間為t_wait,如果接收到待托管節(jié)點確認入網(wǎng)指令(包含節(jié)點地址),則進入步驟27。否則,返回步驟11。
27.記錄該托管節(jié)點地址,標記節(jié)點為正常狀態(tài),向網(wǎng)關(guān)發(fā)送待托管節(jié)點入網(wǎng)指令(包含節(jié)點的地址和傳感器類別)。返回步驟11。
注:相比新節(jié)點入網(wǎng),托管節(jié)點入網(wǎng)時,協(xié)調(diào)器不更新節(jié)點數(shù)目s_node,不分配新地址,使托管節(jié)點能保存原網(wǎng)絡(luò)結(jié)構(gòu)信息。
數(shù)據(jù)匯集階段(步驟28-38):
28.定時器定時時間達到后,向網(wǎng)關(guān)發(fā)送獲取下次采集數(shù)據(jù)時間指令。
29.收到網(wǎng)關(guān)回復(fù)的通知下次采集數(shù)據(jù)時間指令(包含距下次采集數(shù)據(jù)時間間隔t_collect)后,更新定時器定時時間t_collect,定時器定時。
30.讀取第一個節(jié)點的地址和狀態(tài),清零故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add。
31.該節(jié)點狀態(tài)是否為正常狀態(tài),進入步驟32。否則,進入步驟36。
32.在使用信道channel_used(協(xié)調(diào)器入網(wǎng)階段確定的使用信道)上向節(jié)點發(fā)送數(shù)據(jù)采集指令(包含節(jié)點地址、下次采集數(shù)據(jù)時間間隔t_collect、故障節(jié)點總數(shù)n_error和新增故障節(jié)點數(shù)n_error_add)。
33.切換至使用信道channel_used接收狀態(tài),開始定時t_wait,等待回復(fù),如果定時時間內(nèi)接收到節(jié)點發(fā)送測量數(shù)據(jù)指令(包含節(jié)點地址和測量數(shù)據(jù)),則進入步驟34。否則,進入步驟35。
34.記錄測量數(shù)據(jù),向網(wǎng)關(guān)發(fā)送協(xié)調(diào)器數(shù)據(jù)傳輸指令(包含節(jié)點地址和測量數(shù)據(jù))。等待定時時間到,進入步驟37。
注:需等待定時時間到達是為了確保在數(shù)據(jù)匯集階段內(nèi)協(xié)調(diào)器用在每一個節(jié)點上的時間相同,從而保障與節(jié)點的時間同步。
35.標記節(jié)點為故障狀態(tài),更新故障節(jié)點總數(shù)n_error=n_error+1,新增故障節(jié)點數(shù)n_error_add=n_error_add+1,向網(wǎng)關(guān)發(fā)送節(jié)點故障指令(包含節(jié)點地址)。進入步驟37。
36.更新故障節(jié)點總數(shù)n_error=n_error+1;
37.該節(jié)點是否為最后一個節(jié)點(包括托管節(jié)點在內(nèi))?如果是,進入步驟37,否則進入步驟38。
38.向網(wǎng)關(guān)發(fā)送本輪數(shù)據(jù)匯集完畢指令,返回步驟11。
39.讀取下一個節(jié)點的地址和狀態(tài),返回步驟31。