無(wú)線(xiàn)傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用六資料_第1頁(yè)
無(wú)線(xiàn)傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用六資料_第2頁(yè)
無(wú)線(xiàn)傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用六資料_第3頁(yè)
無(wú)線(xiàn)傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用六資料_第4頁(yè)
無(wú)線(xiàn)傳感器網(wǎng)絡(luò)技術(shù)及應(yīng)用六資料_第5頁(yè)
已閱讀5頁(yè),還剩183頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 1 1第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6.1 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)操作系統(tǒng)概述6.2 TinyOS操作系統(tǒng)6.3 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2 26.1 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)操作系統(tǒng)概述無(wú)線(xiàn)傳感器網(wǎng)絡(luò)操作系統(tǒng)概述在某種程度上可以將傳感器網(wǎng)絡(luò)看做一種由大量微型、廉價(jià)、能量有限的多功能傳感器節(jié)點(diǎn)組成的、可協(xié)同工作的、面向分布式自組織網(wǎng)絡(luò)的計(jì)算機(jī)系統(tǒng)。因此,針對(duì)傳感器網(wǎng)絡(luò)應(yīng)用多樣、硬件功能有限、資源有限、節(jié)點(diǎn)微型化和分布式多協(xié)作等特點(diǎn),研究和設(shè)計(jì)新的基于傳感器網(wǎng)絡(luò)的操作系統(tǒng)就成為當(dāng)前提高無(wú)線(xiàn)傳感器網(wǎng)絡(luò)性能

2、的一個(gè)重要課題。當(dāng)前,有些研究人員認(rèn)為傳感器網(wǎng)絡(luò)的硬件很簡(jiǎn)單,沒(méi)有必要設(shè)計(jì)一個(gè)專(zhuān)門(mén)的操作系統(tǒng),可以直接在硬件上設(shè)計(jì)應(yīng)用程序。這種觀點(diǎn)在實(shí)際應(yīng)用中會(huì)碰到很多問(wèn)題。首先就是面向第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3 3傳感器網(wǎng)絡(luò)的應(yīng)用開(kāi)發(fā)難度會(huì)加大,應(yīng)用開(kāi)發(fā)人員不得不直接面對(duì)硬件進(jìn)行編程,無(wú)法得到像傳統(tǒng)操作系統(tǒng)那樣的豐富服務(wù);其次是軟件的重用性差,程序員無(wú)法繼承已有的軟件成果,降低了開(kāi)發(fā)效率,增加了開(kāi)發(fā)成本。另外,一些設(shè)計(jì)人員認(rèn)為,可以直接使用現(xiàn)有的嵌入式操作系統(tǒng),如VxWorks、WinCE、Linux、QNX等。這些系統(tǒng)中有基于微內(nèi)核架構(gòu)的嵌入式操作系統(tǒng),如VxWorks、QNX等

3、,也有基于單體內(nèi)核架構(gòu)的嵌入式操作系統(tǒng),如Linux等。由于這些操作系統(tǒng)主要面向嵌入式領(lǐng)域相對(duì)復(fù)雜的應(yīng)用,其功能也比較復(fù)雜,如它們可提供內(nèi)存動(dòng)態(tài)分配、虛擬內(nèi)存實(shí)時(shí)性支持、文件系統(tǒng)支持等,但是系統(tǒng)代碼尺寸相對(duì)較大。而傳感器網(wǎng)絡(luò)的硬件等資源極為有限,上述操作系統(tǒng)很難在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)這樣的硬件資源上高效運(yùn)行。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 4 4隨著無(wú)線(xiàn)傳感器網(wǎng)絡(luò)的深入發(fā)展,目前已經(jīng)出現(xiàn)了多種適合于無(wú)線(xiàn)傳感器網(wǎng)絡(luò)應(yīng)用的操作系統(tǒng),如TinyOS、MantisOS和SOS。本書(shū)只對(duì)TinyOS操作系統(tǒng)進(jìn)行簡(jiǎn)單介紹。 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5 56.2 TinyO

4、S操作系統(tǒng)操作系統(tǒng)TinyOS是一個(gè)典型的無(wú)線(xiàn)傳感器網(wǎng)絡(luò)操作系統(tǒng),能夠很好地滿(mǎn)足無(wú)線(xiàn)傳感器網(wǎng)絡(luò)操作的要求。TinyOS是由加州大學(xué)伯克利分校開(kāi)發(fā)的一個(gè)開(kāi)源的嵌入式操作系統(tǒng)。它采用一種基于組件(Component-based)的開(kāi)發(fā)方式,能夠快速實(shí)現(xiàn)各種應(yīng)用。TinyOS的程序核心往往都很小(一般來(lái)說(shuō)核心代碼和數(shù)據(jù)大概為400B),這樣能夠突破傳感器存儲(chǔ)資源少的限制,讓TinyOS有效運(yùn)行在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)上。它還提供一系列可重用的組件,可以簡(jiǎn)單方便地編制程序,用來(lái)獲取和處理傳感器的數(shù)據(jù)并通過(guò)無(wú)線(xiàn)電來(lái)傳輸信息。一個(gè)應(yīng)用程序可以使用這些組件,方法是通過(guò)連接配置文件第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建

5、及應(yīng)用實(shí)踐 6 6(Configuration)將各種組件連接(Wiring)起來(lái),以完成它所需要的功能。系統(tǒng)采用事件驅(qū)動(dòng)的工作模式采用事件觸發(fā)去喚醒傳感器工作。TinyOS操作系統(tǒng)、庫(kù)程序和應(yīng)用服務(wù)程序均是用nesC語(yǔ)言編寫(xiě)的,TinyOS的很多特性,如并發(fā)模型、組件結(jié)構(gòu)等都是由nesC語(yǔ)言體現(xiàn)的。nesC是一種開(kāi)發(fā)組件式結(jié)構(gòu)程序的語(yǔ)言,采用C語(yǔ)法風(fēng)格的語(yǔ)言,其語(yǔ)法是對(duì)標(biāo)準(zhǔn)C語(yǔ)法的擴(kuò)展。nesC支持TinyOS的并發(fā)模型,也使得組織、命名和連接組件成為健壯的嵌入式網(wǎng)絡(luò)系統(tǒng)的機(jī)制。 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 7 7TinyOS2.x支持eyesIFX、intelmote2

