基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn).doc_第1頁
基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn).doc_第2頁
基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn).doc_第3頁
基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn).doc_第4頁
基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn).doc_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

基于無線傳感器網(wǎng)絡(luò)的遠(yuǎn)程環(huán)境監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn)1 系統(tǒng)概述1.1 系統(tǒng)背景近年來,由于計算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)、現(xiàn)代電子技術(shù)的迅猛發(fā)展,無線通信技術(shù)在醫(yī)療、自動化控制、遠(yuǎn)程監(jiān)測等多個領(lǐng)域得到了廣泛的應(yīng)用。其中環(huán)境遠(yuǎn)程監(jiān)測有其特定的應(yīng)用背景,一般在比較偏僻、環(huán)境惡劣的無人居住區(qū)域(如沙漠、高山、叢林等危險地區(qū)),這使得很難通過架設(shè)電纜來完成數(shù)據(jù)傳輸,因此使用無線通信是一種很好的選擇。對環(huán)境的監(jiān)測是十分重要且有意義的,獲得生存環(huán)境的實時的數(shù)據(jù),有助于我們預(yù)測環(huán)境變化的趨勢以及更好的掌握自己生活的環(huán)境現(xiàn)狀并加以改善。1.2 系統(tǒng)簡介本系統(tǒng)在實驗環(huán)境中搭建一個ZigBee網(wǎng)絡(luò),該網(wǎng)絡(luò)由一個中心節(jié)點和多個終端節(jié)點以自組織方式構(gòu)成。終端節(jié)點負(fù)責(zé)采集環(huán)境溫濕度等數(shù)據(jù)信息,并通過 ZigBee 網(wǎng)絡(luò)把采集的數(shù)據(jù)信息發(fā)送至中心節(jié)點;與中心節(jié)點相連的控制器(ARM單片機(jī))將數(shù)據(jù)發(fā)送到串口,再通過socket 通信將數(shù)據(jù)傳到遠(yuǎn)程主機(jī),并將獲得的信息存入數(shù)據(jù)庫中。設(shè)計一個界面,可通過界面顯示出所需要的信息以及提供相關(guān)查詢服務(wù)。整個系統(tǒng)設(shè)計綜合利用ZigBee網(wǎng)絡(luò)的低成本、低功耗、自組織、靈活等優(yōu)良特性,提出一個實時、高效的遠(yuǎn)程環(huán)境監(jiān)測解決方案。1.3 關(guān)鍵詞解釋1.3.1無線傳感器網(wǎng)絡(luò)無線傳感器網(wǎng)絡(luò)(Wireless Sensor Network, WSN),就是由部署在監(jiān)測區(qū)域內(nèi)大量的廉價微型傳感器節(jié)點組成,通過無線通信方式形成的一個多跳的自組織的網(wǎng)絡(luò)系統(tǒng),其目的是協(xié)作地感知、采集和處理網(wǎng)絡(luò)覆蓋區(qū)域中被感知對象的信息,并發(fā)送給觀察者2。傳感器、感知對象和觀察者構(gòu)成了無線傳感器網(wǎng)絡(luò)的三個要素。無線傳感器網(wǎng)絡(luò)所具有的眾多類型的傳感器,可探測包括地震、電磁、溫度、濕度、噪聲、光強(qiáng)度、壓力、土壤成分、移動物體的大小、速度和方向等周邊環(huán)境中多種多樣的現(xiàn)象?;贛EMS的微傳感技術(shù)和無線聯(lián)網(wǎng)技術(shù)為無線傳感器網(wǎng)絡(luò)賦予了廣闊的應(yīng)用前景。這些潛在的應(yīng)用領(lǐng)域可以歸納為:軍事、航空、反恐、防爆、救災(zāi)、環(huán)境、醫(yī)療、保健、家居、工業(yè)、商業(yè)等領(lǐng)域34。其主要特點有:1) 低速率傳感器網(wǎng)絡(luò)節(jié)點通常只需定期傳輸溫度、濕度、壓力、流量、電量等被測參數(shù),相對而言,被測參數(shù)的數(shù)據(jù)量小,采集數(shù)據(jù)頻率較低。2) 低功耗通常,傳感器節(jié)點利用電池供電,且分布區(qū)域復(fù)雜、廣闊,很難通過更換電池方式來補(bǔ)充能量,因此,要求傳感器網(wǎng)絡(luò)節(jié)點的功耗要低,傳感器的體積要小。3) 低成本應(yīng)用無線傳感器網(wǎng)絡(luò),監(jiān)測區(qū)域廣、傳感器的節(jié)點多,且有些區(qū)域環(huán)境的地形復(fù)雜,甚至連工作人員都無法進(jìn)入,一旦安裝傳感器器則很難更換,因而要求傳感器的成本低廉。4) 短距離為了方便組網(wǎng)和傳遞數(shù)據(jù),兩個傳感器節(jié)點之間的距離通常要求在幾十米到幾百米之間。5) 高可靠性無線傳感器網(wǎng)絡(luò)的信息獲取是靠分布在監(jiān)測區(qū)域內(nèi)的各個傳感器檢測到的,如傳感器本身不可靠,則其信息的傳輸和處理是沒有任何意義的。6) 大容量要求網(wǎng)絡(luò)能容納上千、上萬個節(jié)點。7) 動態(tài)性對于復(fù)雜環(huán)境的組網(wǎng),其覆蓋區(qū)域往往會遇到各種電、磁環(huán)境的干擾,加之供電能量的不斷損耗,易引起傳感器節(jié)點故障,因此要求傳感器網(wǎng)絡(luò)具有自組網(wǎng)、智能化和協(xié)同感知等功能。1.3.2 ZigBee技術(shù)ZigBee技術(shù)是一種結(jié)構(gòu)簡單、低功耗、低數(shù)據(jù)率、低成本和高可靠性的雙向微功率網(wǎng)格式無線接入技術(shù),介于RFID和藍(lán)牙之間的技術(shù)提案,此前被稱作“Hom2eRFLite”或“FireFly”無線技術(shù),主要用于近距離無線連接5。最重要的是ZigBee技術(shù)支持地理定位功能,它工作于無需注冊的2.4 GHz ISM頻段,傳輸速率為250 kb/s,傳輸距離可以從標(biāo)準(zhǔn)的75米,到擴(kuò)展后的幾百米,甚至幾千米,利用ZigBee技術(shù)可由多到65535個無線微功率收發(fā)機(jī)組成一個龐大而有效的無線網(wǎng)絡(luò)平臺6。其主要特點有:1) 低功耗 由于ZigBee的傳輸速率低,發(fā)射功率僅為1mW,而且采用了休眠模式,功耗低,因此ZigBee設(shè)備非常省電。據(jù)估算,ZigBee設(shè)備僅靠兩節(jié)5號電池就可以維持長達(dá)6個月到2年左右的使用時間,這是其它無線設(shè)備望塵莫及的。2) 成本低 ZigBee模塊的初始成本在6美元左右,估計很快就能降到1.5-2.5美元,并且ZigBee協(xié)議是免專利費(fèi)的。低成本對于ZigBee也是一個關(guān)鍵的因素。3) 時延短 通信時延和從休眠狀態(tài)激活的時延都非常短,典型的搜索設(shè)備時延30ms,休眠激活的時延是15ms,活動設(shè)備信道接入的時延為15ms。因此ZigBee技術(shù)適用于對時延要求苛刻的無線控制(如工業(yè)控制場合等)應(yīng)用。4) 網(wǎng)絡(luò)容量大 一個星型結(jié)構(gòu)的Zigbee網(wǎng)絡(luò)最多可以容納254個從設(shè)備和一個主設(shè)備,一個區(qū)域內(nèi)可以同時存在最多100個ZigBee網(wǎng)絡(luò),而且網(wǎng)絡(luò)組成靈活。5) 可靠 采取了碰撞避免策略,同時為需要固定帶寬的通信業(yè)務(wù)預(yù)留了專用時隙,避開了發(fā)送數(shù)據(jù)的競爭和沖突。MAC層采用了完全確認(rèn)的數(shù)據(jù)傳輸模式,每個發(fā)送的數(shù)據(jù)包都必須等待接收方的確認(rèn)信息。如果傳輸過程中出現(xiàn)問題可以進(jìn)行重發(fā)7。6) 安全 ZigBee提供了基于循環(huán)冗余校驗(CRC)的數(shù)據(jù)包完整性檢查功能,支持鑒權(quán)和認(rèn)證, 采用了AES-128的加密算法,各個應(yīng)用可以靈活確定其安全屬性。ZigBee 網(wǎng)絡(luò)中存在三種邏輯設(shè)備類型:協(xié)調(diào)器、路由器和終端設(shè)備。1) 協(xié)調(diào)器 協(xié)調(diào)器包含所有的網(wǎng)絡(luò)消息,是3種設(shè)備類型中最復(fù)雜的一種,也是該網(wǎng)絡(luò)的第一個設(shè)備。協(xié)調(diào)器具有存儲容量大、計算能力強(qiáng)的特點,其主要任務(wù)包括發(fā)送網(wǎng)絡(luò)信標(biāo)、建立一個網(wǎng)絡(luò)、管理網(wǎng)絡(luò)節(jié)點、存儲網(wǎng)絡(luò)節(jié)點信息、尋找一對節(jié)點間的路由消息和不斷地接收信息8。2) 路由器 路由器的功能主要有允許其他設(shè)備加入網(wǎng)絡(luò)、多跳路由和協(xié)助終端設(shè)備的通訊。3) 終端設(shè)備 終端設(shè)備沒有特定的維持網(wǎng)絡(luò)結(jié)構(gòu)的責(zé)任,它可以處于睡眠或者喚醒狀態(tài),因此它可以是一個電池供電設(shè)備。ZigBee 網(wǎng)絡(luò)有三種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu):星型、樹狀和網(wǎng)狀拓?fù)浣Y(jié)構(gòu)。在星型拓?fù)浣Y(jié)構(gòu)中,整個網(wǎng)絡(luò)由一個稱為ZigBee協(xié)調(diào)器的設(shè)備來控制,ZigBee協(xié)調(diào)器負(fù)責(zé)發(fā)起和維持網(wǎng)絡(luò)正常工作,保持同網(wǎng)絡(luò)終端設(shè)備通信;在網(wǎng)狀型和樹型拓?fù)浣Y(jié)構(gòu)中,ZigBee 協(xié)調(diào)器負(fù)責(zé)啟動網(wǎng)絡(luò)以及選擇關(guān)鍵的網(wǎng)絡(luò)參數(shù),同時,也可以使用ZigBee 路由器來擴(kuò)展網(wǎng)絡(luò)結(jié)構(gòu);在樹型網(wǎng)絡(luò)中,路由器采用分級路由策略來傳送數(shù)據(jù)和控制信息。樹型網(wǎng)絡(luò)可以采用基于信標(biāo)的方式進(jìn)行通信;網(wǎng)狀型網(wǎng)絡(luò)中,設(shè)備之間使用完全對等的通信方式,ZigBee路由器不發(fā)送通信信標(biāo)。1.3.3 Linux 交叉編譯通常,程序是在一臺計算機(jī)上編譯,然后再分布到將要使用的其他計算機(jī)上。當(dāng)主機(jī)系統(tǒng)(運(yùn)行編譯器的系統(tǒng))和目標(biāo)系統(tǒng)(產(chǎn)生的程序?qū)⒃谄渖线\(yùn)行的系統(tǒng))不兼容時,該過程就叫做交叉編譯。除了兼容性這個原因之外,以下兩種情況也需要進(jìn)行交叉編譯:(1) 目標(biāo)系統(tǒng)對其可用的編譯工具沒有本地設(shè)置;(2) 主機(jī)系統(tǒng)比目標(biāo)系統(tǒng)要快得多,或者具有更多的可用資源。系統(tǒng)中使用的是基于ARM架構(gòu)的Linux平臺交叉編譯工具arm-linux-gcc,其版本為arm-linux-gcc-4.3.3。需要說明的是不同Linux內(nèi)核要使用相應(yīng)的交叉編譯器編譯生成正確的內(nèi)核文件。1.3.4 socket 通信Windows Sockets是廣泛應(yīng)用的、開放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口。其中套接字(Socket)是通信的基石,是支持TCP/IP協(xié)議網(wǎng)絡(luò)通信的基本操作單元,可以將套接字看作是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點。套接字可以分為兩類:流套接字和數(shù)據(jù)報套接字14。1) 流套接字流套接字提供雙向的、有序的、無重復(fù)并且無記錄邊界的數(shù)據(jù)流服務(wù),它適用于處理大量數(shù)據(jù)。流套接字是面向連接的,通信雙方進(jìn)行數(shù)據(jù)交換前必須建立一條路徑。這樣既確定了它們之間存在的路由,又保證了雙方是活動的、可彼此響應(yīng)的,但在通信雙方之間建立一個通信信道需要很多開銷。除此之外,大部分面向連接的協(xié)議為保證發(fā)送無誤,可能會需要執(zhí)行額外的計算來驗證正確性,因此還會進(jìn)一步增加開銷。2) 數(shù)據(jù)報套接字?jǐn)?shù)據(jù)報套接字支持雙向的數(shù)據(jù)流,但并不保證數(shù)據(jù)傳輸?shù)目煽啃?、有序性和無重復(fù)性。數(shù)據(jù)報套接字是無連接的,通信雙方在進(jìn)行通信前不需要事先建立連接,也不需要維護(hù)通信鏈路,因此可以節(jié)省開銷,但不適合大量、有序數(shù)據(jù)的傳輸15??紤]到本系統(tǒng)中需要傳輸?shù)臄?shù)據(jù)只是一些環(huán)境信息,其特點是數(shù)據(jù)量小且變化連續(xù),不易突發(fā)。因此系統(tǒng)采用數(shù)據(jù)報套接字完成數(shù)據(jù)傳輸。2 系統(tǒng)總體分析與設(shè)計2.1 系統(tǒng)總體分析由于本系統(tǒng)要實現(xiàn)環(huán)境監(jiān)測的功能,而實驗室所使用的嵌入式實驗箱CVT6410已經(jīng)集成了監(jiān)測環(huán)境中各項指標(biāo)(芯片溫度、實驗板溫度、環(huán)境溫度、環(huán)境濕度等)模塊。因此,在本次課程設(shè)計中已經(jīng)有了能夠?qū)崟r接收環(huán)境信息的功能,還有許多其他的功能也要實現(xiàn),具體包括將接收到的信息轉(zhuǎn)換為可讀的數(shù)據(jù),并利用socket通信將數(shù)據(jù)傳到PC端(即服務(wù)器端)。此外,在PC機(jī)端接收到數(shù)據(jù)后,要能夠?qū)?shù)據(jù)顯示出來,并將這些數(shù)據(jù)傳入構(gòu)建的數(shù)據(jù)庫中,以便于備份與查詢。2.2 系統(tǒng)總體設(shè)計(1)獲取環(huán)境信息通過集成在嵌入式實驗箱CVT6410中的溫度傳感器、濕度傳感器、光照傳感器以及煙霧傳感器等傳感器獲取所處環(huán)境的相關(guān)信息。(2)實時接收環(huán)境信息利用Socket網(wǎng)絡(luò)編程,實時從串口監(jiān)聽并接收遠(yuǎn)端控制器發(fā)來的環(huán)境數(shù)據(jù)。在通信過程中,PC機(jī)作為服務(wù)器端,實驗箱作為客戶機(jī)端進(jìn)行通信。(3)將接收到的數(shù)據(jù)存儲到數(shù)據(jù)庫中新建一個數(shù)據(jù)庫用于存儲接收到的數(shù)據(jù),數(shù)據(jù)庫中可以只有一個表,每一個屬性代表一個檢測的指標(biāo)(溫度、濕度、光照等)。(4)將環(huán)境數(shù)據(jù)顯示出來用C#做一個界面,既可以直接顯示從客戶機(jī)端接收到的數(shù)據(jù),也可以像在數(shù)據(jù)庫中一樣以表格的形式顯示出環(huán)境參數(shù)。2.3 系統(tǒng)流程圖開始服務(wù)器與客戶機(jī)是否處于同一網(wǎng)段?是否可以相互通信?客戶機(jī)向服務(wù)器發(fā)送環(huán)境數(shù)據(jù)服務(wù)器端接收到數(shù)據(jù)?數(shù)據(jù)庫連接成功?環(huán)境數(shù)據(jù)存入數(shù)據(jù)庫將數(shù)據(jù)顯示在界面中結(jié)束3 開發(fā)實現(xiàn)過程3.1 安裝VMware虛擬機(jī)在Windows下安裝虛擬機(jī)VMware。VMware (Virtual Machine ware)是一個“虛擬PC”軟件公司。它的產(chǎn)品可以使你在一臺機(jī)器上同時運(yùn)行二個或更多Windows、DOS、LINUX系統(tǒng)。與“多啟動”系統(tǒng)相比,VMware采用了完全不同的概念。多啟動系統(tǒng)在一個時刻只能運(yùn)行一個系統(tǒng),在系統(tǒng)切換時需要重新啟動機(jī)器。VMware是真正“同時”運(yùn)行,多個操作系統(tǒng)在主系統(tǒng)的平臺上,就象標(biāo)準(zhǔn)Windows應(yīng)用程序那樣切換。而且每個操作系統(tǒng)你都可以進(jìn)行虛擬的分區(qū)、配置而不影響真實硬盤的數(shù)據(jù),你甚至可以通過網(wǎng)卡將幾臺虛擬機(jī)用網(wǎng)卡連接為一個局域網(wǎng),極其方便。虛擬機(jī)裝好以后出現(xiàn)如下界面:3.2 安裝Fedora操作系統(tǒng)Fedora 是一個知名的Linux發(fā)行版,是一款由全球社區(qū)愛好者構(gòu)建的面向日常應(yīng)用的快速、穩(wěn)定、強(qiáng)大的操作系統(tǒng)。它允許任何人自由地使用、修改和重發(fā)布,無論現(xiàn)在還是將來。它由一個強(qiáng)大的社群開發(fā),這個社群的成員以自己的不懈努力,提供并維護(hù)自由、開放源碼的軟件和開放的標(biāo)準(zhǔn)。Fedora 項目由 Fedora 基金會管理和控制,得到了 Red Hat, Inc. 的支持。Fedora 是一個獨(dú)立的操作系統(tǒng),可運(yùn)行的體系結(jié)構(gòu)包括 x86(即i386-i686), x86_64 和 PowerPC。Fedora安裝過程:Fedora開機(jī)過程:Fedora 開機(jī)的登錄界面:3.3 配置編譯環(huán)境1.以root身份登錄ubuntu2.然后將光盤中的4.3.3.tar.gz拷到桌面上3.解壓并安裝,具體請執(zhí)行如下命令:# tar zxvf 4.3.3.tar.gz -C /4.設(shè)置環(huán)境變量,執(zhí)行如下命令:# gedit /etc/profile在最后面添加一行export PATH=$PATH:/home/zzx/Desktop/6410/4.3.3/bin如圖所示:重新啟動Fedora5.測試是否配置成功,打開終端,輸入以下命令:# arm-linux-gcc v倒數(shù)第二行顯示了版本信息,至此,編譯器已安裝好。3.4 Linux交叉編譯環(huán)境的配置1.安裝交叉編譯器2.配置Fedora10的IP地址為2進(jìn)入root用戶:supassword/sbin/ifconfig eth0 2 netmask gedit /etc/exports寫入:/tftpboot 2/(rw)保存并退出/sbin/service portmap restart/sbin/service nfs restart/sbin/service iptables stop3.創(chuàng)建tftpboot文件夾cd /mkdir tftpbootchmod 777 /tftpboot4.將6410實驗箱和PC機(jī)用網(wǎng)線相連,啟動實驗箱ping 3.5 超級終端1. Windows 7系統(tǒng)安裝HyperTerminal,即將HyperTerminal文件夾下的HyperTerminal_English_ANSI 里的hticons.dll和hypertrm.dll拷貝至C:/Windows/System32下;2. 使用usb轉(zhuǎn)串口線(或普通RS232線)將6410實驗箱和PC機(jī)相連。打開HyperTerminal軟件,選擇正確的串口。設(shè)置完成后點擊確認(rèn),正確連接至6410實驗箱后,多次回車,出現(xiàn)如下結(jié)果:3. 掛載tftpboot文件夾中文件至嵌入式Linux的mnt文件夾中。輸入如下命令:mount 2:/tftpboot /mnt/ -o nolock掛在成功后,輸入cd /mnt查看掛載結(jié)果。3.6 socket 通信Linux系統(tǒng)是通過提供套接字(socket)來進(jìn)行網(wǎng)絡(luò)編程的。網(wǎng)絡(luò)程序通過socket和其它幾個函數(shù)的調(diào)用,會返回一個通訊的文件描述符,我們可以將這個描述符看成普通的文件的描述符來操作,這就是linux的設(shè)備無關(guān)性的好處。我們可以通過向描述符讀寫操作實現(xiàn)網(wǎng)絡(luò)之間的數(shù)據(jù)交流。1) socketint socket(int domain, int type,int protocol)domain:說明網(wǎng)絡(luò)程序所在的主機(jī)采用的通訊協(xié)族(AF_UNIX和AF_INET等)。AF_UNIX只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信,而AF_INET是針對Internet的,因而可以允許在遠(yuǎn)程主機(jī)之間通信。type:網(wǎng)絡(luò)程序所采用的通訊協(xié)議(SOCK_STREAM,SOCK_DGRAM等)。SOCK_STREAM表明使用的是TCP協(xié)議,這樣會提供按順序的、可靠、雙向、面向連接的比特流。SOCK_DGRAM表明使用的是UDP協(xié)議,這樣只會提供定長的、不可靠、無連接的通信。protocol:由于指定了type,所以這個地方一般只要用0來代替就可以了。socket為網(wǎng)絡(luò)通訊做基本的準(zhǔn)備。成功時返回文件描述符,失敗時返回-1,看errno可知道出錯的詳細(xì)情況。2) bindint bind(int sockfd, struct sockaddr *my_addr, int addrlen)sockfd:是由socket調(diào)用返回的文件描述符。addrlen:是sockaddr結(jié)構(gòu)的長度。my_addr:是一個指向sockaddr的指針。sockaddr的定義如下:struct sockaddr unisgned short as_family; char sa_data14; ; 不過由于系統(tǒng)的兼容性,我們一般不用這個頭文件,而使用另外一個結(jié)構(gòu)(struct sockaddr_in) 來代替。sockaddr_in的定義如下: struct sockaddr_in unsigned short sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; sin_family一般為AF_INET,sin_addr設(shè)置為INADDR_ANY表示可以和任何的主機(jī)通信,sin_port是我們要監(jiān)聽的端口號。sin_zero8是用來填充的。Bind函數(shù)將本地的端口同socket返回的文件描述符捆綁在一起。成功則返回0,失敗的情況和socket一樣。3) listenint listen(int sockfd,int backlog) sockfd:是bind后的文件描述符。backlog:設(shè)置請求排隊的最大長度。當(dāng)有多個客戶端程序和服務(wù)端相連時,使用這個表示可以介紹的排隊長度。listen函數(shù)將bind的文件描述符變?yōu)楸O(jiān)聽套接字。返回的情況和bind一樣。4) acceptint accept(int sockfd, struct sockaddr *addr,int *addrlen)sockfd:是listen后的文件描述符. addr,addrlen是用來給客戶端的程序填寫的,服務(wù)器端只要傳遞指針就可以了。bind,listen和accept是服務(wù)器端用的函數(shù),accept調(diào)用時,服務(wù)器端的程序會一直阻塞到有一個客戶程序發(fā)出了連接。accept成功時返回最后的服務(wù)器端的文件描述符,這個時候服務(wù)器端可以向該描述符寫信息了。失敗時返回-1。5) connectint connect(int sockfd, struct sockaddr * serv_addr,int addrlen) sockfd:socket返回的文件描述符。serv_addr:儲存了服務(wù)器端的連接信息。其中sin_add是服務(wù)端的地址。addrlen:serv_addr的長度。connect函數(shù)是客戶端用來同服務(wù)端連接的。成功時返回0,sockfd是同服務(wù)端通訊的文件描述符失敗時返回-1。到第三階段,可以存取資料了,要讀取資料,我們可以用 recv() 函式: 6) recv:接收數(shù)據(jù)int recv(int sockfd, void* buf, int maxbuf, int options)sockfd:socket返回的文件描述符。buf:是收到數(shù)據(jù)后存放的緩沖位置。maxbuf:是緩沖區(qū)buf的大小。 recv()會回傳收到信息的大小值,如有錯誤,會回傳負(fù)數(shù)值。7) send:發(fā)送數(shù)據(jù)int send(int sockfd, void *buffer, int msg_len, int options)其中sockfd、buffer和msg_len和recv()的相同,只不過是這次把要傳輸?shù)男畔⑾确舃uf。而options有MSG_OOB,MSG_DONTROUTE,MSG_DONTWAIT,MSG_NOSIGNAL,send()會回傳傳輸?shù)目偞笮≈怠?查看 socket 文件夾里的文件:對文件夾里的這些文件進(jìn)行編譯:查看Makefile 文件:對于每個程序需要分別編譯arm平臺的執(zhí)行文件,同時,為了在PC端進(jìn)行測試,也編譯的PC版本的執(zhí)行文件,Makefile文件如下所示:CC = arm-linux-gccLD = arm-linux-ldEXEC = client.armOBJS = client.o EXEC1 = server.armOBJS1 = server.oEXEC2 = listener.armOBJS2 = listener.oEXEC3 = talker.armOBJS3 = talker.oCFLAGS +=LDFLAGS += all: $(EXEC) $(EXEC1) $(EXEC2) $(EXEC3)$(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $ $(OBJS) $(LDLIBS$(LDLIBS_$)cp $(EXEC) /tftpboot/$(EXEC1): $(OBJS1)$(CC) $(LDFLAGS) -o $ $(OBJS1) $(LDLIBS$(LDLIBS_$)cp $(EXEC1) /tftpboot/$(EXEC2): $(OBJS2)$(CC) $(LDFLAGS) -o $ $(OBJS2) $(LDLIBS$(LDLIBS_$)cp $(EXEC2) /tftpboot/$(EXEC3): $(OBJS3)$(CC) $(LDFLAGS) -o $ $(OBJS3) $(LDLIBS$(LDLIBS_$)cp $(EXEC2) /tftpboot/gcc -o client client.cgcc -o server server.cgcc -o listener listener.cgcc -o talker talker.cclean:-rm -f $(EXEC) $(EXEC1) $(EXEC2) $(EXEC3) *.elf *.gdb *.o此時在超級終端中查看一下 /mnt文件夾:3.7 向服務(wù)器端發(fā)送數(shù)據(jù)#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FALSE0#define TRUE1/#define MYPORT 4950 / the port users will be connecting toint MYPORT;int nread=0;char Recbuff1024;int sRecDataLen = 0;char send_buf256;static int serial_fd;int speed_arr = B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300;int name_arr = 230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300;/-void set_speed(int fd,int speed)int i;int status;struct termios Opt;tcgetattr(fd, &Opt);/tcsetattr函數(shù)用于設(shè)置終端的相關(guān)參數(shù)。參數(shù)fd為打開的終端文件描述符,參數(shù)optional_actions用于控制修改起作用的時間,而結(jié)構(gòu)體termios_p中保存了要修改的參數(shù)。for( i = 0; i 0)set_speed(serial_fd,115200);elseprintf(Cant Open Serial Port!n);exit(0);if(set_Parity(serial_fd,8,1,N) = FALSE)printf(Set parity Errorn);exit(1);return 0;int main(int argc, char *argv) int sockfd; int numbytes; struct sockaddr_in their_addr; / connectors address information struct hostent *he; serial_init(); /* parameters check */ if (argc != 3) /判斷參數(shù)值的個數(shù) fprintf(stderr,usage: talker hostname portn); exit(1); /* argv1 = server ip address */ if (he=gethostbyname(argv1) = NULL) / get the host info perror(gethostbyname); exit(1); /* argv2 = server port */MYPORT=atoi(argv2); /* setup socket */ if (sockfd = socket(AF_INET, SOCK_DGRAM, 0) = -1) /socket初始化 perror(socket); exit(1); char buff1024; their_addr.sin_family = AF_INET; / 表示TCP/IP協(xié)議 their_addr.sin_port = htons(MYPORT); / short, network byte order their_addr.sin_addr = *(struct in_addr *)he-h_addr); memset(&(their_addr.sin_zero), 0, 8); / zero the rest of the struct while(1) while(1) nread = read(serial_fd,buff,1024);/讀串口文件中的數(shù)據(jù),放入buff中,并將長度返回給nreadif(nread 0)printf(n%dn,nread);buffnread = 0;/*int i;for(i=0;inread;i+)RecbuffsRecDataLen + i = buffi;sRecDataLen = sRecDataLen + nread;scan(sockfd,their_addr);*/printf(n2530s Temperature=%d Boards Temperature=%d Temperature=%d Humidity=%dn,buff0,buff1,buff2,buff3); if (numbytes=sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr) = -1) /sendto 函數(shù)獲得套接字文件中的信息長度并把值賦給numbytes perror(sendto); exit(1); close(sockfd); return 0;在超級終端運(yùn)行./sendData.arm 3 4950出現(xiàn)的結(jié)果如下所示:3.8 新建數(shù)據(jù)庫打開SQL Server Management Studio,登錄修改登錄方式,斷開連接用sa登錄:記住服務(wù)器名稱,登錄名及密碼。 新建了一個名為Environment Monitoring 的數(shù)據(jù)庫和一個名為EM的表。 表中有四個屬性:temperature1,temperature2,temperature3,humidity.分別代表將要接收的四個數(shù)據(jù):2530s Temperature(芯片溫度), Boards Temperature(板子溫度), Temperature(環(huán)境溫度)和Humidity(環(huán)境濕度)。3.9設(shè)計界面用C#寫了一個可以顯示數(shù)據(jù)的界面如下所示4 調(diào)試過程在實驗的過程中,出現(xiàn)了許多意料之外的錯誤,列舉一下幾條加以說明。(1) 以下是在配置交叉編譯器的時候出現(xiàn)的問題,當(dāng)重啟了portmap和nfs,并且關(guān)閉了防火墻以后,依然沒有ping通,如下:第一次沒有ping 通,隨后進(jìn)行了如下設(shè)置:依然沒有ping 通,結(jié)果如下:然后斷開了無線網(wǎng),可以ping通:(2) 在啟動超級終端的時候,有時候會出現(xiàn)如下提示:這時一般是串口線出了問題,可以換一根線或通過重啟實驗箱的方式來解決;有時啟動超級終端的時候,回車會出現(xiàn)亂碼,而不是rootCvtech /#,一般也是由于串口轉(zhuǎn)USB線出了問題,可以通過換一根線來解決。(3) 在進(jìn)行掛在的時候,輸入mount 2:/tftpboot /mnt/ -o nolock 后會出現(xiàn)如下所示的結(jié)果:這表明之前已經(jīng)掛載過一次,現(xiàn)在是掛載成功的狀態(tài)。5 總結(jié)本次課程設(shè)計,歷時三周,

溫馨提示

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

最新文檔

評論

0/150

提交評論