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