6、、mica2、mica2dot、mlcaz、shimmer、telosb、tinynode等平臺(tái)。TinyOS 集成開(kāi)發(fā)環(huán)境(IDE)種類(lèi)有:eclipse(集成開(kāi)發(fā)環(huán)境)、TOSSIM(TinyOS Simultor)、IAR Embedded Workbench、TI公司提供的開(kāi)發(fā)工具(支持MCU的有CC2530、MSP430、TMS470、C2000等處理器)、ATMEL AVR Studio集成開(kāi)發(fā)環(huán)境和AVR單片機(jī)C語(yǔ)言編譯器等。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 8 86.2.1 Ubuntu下下TinyOS2.x環(huán)境的搭建環(huán)境的搭建1在在Ubuntu10.04下添加下

7、添加TinyOS資源資源Ubuntu10.04下TinyOS2.x環(huán)境的搭建所需的軟件如下:(1) Ubuntu版本:10.04;(2) Eclipse版本:3.6;(3) TinyOS版本:2.1.1。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 9 9在Ubuntu10.04下添加TinyOS的步驟如下:(1) 配置source源,修改/ect/apt/sources.list文件,添加一行:$ deb http:/TinyOS./TinyOS/dist/ubuntu lucid main具體命令如下:$ sudo gedit /ect/apt/sources.l

8、ist$deb http:/TinyOS./TinyOS/dist/ubuntu lucid main其中,lucid是ubuntu10.04系統(tǒng)版本的代號(hào)。(2) 更新源目錄的包的列表,命令如下:$sudo apt-get update第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 10 10(3) 安裝tinyOS最新版及其相關(guān)工具。在命令行下運(yùn)行下列命令:$sudo apt-get install TinyOS 很有可能會(huì)提示在幾個(gè)版本中選擇,可選擇其中一個(gè)版本,然后重新執(zhí)行如下命令:$sudo apt-get install TinyOS-2.1.1(4) 進(jìn)入

9、/opt/tinyOS2.1.1目錄下,修改tinyOS.sh文件,將CLASSPATH一行修改為:CLASSPATH=$CLASSPATH:$TOSROOT/support/sdk/java:$TOSROOT/support/sdk/java/TinyOS.jar第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 11 11(5) 進(jìn)入/home/yourname目錄,在當(dāng)前目錄下.bashrc文件中添加以下內(nèi)容來(lái)進(jìn)行開(kāi)發(fā)環(huán)境的配置。執(zhí)行命令:$sudo gedit /.bashrc增加下面兩行:source /opt/TinyOS-2.1.1/TinyOS.shexport CLASSPATH

10、=$TOSROOT/support/sdk/java/TinyOS.jar:.第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 12 12(6) 執(zhí)行如下更新命令:$source ./bashrc$sudo tos-install-jni當(dāng)上述配置完畢后,運(yùn)行以下命令檢查環(huán)境配置情況:$tos-check-env(7) 安裝g+。執(zhí)行如下命令,可完成g+的安裝。$sudo apt-get install g+$sudo apt-get install python2.6-dev第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 13 13(8) 測(cè)試。用下列命令可測(cè)試配置是否成功:$cd /opt/

11、TinyOS-2.1.1/apps/Blink$make telosb如果要仿真,則需要修改/opt/TinyOS-2.1.1/support/make/sim.extra文件。首先執(zhí)行命令:$gedit /opt/TinyOS-2.1.1/support/make/sim.extra然后修改python的版本為:PYTHON_VERSION=2.6再重新運(yùn)行:make micaz sim若出現(xiàn)了提示:* Successfully built micaz TOSSIM library則表示構(gòu)建了TOSSIM庫(kù)。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 14 142安裝安裝Eclipse和

12、和Yeti插件插件1) 安裝Eclipse3.5可在終端里直接輸入:sudo apt-get install eclipse具體安裝步驟如下:(1) 下載eclipse3.6 for Linux的版本:http:/ 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 15 15(2) 解壓縮安裝包,放置相應(yīng)安裝目錄。執(zhí)行如下命令:cd /home/frankwoo/Downloadstar -zxvf eclipse-SDK-3.6-linux-gtk.tar.gzmv eclipse /usr/share(3) 創(chuàng)建ubuntu的eclipse菜單,執(zhí)行如下命令:gedit /usr/share/app

13、lications/Eclipse36.desktop添加內(nèi)容: Desktop EntryName=Eclipse第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 16 16Comment=Eclipse IDEExec=/usr/share/eclipse/eclipseIcon=/usr/share/eclipse/icon.xpmTerminal=falseType=ApplicationCategories=Application;Development;然后保存關(guān)閉。至此,Ubuntu上Eclipse3.6的安裝完成。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 17 172) 安

14、裝插件安裝必要的插件,以免在安裝Yeti時(shí)出現(xiàn)提示缺少組件。具體步驟如下:(1) 安裝GEF插件。選擇ecllipse的help菜單下的install new software子選項(xiàng),再選擇add,然后在 name中輸入GEF,在location中輸入/tools/gef/updates/releases/直接選上最后一個(gè),然后單擊next,再選擇accept all直至完成“finish”,最后重新啟動(dòng)。(2)安裝CDT插件。在name處輸入CDT,在location處輸入/tools/c

15、dt/releases/helios第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 18 18(3) 安裝Yeti插件。選擇ecllipse的help菜單下的install new software子選項(xiàng),再選擇add,然后在name中輸入Yeti2,在location中輸入http:/tos-ide.ethz.ch/update/site.xml。然后單擊下一步“next”,等待更新。安裝完畢后可設(shè)置環(huán)境變量,如下:Window-Preferences-TinyOS-Environments檢查各個(gè)目錄,單擊Apply,若出現(xiàn)OK,則設(shè)置完畢。3檢查檢查T(mén)inyOS的安裝的安裝TinyOS-

16、Check Installation至此,TinyOS環(huán)境搭建完畢。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 19 196.2.2 NesC語(yǔ)言和語(yǔ)言和TinyOS的組件的組件1NesC語(yǔ)言的使用環(huán)境語(yǔ)言的使用環(huán)境NesC是一種擴(kuò)展C的編程語(yǔ)言,主要用于傳感器網(wǎng)絡(luò)的編程開(kāi)發(fā),加州大學(xué)伯克利分校研發(fā)人員為這個(gè)平臺(tái)開(kāi)發(fā)了微型操作系統(tǒng)TinyOS和編程語(yǔ)言NesC,同時(shí)國(guó)內(nèi)外很多大學(xué)和機(jī)構(gòu)利用這一平臺(tái)進(jìn)行了相關(guān)問(wèn)題的研究。NesC主要用在TinyOS中,TinyOS也是由NesC編寫(xiě)完成的。TinyOS操作系統(tǒng)就是為用戶(hù)提供一個(gè)良好的用戶(hù)接口?;谝陨戏治?,研發(fā)人員在無(wú)線(xiàn)傳感器節(jié)點(diǎn)處理能力和存

17、儲(chǔ)能力有限的情況下設(shè)計(jì)了一種新型的嵌入式系統(tǒng)TinyOS,具有更強(qiáng)的網(wǎng)絡(luò)處理和資源收集能力,可滿(mǎn)足無(wú)線(xiàn)傳感器網(wǎng)絡(luò)的要求。為滿(mǎn)足無(wú)線(xiàn)傳感器網(wǎng)絡(luò)的要求,研究人員在TinyOS中引入了四種技術(shù):輕線(xiàn)程、主動(dòng)消息、事件驅(qū)動(dòng)和組件化編程。輕線(xiàn)程主要是針對(duì)節(jié)點(diǎn)并發(fā)操作可能比較頻繁,且線(xiàn)程比較短,傳統(tǒng)的進(jìn)程/線(xiàn)程調(diào)度無(wú)法滿(mǎn)足(使用傳統(tǒng)調(diào)度算法會(huì)產(chǎn)生大量能量用在無(wú)效的進(jìn)程互換過(guò)程中)的問(wèn)題提出的。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 20202NesC語(yǔ)言的主要特性語(yǔ)言的主要特性由于傳感器網(wǎng)絡(luò)的自身特點(diǎn),面向它的開(kāi)發(fā)語(yǔ)言也有其相應(yīng)的特點(diǎn)。主動(dòng)消息是并行計(jì)算機(jī)中的概念。在發(fā)送消息的同時(shí)傳送處理這個(gè)消息

18、的相應(yīng)處理函數(shù)ID和處理數(shù)據(jù),接收方得到消息后可立即進(jìn)行處理,從而可減少通信量。整個(gè)系統(tǒng)的運(yùn)行是因?yàn)槭录?qū)動(dòng)而運(yùn)行的,沒(méi)有事件發(fā)生時(shí),微處理器進(jìn)入睡眠狀態(tài),從而可以達(dá)到節(jié)能的目的。組件就是對(duì)軟硬件進(jìn)行功能抽象。整個(gè)系統(tǒng)是由組件構(gòu)成的,組件可提高軟件重用度和兼容性,程序員只關(guān)心組件的功能和自己的業(yè)務(wù)邏輯,而不必關(guān)心組件的具體實(shí)現(xiàn),從而可提高編程效率。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 21 213TinyOS的組件模型的組件模型1) 接口(Interface)nesC的接口有雙向性,是提供者組件和使用者組件之間的多功能交互通道。接口提供者實(shí)現(xiàn)了接口的一組功能函數(shù),稱(chēng)為命令;接口使用者

19、需要實(shí)現(xiàn)的一組功能函數(shù)稱(chēng)為事件。對(duì)于一個(gè)組件而言,如果它要使用某個(gè)接口中的命令,它必須實(shí)現(xiàn)這個(gè)接口的事件。接口由interface類(lèi)型定義,interface的語(yǔ)法定義如下:nesC-file:includes-listopt erface:第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2222interface identifier declaration-list storage-class-specifier: also one ofcommand event async聲明列表中,每個(gè)接口類(lèi)型都有一個(gè)聲明范圍。聲明列表必須由command或event存儲(chǔ)類(lèi)(

20、Storage Class)的功能描述組成,否則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。可選的async關(guān)鍵字指出命令或事件能在一個(gè)中斷處理程序(Interface Handler)中執(zhí)行。通過(guò)包含列表(Includes-list),一個(gè)接口能可選擇地包括C文件。簡(jiǎn)單的接口定義例子如下:第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2323interface SendMsg command result_t send(uint16_t address, uint8_t length, TOS_MsgPtr msg);event result_t sendDone (TOS_MsgPtr msg, result_t

21、 success)j從上面的定義可以看出,接口SendMsg包括了一個(gè)命令send和一個(gè)事件sendDone。提供接口SendMsg的組件必須實(shí)現(xiàn)send命令,而使用該接口的組件必須實(shí)現(xiàn)sendDone事件。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 24242) 組件(Component)任何一個(gè)nesC應(yīng)用程序都是由一個(gè)或多個(gè)組件連接起來(lái)的,從而形成了一個(gè)完整的可執(zhí)行程序。在nesC中有兩種類(lèi)型的組件,分別稱(chēng)為模塊和配置。模塊提供應(yīng)用程序代碼,實(shí)現(xiàn)一個(gè)或多個(gè)接口;配置則是用來(lái)將其他組件裝配起來(lái)的組件,將各個(gè)組件所使用的接口與其他組件提供的接口連接在一起,這種行為稱(chēng)為連接(Wiring)

22、。每個(gè)nesC應(yīng)用程序都由一個(gè)頂級(jí)配置所描述,其內(nèi)容就是將該應(yīng)用程序所用到的所有組件連接起來(lái),形成一個(gè)有機(jī)整體。組件的語(yǔ)法定義如下:第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2525nesC-file:includes-listopt moduleincludes-listopt configuration.module:module identifier specification module-implementationconfiguration:configuration identifier specification configuration-implementation組

23、件名由標(biāo)識(shí)符(Identifier)定義。該標(biāo)識(shí)符是全局性的,且屬于組件和接口類(lèi)型命名空間。一個(gè)組件可以有兩種作用域:一個(gè)規(guī)范(Specification)作用域,屬于C的全局作用域;一個(gè)實(shí)現(xiàn)(Implementation)作用域,屬于規(guī)范作用域。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2626通過(guò)包含列表,一個(gè)組件能可選擇地包括C文件。規(guī)范列出了該組件所提供或使用的規(guī)范元素(接口實(shí)例、命令或事件)。就如前面所述,一個(gè)組件必須實(shí)現(xiàn)它提供接口的命令和它使用的接口事件。一般情況下,命令向下調(diào)用硬件組件,而事件向上調(diào)用應(yīng)用組件。組件間的交互只能通過(guò)組件的規(guī)范元素來(lái)溝通。每種規(guī)范元素有一個(gè)名字

24、(接口實(shí)例名、命令名或事件名)。這些名字屬于每個(gè)組件特有的規(guī)范作用域的變量命名空間。規(guī)范的語(yǔ)法定義如下:第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2727specification:uses-provides-list uses-provides-list:uses-providesuses-provides-list uses-providesuses-provides:uses specification-element-listprovides specification-element-listspecification-element-list:specification-el

25、ement specification-elements specification-elements:specification-elementspecification-elements specification-element第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2828一個(gè)組件規(guī)范可以有多個(gè)uses和provides指令。多個(gè)uses和provides指令的規(guī)范元素可以通過(guò)使用“”和“)”符號(hào)在一個(gè)uses或provides命令中指定。例如,下面兩個(gè)定義是等價(jià)的:module A1 module A1 uses interface X; uses uses interfac

26、e Y; interface X; . interface Y; .第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 2929一個(gè)接口實(shí)例描述如下:specification-element:interface renamed-identifier parametersopt.renamed-identifier:identifieridentifier as identifierinterface-parameters: parameter-type-list第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3030接口實(shí)例聲明的完整語(yǔ)法是interface X as Y,這里可以明確地定義Y作

27、為接口的名字。interface X是interface X as X的一個(gè)簡(jiǎn)寫(xiě)形式。如果接口參數(shù)(Interface-parameters)被省略,那么interface X as Y聲明了對(duì)應(yīng)該組件的單一接口的一個(gè)簡(jiǎn)單的接口實(shí)例。如果給出了接口參數(shù)(如interface SendMsguint8_t id),那么這就是一個(gè)參數(shù)化的接口實(shí)例聲明,對(duì)應(yīng)該組件的多個(gè)接口中的一個(gè)(每個(gè)接口對(duì)應(yīng)不同參數(shù)值,因?yàn)?位整數(shù)可以表示256個(gè)值,所以interface SendMsguint8_t id中可以聲明256個(gè)SendMsg類(lèi)型的接口)。參數(shù)化接口的參數(shù)類(lèi)型必須是整型(這里枚舉類(lèi)型是不允許的)。第

28、6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 31 31指令或事件能通過(guò)一個(gè)聲明了指令或事件及存儲(chǔ)類(lèi)型的標(biāo)準(zhǔn)的C函數(shù)作為規(guī)格元素直接地被包含:specification-element:declaration.storage-class-specifier: also one ofcommand event async如果該聲明不是帶有指令或事件存儲(chǔ)類(lèi)型的函數(shù)聲明,則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。作為接口實(shí)例, 如果沒(méi)有指定接口參數(shù),指令(事件)就是簡(jiǎn)單的指令(簡(jiǎn)單的事件);如果接口參數(shù)是指定的,就是參數(shù)化指令(參數(shù)事件)。接口參數(shù)被放置在一般的函數(shù)參數(shù)列表之前,例如:第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建

29、及應(yīng)用實(shí)踐 3232command void senduint8 t id(int x):direct-declarator: alsodirect-declarator interface-parameters ( parameter-type-list ).注意:接口參數(shù)只允許在組件說(shuō)明中的指令或事件上使用,而不允許在接口類(lèi)型中使用。下面是一個(gè)完整的規(guī)格例子:configuration GenericComm provides interface StdControl as Control;/該接口以當(dāng)前消息序號(hào)作參數(shù)interface SendMsguint8_t id;第6章 無(wú)線(xiàn)傳感

30、器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3333interface ReceiveMsguint8_t id;uses /發(fā)送完成之后為組件作標(biāo)記/重試失敗的發(fā)送event result_t sendDone(); .在這個(gè)例子中,提供了簡(jiǎn)單的接口實(shí)例類(lèi)型StdControl的控制,提供了接口類(lèi)型 SendMsg和ReceiveMsg的參數(shù)實(shí)例,參數(shù)實(shí)例分別為SendMsg和ReceiveMsg,使用了事件sendDone。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 34343) 模塊(Module)模塊使用C語(yǔ)言實(shí)現(xiàn)組件規(guī)范,其定義如下:module-implementation:impleme

31、ntation translation-unit )其中,translation-unit是一連串的C語(yǔ)言聲明和定義。模塊中的translation-unit的頂層聲明屬于模塊的組件實(shí)現(xiàn)作用域。這些聲明的范圍可以是任意的標(biāo)準(zhǔn)C語(yǔ)言的聲明或定義、任務(wù)聲明或定義、命令或事件的實(shí)現(xiàn)。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3535下面的C語(yǔ)言語(yǔ)法定義了這些命令和事件的實(shí)現(xiàn):storage-class-specifier: also one ofcommand event asyncdeclaration-specifiers: alsodefault declaration-specifie

32、rsdirect-declarator: alsoidentifier.identifierdirect-declarator interface-parameters (parameter-type-list )筒單命令或事件的實(shí)現(xiàn)需要滿(mǎn)足具有command或event存儲(chǔ)類(lèi)的C語(yǔ)言函數(shù)定義的語(yǔ)法。另外,如果在命令或事件的聲明中包含了async關(guān)鍵字,那么在實(shí)現(xiàn)中必須包含async。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 36364) 調(diào)用命令(Calling Commands)和觸發(fā)事件(Signaling Events)下面的C語(yǔ)法的擴(kuò)展語(yǔ)法定義了調(diào)用命令和觸發(fā)事件:postfi

33、x-expression:postfix-expression argument-expression-list call-kindopt primary ( argument-expression-listopt ).call-kind: one ofcall signal post使用can a()調(diào)用一個(gè)簡(jiǎn)單的命令a,使用signal a()來(lái)觸發(fā)一件簡(jiǎn)單的事件a。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3737例如,在模塊中使用接口Send的SendMsg類(lèi)型:call Send.send(l,sizeof(Message),&msgl)對(duì)于類(lèi)型為t1, , tn的接口

34、參數(shù)的參數(shù)化命令a(或事件a),可以使用call ael()來(lái)調(diào)用,也可以使用signal ael,en()來(lái)觸發(fā)事件。接口參數(shù)表達(dá)式ei必須匹配類(lèi)型ti;實(shí)際的接口參數(shù)值映射到ti。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 38385) 原子(Atomic)的陳述nesC使用“原子”指出該段代碼“不可被打斷”。原子的語(yǔ)法如下:atomic-stmt:atomic statement下面是一個(gè)簡(jiǎn)單的例子:bool busy; /全局變量void f() bool available; atomic favailable= !busy; busy=TRUE; if (available)

35、do_something; atomic busy=FALSE;第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 3939原子的區(qū)段應(yīng)該很短,雖然這常常并不是必需的??刂浦荒堋罢5亍绷魅牖蛄鞒鲈拥年愂觯蝗魏蝕oto、return、break或continue跳轉(zhuǎn)入或轉(zhuǎn)出一原子陳述都是錯(cuò)誤的。返回陳述決不允許進(jìn)入原子陳述。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 40406) 配置(Configuration)配置通過(guò)連接一些其他組件來(lái)實(shí)現(xiàn)一個(gè)組件的規(guī)范。配置的語(yǔ)法如下:configuration-implementation:implementation component-list印

36、t connection-list connection-list中列出用來(lái)構(gòu)成配置的組件,connection-list指出這些組件是如何相連接以及如何與配置規(guī)范連接在一起的。這里把配置規(guī)范中的規(guī)范元素稱(chēng)為外部(External)規(guī)范元素,而把在配置的組件中的規(guī)范元素稱(chēng)為內(nèi)部(Internal)規(guī)范元素。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 41 417) 包含組件組件列表列出用來(lái)建立這一結(jié)構(gòu)的組件。在結(jié)構(gòu)里這些組件可隨意地重命名,使用共同外形規(guī)格元素,或簡(jiǎn)單地改變組件結(jié)構(gòu)從而避免名稱(chēng)沖突。為避免改變配置,為組件選擇的名字屬于成分的實(shí)現(xiàn)域。包含組件列表的語(yǔ)法如下:component

37、-list:componentscomponent-list componentscomponents:components component-line;第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 4242 component-line:renamed-identifiercomponent-line, renamed-identifierrenamed-identifier:identifieridentifier as identifier如果兩個(gè)組件使用as而導(dǎo)致重名,則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤(如components X、Y as X)。一個(gè)組件始終只能有一個(gè)實(shí)例,如果在兩個(gè)不同的配置中

38、都使用了組件K,或者在同一配置中使用兩次組件K,在程序中仍然只有K(及它的變量)的一個(gè)實(shí)例。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 43438) 連接(Wiring)連接用來(lái)把規(guī)范元素(接口、命令和事件)聯(lián)系在一起。由于連接的內(nèi)容比較復(fù)雜,讀者可以參考nesC給出的應(yīng)用示例中的源代碼進(jìn)行對(duì)照閱讀。連接的語(yǔ)法定義如下:connection-list:connectionconnection-list connectionconnection:endpoint=endpointendpointendpoint2;是一種包含兩個(gè)內(nèi)部規(guī)范元素的連接。這樣經(jīng)常把endpoint1定義的被使用的規(guī)

39、范元素連接到endpoint2定義的被提供的規(guī)范元素上。(3) endpoint1endpoint1。這三種連接中,指定的兩個(gè)規(guī)范元素必須是相容的,即它們必須都是命令、事件或接口實(shí)例。同時(shí),如果它們都是命令(或事件),則它們必須有相同的函數(shù)特征。如果它們都是接口實(shí)例,則它們必須有相同的接口類(lèi)型。如果這些條件不能滿(mǎn)足,就會(huì)發(fā)生編譯時(shí)錯(cuò)誤。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 4747如果一個(gè)端點(diǎn)是參數(shù)化的,則另一個(gè)必須也是參數(shù)化的,并且必須有相同的參數(shù)類(lèi)型;否則就會(huì)發(fā)生編譯時(shí)錯(cuò)誤。同一規(guī)范元素可能會(huì)被多次連接,例如:configuration C rovides interface X

40、jimplementation components C1, C2;X= C1.X;X= C2.X;第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 4848在這個(gè)例子中,多次連接將會(huì)導(dǎo)致接口X的事件多次被觸發(fā)(扇入),當(dāng)接口X中的命令被調(diào)用時(shí),會(huì)導(dǎo)致多個(gè)函數(shù)被執(zhí)行(扇出)。注意:當(dāng)兩個(gè)配置獨(dú)立地連接同一接口時(shí),也會(huì)發(fā)生多重連接。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 49496.3 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)6.3.1 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)簡(jiǎn)介無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)簡(jiǎn)介 圖圖6.1 節(jié)點(diǎn)柜節(jié)點(diǎn)柜本節(jié)主要介紹GreenOrbs無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái),該實(shí)驗(yàn)平臺(tái)將節(jié)點(diǎn)固

41、定在有機(jī)玻璃面板上的滑動(dòng)槽中,每個(gè)節(jié)點(diǎn)通過(guò)面板上的USB接口和USB Hub相連。多級(jí)USB Hub和電腦相連,實(shí)驗(yàn)人員能夠直接訪問(wèn)所有節(jié)點(diǎn)進(jìn)行程序燒錄、參數(shù)配置和數(shù)據(jù)獲取。有機(jī)玻璃面板可以懸掛在墻壁上或者安放在實(shí)驗(yàn)平臺(tái)附帶的金屬支架上。多個(gè)面板可以自由組合,方便運(yùn)輸和網(wǎng)絡(luò)規(guī)模的擴(kuò)充。實(shí)驗(yàn)平臺(tái)的節(jié)點(diǎn)柜如圖6.1所示。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5050圖6.1 節(jié)點(diǎn)柜第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 51 51GreenOrbs無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)的設(shè)計(jì)目標(biāo)是為大規(guī)模自組織網(wǎng)絡(luò)的協(xié)議及應(yīng)用開(kāi)發(fā)提供便利的測(cè)試環(huán)境,同時(shí)可作為物聯(lián)網(wǎng)相關(guān)課程的教學(xué)實(shí)驗(yàn)系統(tǒng)。1功能

42、特點(diǎn)功能特點(diǎn)GreenOrbs無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)的功能特點(diǎn)如下:(1) 網(wǎng)絡(luò)規(guī)??蓜?dòng)態(tài)調(diào)整,實(shí)驗(yàn)人員可根據(jù)實(shí)驗(yàn)要求靈活快捷地增加和減少節(jié)點(diǎn)數(shù)量,目前可支持多達(dá)150個(gè)節(jié)點(diǎn)的傳感器節(jié)點(diǎn)矩陣。(2) 實(shí)驗(yàn)平臺(tái)支持程序的自動(dòng)批量燒錄,可為實(shí)驗(yàn)提供很大的便利。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5252(3) 實(shí)驗(yàn)平臺(tái)具備節(jié)點(diǎn)位置自動(dòng)識(shí)別功能,實(shí)驗(yàn)人員可對(duì)指定位置節(jié)點(diǎn)進(jìn)行操作。(4) 實(shí)驗(yàn)平臺(tái)為節(jié)點(diǎn)提供了電池和USB接口兩種供電方式。(5) 實(shí)驗(yàn)平臺(tái)可對(duì)網(wǎng)絡(luò)拓?fù)溥M(jìn)行在線(xiàn)控制。(6) 除無(wú)線(xiàn)通信之外,實(shí)驗(yàn)平臺(tái)能方便地通過(guò)USB接口獲取節(jié)點(diǎn)數(shù)據(jù),為程序調(diào)試和其他科研教學(xué)活動(dòng)提供了強(qiáng)有力的支

43、持。(7) GreenOrbs物聯(lián)網(wǎng)實(shí)驗(yàn)室解決方案提供了豐富的軟件工具和高效的開(kāi)發(fā)測(cè)試環(huán)境,可顯著加快傳感器網(wǎng)絡(luò)通信協(xié)議開(kāi)發(fā)、系統(tǒng)設(shè)計(jì)和應(yīng)用研究進(jìn)程。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5353(8) GreenOrbs物聯(lián)網(wǎng)實(shí)驗(yàn)室解決方案附帶一系列無(wú)線(xiàn)傳感網(wǎng)絡(luò)的實(shí)例、演示程序和開(kāi)發(fā)教程,可為物聯(lián)網(wǎng)相關(guān)課程的教學(xué)工作提供幫助。(9)GreenOrbs物聯(lián)網(wǎng)實(shí)驗(yàn)室解決方案從物聯(lián)網(wǎng)四層結(jié)構(gòu)對(duì)高校物聯(lián)網(wǎng)實(shí)驗(yàn)室建設(shè)給出了合理性的建議,采用“層階式”教學(xué)方式,強(qiáng)調(diào)學(xué)生的設(shè)計(jì)、創(chuàng)新及實(shí)踐能力,培養(yǎng)物聯(lián)網(wǎng)工程專(zhuān)業(yè)的高級(jí)人才。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 54542平臺(tái)方案平臺(tái)方

44、案GreenOrbs無(wú)線(xiàn)傳感器網(wǎng)絡(luò)實(shí)驗(yàn)平臺(tái)支持多達(dá)150個(gè)節(jié)點(diǎn)的1510矩陣。所有節(jié)點(diǎn)固定在一塊3m4.5m有機(jī)玻璃上,通過(guò)USB線(xiàn)連接到一臺(tái)PC。節(jié)點(diǎn)間水平和垂直距離均為20cm。節(jié)點(diǎn)數(shù)量和網(wǎng)絡(luò)拓?fù)淇梢愿鶕?jù)實(shí)驗(yàn)需求動(dòng)態(tài)調(diào)整。GreenOrbs實(shí)驗(yàn)平臺(tái)服務(wù)器端采用開(kāi)源的Linux操作系統(tǒng),用戶(hù)能夠根據(jù)自己的需求選用大量的開(kāi)源軟件或者根據(jù)自己的需求自由開(kāi)發(fā)新的工具。節(jié)點(diǎn)采用TinyOS 2.x和NesC 編譯工具。TinyOS是為傳感器網(wǎng)絡(luò)節(jié)點(diǎn)而設(shè)計(jì)的一個(gè)事件驅(qū)動(dòng)的操作系統(tǒng)。NesC是對(duì)C 的擴(kuò)展,它基于體現(xiàn)TinyOS的結(jié)構(gòu)化概念和執(zhí)行模型而設(shè)計(jì)。GreenOrbs實(shí)驗(yàn)平臺(tái)支持現(xiàn)有的大量Tin

45、yOS和NesC開(kāi)發(fā)工具。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5555GreenOrbs實(shí)驗(yàn)平臺(tái)提供自動(dòng)、靈活的節(jié)點(diǎn)軟件批量并行燒錄工具。該工具能自動(dòng)識(shí)別各個(gè)節(jié)點(diǎn)在平臺(tái)上的物理位置并自動(dòng)實(shí)現(xiàn)和管理節(jié)點(diǎn)ID與物理位置之間的映射關(guān)系。在代碼燒錄過(guò)程中,可以根據(jù)需求對(duì)任意指定的多個(gè)節(jié)點(diǎn)并行燒入不同的代碼,極大地縮短軟件燒錄時(shí)間。GreenOrbs實(shí)驗(yàn)平臺(tái)支持實(shí)時(shí)的大批量實(shí)驗(yàn)數(shù)據(jù)收集。在實(shí)驗(yàn)過(guò)程中,傳感器節(jié)點(diǎn)產(chǎn)生的各種實(shí)驗(yàn)和監(jiān)控?cái)?shù)據(jù)能夠通過(guò)USB端口將實(shí)驗(yàn)數(shù)據(jù)實(shí)時(shí)發(fā)送到PC端。在PC端,GreenOrbs實(shí)驗(yàn)平臺(tái)能夠自動(dòng)地將節(jié)點(diǎn)產(chǎn)生的數(shù)據(jù)按照實(shí)驗(yàn)要求存儲(chǔ)在PC中。在試驗(yàn)過(guò)程中,研究人員能夠

46、隨時(shí)分析實(shí)驗(yàn)數(shù)據(jù)和了解試驗(yàn)進(jìn)展。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 56561) 硬件方案GreenOrbs實(shí)驗(yàn)平臺(tái)主要選用如下硬件模塊: GF-100傳感器節(jié)點(diǎn)(基本模塊); GF-103傳感器節(jié)點(diǎn)(基本模塊、溫濕度傳感器、光照傳感器、GPS); GF-103E傳感器節(jié)點(diǎn)(基本模塊、溫濕度傳感器、光照傳感器、GPS、封裝套件); GC-203E傳感器節(jié)點(diǎn)(基本模塊、增強(qiáng)處理模塊、溫濕度傳感器、光照傳感器、CO2傳感器); 實(shí)驗(yàn)床及平臺(tái)支持移動(dòng)裝置; 基站。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 57572) 軟件方案Green Orbs實(shí)驗(yàn)平臺(tái)主要選配如下軟件模塊: Li

47、nux下的TinyOS開(kāi)發(fā)環(huán)境; 實(shí)驗(yàn)平臺(tái)驅(qū)動(dòng)配置軟件工具包; 實(shí)驗(yàn)平臺(tái)工具軟件套裝(包括傳感器自動(dòng)定位和程序燒錄工具,支持定點(diǎn)燒錄和批量燒錄); 物聯(lián)網(wǎng)示范系統(tǒng)演示軟件套裝; 傳感器網(wǎng)絡(luò)實(shí)驗(yàn)數(shù)據(jù)分析和演示工具; 物聯(lián)網(wǎng)和傳感器網(wǎng)絡(luò)實(shí)驗(yàn)課程教學(xué)管理軟件。3) 傳感器節(jié)點(diǎn)傳感器節(jié)點(diǎn)GF-103/GF-103E、GC-203E的主要技術(shù)性能指標(biāo)如表6.1所示。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 5858表表6.1 傳感器節(jié)點(diǎn)的主要技術(shù)性能指標(biāo)傳感器節(jié)點(diǎn)的主要技術(shù)性能指標(biāo) 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 59596.3.2 TinyOS操作系統(tǒng)在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)中的應(yīng)用實(shí)踐

48、操作系統(tǒng)在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)中的應(yīng)用實(shí)踐1簡(jiǎn)單簡(jiǎn)單TinyOS程序程序通過(guò)設(shè)計(jì)實(shí)現(xiàn)單個(gè)傳感器節(jié)點(diǎn)程序的LED亮燈的程序,初步了解如何編譯及燒錄簡(jiǎn)單嵌入式NesC程序,并了解典型NesC的程序結(jié)構(gòu)及語(yǔ)法。1) 編譯及運(yùn)行示例程序首先,將telosb節(jié)點(diǎn)連接到PC的USB接口后,運(yùn)行以下命令查看連接情況:$ motelistReference Device Description- - -M4AP1122 /dev/ttyUSB0 Sentilla tmote sky第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6060這表示telosb節(jié)點(diǎn)成功連接到PC,并且設(shè)備端口號(hào)為/dev/ttyUSB0。

49、運(yùn)行以下編譯燒錄命令:$make telosb install如果沒(méi)有提示錯(cuò)誤,并且節(jié)點(diǎn)上的LED開(kāi)始有規(guī)律地閃爍,那么表示程序編譯并且燒錄成功。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 61 612) 程序結(jié)構(gòu)說(shuō)明每一個(gè)nesC程序都是由若干組件(Component)組成的。組件有兩種類(lèi)型,一種是模塊(Module),另一種是配置(Configuration)。配置文件的作用是表明組件之間的關(guān)系。模塊文件的作用是將程序的具體實(shí)現(xiàn)放在其中。此外,每個(gè)程序都需要一個(gè)頂層的配置文件,它是用程序名命名的。例1 示例Blink程序:程序由一個(gè)模塊文件(BlinkC.nc)和一個(gè)配置文件(Blin

50、kAppC.nc) 兩個(gè)組件組成。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6262下面是BlinkAppC.nc的源代碼:configuration BlinkAppC implementation components MainC, BlinkC, LedsC; components new TimerMilliC() as Timer0;components new TimerMilliC() as Timer1; components new TimerMilliC() as Timer2; BlinkC - MainC.Boot; BlinkC.Timer0 - Timer0;

51、 BlinkC.Timer1 - Timer1; BlinkC.Timer2 - Timer2; BlinkC.Leds - LedsC; 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6363這表明這是一個(gè)名為BlinkAppC的配置。在implementation關(guān)鍵字后面的括號(hào)內(nèi)是配置的具體實(shí)現(xiàn)。components關(guān)鍵字后面表明了這個(gè)配置文件所引用的組件,在這里分別是Main、BlinkC、LedsC以及三個(gè)TimerMilliC組件。最后五行表明了各組件間的Provider和User的關(guān)系。A-B表示了一種關(guān)系,其中A為使用方(User),而B(niǎo)為提供方(Provider)。命令(C

52、ommand)是接口提供方已經(jīng)實(shí)現(xiàn)的函數(shù)。事件(Event)是需要接口使用方實(shí)現(xiàn)的函數(shù)。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6464BlinkC.nc的源代碼:module BlinkC uses interface Timer as Timer0; uses interface Timer as Timer1; uses interface Timer as Timer2; uses interface Leds; uses interface Boot; implementation / implementation code omitted 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)

53、建及應(yīng)用實(shí)踐 6565第一行內(nèi)容表明這是一個(gè)名為BlinkC的module,而后括號(hào)中的內(nèi)容表明了該module使用的接口(interface)。注意:這個(gè)module沒(méi)有提供接口。由于使用方必須實(shí)現(xiàn)接口中的event函數(shù),因此我們可以看到該文件中的implement中包含了初始化Boot.booted,以及三個(gè)Timer時(shí)的event函數(shù)的具體實(shí)現(xiàn)。在每個(gè)Timer的觸發(fā)event函數(shù)內(nèi)容中寫(xiě)明了其需要觸發(fā)的內(nèi)容。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 66662TinyOS執(zhí)行模型執(zhí)行模型典型的傳感器節(jié)點(diǎn)程序可能同時(shí)包含同步處理與異步處理過(guò)程。本小節(jié)通過(guò)介紹TinyOS的執(zhí)行模型來(lái)

54、實(shí)現(xiàn)程序的異步處理。1) 同步及異步處理原理前面的程序都是同步運(yùn)行處理,只單一地執(zhí)行上下文,是非搶占式的方式。同步運(yùn)行處理有利于TinyOS的調(diào)度,在使得RAM使用最小化的同時(shí)讓同步代碼盡可能地簡(jiǎn)單。缺點(diǎn)是從開(kāi)始運(yùn)行一直占用CPU直到運(yùn)行完畢為止,期間其他同步代碼沒(méi)有任何運(yùn)行的機(jī)會(huì),從而嚴(yán)重影響系統(tǒng)的響應(yīng)性。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 6767非搶占式的同步代碼在大計(jì)算量的情況下可能會(huì)遇到一些問(wèn)題,因此,就需要將大計(jì)算量的代碼分割成若干小的部分,每次只執(zhí)行一小部分,并且當(dāng)一個(gè)組件需要做某件事情時(shí),可以稍后再做。在TinyOS中,對(duì)計(jì)算進(jìn)行延遲,直到計(jì)算所需要的條件都滿(mǎn)足時(shí)再

55、開(kāi)始任務(wù)(Task)是應(yīng)用程序中通用的“后臺(tái)”處理方式。一個(gè)任務(wù)就是一個(gè)函數(shù),它告訴TinyOS可以在稍晚時(shí)候進(jìn)行運(yùn)算,而不是立刻執(zhí)行。在傳統(tǒng)操作系統(tǒng)(Linux)中與之最接近的概念是中斷閥門(mén)和延遲程序調(diào)用。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 68682) 同步阻塞例子說(shuō)明例2 BlinkTask1例子。event void Timer0.fired() uint32_t i; dbg(“BlinkC”, “Timer 0 fired %s.n”,sim_time_string(); for(i=0;inodeid = TOS_NODE_ID; btrpkt-counter = c

56、ounter; if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(BlinkToRadioMsg)=SUCCESS) busy = TRUE; 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 8282消息發(fā)送完畢后,清除忙標(biāo)志位:event void AMSend.sendDone(message_t* msg, error_t error) if (&pkt = msg) busy = FALSE; 要為每個(gè)提供接口的組件添加組件聲明,其中AM_BLINKTORADIO參數(shù)表明AMSenderC的AM類(lèi)型。在頭文件中有定

57、義:implementation . components ActiveMessageC; components new AMSenderC(AM_BLINKTORADIO); . 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 8383然后,將接口的提供方和使用方連接起來(lái):implementation . App.Packet - AMSenderC; App.AMPacket - AMSenderC; App.AMSend - AMSenderC; App.AMControl - ActiveMessageC; 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 84843) 消息接收接收到消

58、息后,首先解析出消息中的計(jì)數(shù)器,然后計(jì)數(shù)器按照這個(gè)計(jì)數(shù)值的低三位亮燈,具體過(guò)程如下:(1) 接口聲明。使用Receive接口來(lái)接收包。在BlinkToRadioC.nc文件中添加以下聲明: module BlinkToRadioC . uses interface Receive; 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 8585(2) 接收邏輯。接收邏輯實(shí)現(xiàn)接口Receive.receive事件處理。event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) if (len = sizeof

59、(BlinkToRadioMsg) BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload; call Leds.set(btrpkt-counter); return msg; 第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 8686(3) 組件聲明。添加Receive接口對(duì)應(yīng)的組件聲明:implementation . components new AMReceiverC(AM_BLINKTORADIO); . 4) 程序測(cè)試分別使用make telosb install,1和make telosb install,2燒錄兩個(gè)節(jié)點(diǎn)。通電后查看

60、效果。當(dāng)按住某一個(gè)節(jié)點(diǎn)的RESET鍵時(shí),另一個(gè)節(jié)點(diǎn)的讀數(shù)應(yīng)當(dāng)停止。第6章 無(wú)線(xiàn)傳感器網(wǎng)絡(luò)開(kāi)發(fā)環(huán)境的構(gòu)建及應(yīng)用實(shí)踐 87874PC串口通信串口通信通過(guò)串口連接,PC可以從網(wǎng)絡(luò)搜集其他節(jié)點(diǎn)的數(shù)據(jù),也可以發(fā)送數(shù)據(jù)或者命令到節(jié)點(diǎn),實(shí)現(xiàn)節(jié)點(diǎn)和PC間的串口雙向通信,因此,串口通信編程是無(wú)線(xiàn)傳感器網(wǎng)絡(luò)中的重要內(nèi)容。下面介紹使用MIG工具和SerialForwarder修改BlinkToRadio程序,使用MsgReader讀取MIG創(chuàng)建的BlinkToRadioMsg的Java對(duì)象內(nèi)容。1) TestSerial例子程序節(jié)點(diǎn)與PC之間的通信在TinyOS中被抽象為數(shù)據(jù)包源(Packet Source)。一個(gè)數(shù)據(jù)包源就是一種與節(jié)點(diǎn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論