




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章物聯(lián)網(wǎng)中間件物聯(lián)網(wǎng)中間件基本概念5.1物聯(lián)網(wǎng)中間件關(guān)鍵技術(shù)5.2物聯(lián)網(wǎng)中間件編程實(shí)例5.35.1物聯(lián)網(wǎng)中間件基本概念
5.1.1物聯(lián)網(wǎng)中間件的定義和分類(lèi)5.1.2物聯(lián)網(wǎng)中間件的基本組成和特點(diǎn)
5.1.3物聯(lián)網(wǎng)中間件舉例5.1.1物聯(lián)網(wǎng)中間件的定義和分類(lèi)
1.中間件定義:獨(dú)立的系統(tǒng)軟件或服務(wù)程序。應(yīng)用于客戶(hù)機(jī)、服務(wù)器的操作系統(tǒng),管理計(jì)算機(jī)資源和網(wǎng)絡(luò)通信。連接兩個(gè)獨(dú)立應(yīng)用程序或獨(dú)立系統(tǒng)的軟件,使相連接的系統(tǒng)即使具有不同的接口,利用中間件仍然能相互交換信息。執(zhí)行的關(guān)鍵途徑是信息傳遞。2.中間件示意圖3.中間件發(fā)展史最早具有中間件技術(shù)思想及功能的軟件是IBM的CICS,而CICS不是分布式環(huán)境的產(chǎn)物,因此人們一般把Tuxedo作為第一個(gè)嚴(yán)格意義上的中間件產(chǎn)品。
3.中間件發(fā)展史 Tuxedo是1984年在當(dāng)時(shí)屬于AT&T的貝爾實(shí)驗(yàn)室開(kāi)發(fā)完成的,由于分布式處理當(dāng)時(shí)并沒(méi)有在商業(yè)應(yīng)用上獲得像今天一樣的成功,Tuxedo在很長(zhǎng)一段時(shí)期里只是實(shí)驗(yàn)室產(chǎn)品,后來(lái)被Novell收購(gòu),在經(jīng)過(guò)Novell并不成功的商業(yè)推廣之后,1995年被現(xiàn)在的BEA公司收購(gòu)。3.中間件發(fā)展史 BEA公司1995年收購(gòu)Tuxedo才成為一個(gè)真正的中間件廠商。IBM的中間件MQSeries也是20世紀(jì)90年代的產(chǎn)品,其他許多中間件產(chǎn)品也都是最近幾年才成熟起來(lái)。TUXEDO名字的由來(lái):TransactionforUNIXhasbeenExtendedforDistributedOperation,即被分布式操作擴(kuò)展之后的UNIX事務(wù)系統(tǒng)。Tuxedo是一個(gè)客戶(hù)機(jī)/服務(wù)器的“中間件”產(chǎn)品,它在客戶(hù)機(jī)和服務(wù)器之間進(jìn)行調(diào)節(jié),以保證正確地處理事務(wù)。Tuxedo是一個(gè)事務(wù)處理(TP)監(jiān)督器,它管理聯(lián)機(jī)事務(wù)處理(OLTP)系統(tǒng)操作的事務(wù)。4.中間件主要特點(diǎn)滿(mǎn)足大量應(yīng)用的需要運(yùn)行于多種硬件和OS平臺(tái)支持分布計(jì)算,提供跨網(wǎng)絡(luò)、硬件和OS平臺(tái)的透明的應(yīng)用或服務(wù)的交互支持標(biāo)準(zhǔn)的協(xié)議支持標(biāo)準(zhǔn)的接口5.什么是物聯(lián)網(wǎng)中間件 在物聯(lián)網(wǎng)中采用中間件技術(shù),以實(shí)現(xiàn)多個(gè)系統(tǒng)和多種技術(shù)之間的資源共享,最終組成一個(gè)資源豐富、功能強(qiáng)大的服務(wù)系統(tǒng)。6.物聯(lián)網(wǎng)中間件的分類(lèi) 基于目的和實(shí)現(xiàn)機(jī)制的不同,業(yè)內(nèi)將中間件分為以下幾類(lèi):遠(yuǎn)程過(guò)程調(diào)用中間件(RemoteProcedureCall)面向消息的中間件(Message-OrientedMiddleware)對(duì)象請(qǐng)求代理中間件(ObjectRequestBrokers)
幾類(lèi)中間件可向上提供不同形式的通信服務(wù),在這些基本的通信平臺(tái)之上,可構(gòu)筑各種框架,為應(yīng)用程序提供不同領(lǐng)域內(nèi)的服務(wù),如事務(wù)處理監(jiān)控器、分布數(shù)據(jù)訪問(wèn)、對(duì)象事務(wù)管理器等。7.物聯(lián)網(wǎng)中間件發(fā)展的三個(gè)階段應(yīng)用程序中間件階段(ApplicationMiddleware)
架構(gòu)中間件階段(InfrastructureMiddleware)
解決方案中間件階段(SolutionMiddleware)。
目前,物聯(lián)網(wǎng)中間件最主要的代表是RFID中間件,其他的還有嵌入式中間件、數(shù)字電視中間件、通用中間件、M2M物聯(lián)網(wǎng)中間件等。下面,重點(diǎn)介紹一下RFID中間件。
RFID中間件扮演RFID標(biāo)簽和應(yīng)用程序之間的中介角色,從應(yīng)用程序端使用中間件所提供一組通用的應(yīng)用程序接口(API),即能連到RFID讀寫(xiě)器,讀取RFID標(biāo)簽數(shù)據(jù)。 這樣一來(lái),即使存儲(chǔ)RFID標(biāo)簽數(shù)據(jù)的數(shù)據(jù)庫(kù)軟件或后端應(yīng)用程序增加或改由其他軟件取代,或者讀寫(xiě)RFID讀寫(xiě)器種類(lèi)增加等情況發(fā)生時(shí),應(yīng)用端不需修改也能處理,省去多對(duì)多連接的維護(hù)復(fù)雜性問(wèn)題。8.RFID中間件的三大類(lèi)發(fā)展階段(1)應(yīng)用程序中間件發(fā)展階段(2)基礎(chǔ)架構(gòu)中間件發(fā)展階段(3)解決方案中間件(SolutionMiddleware)發(fā)展階段。
5.1.2物聯(lián)網(wǎng)中間件的基本組成和特點(diǎn)
基本組成:實(shí)現(xiàn)全球物品的統(tǒng)一編碼,給物品打上電子標(biāo)簽。要實(shí)現(xiàn)每個(gè)小的應(yīng)用環(huán)境或系統(tǒng)的標(biāo)準(zhǔn)化以及它們之間的通信,必須設(shè)置一個(gè)通用的平臺(tái)和接口,也就是中間件。以RFID為例,下圖描述了中間件在系統(tǒng)中的位置和作用。物聯(lián)網(wǎng)特點(diǎn):(1)獨(dú)立于架構(gòu)。(2)數(shù)據(jù)流。(3)處理流。(4)標(biāo)準(zhǔn)化。(1)ASPIRE特征:輕量級(jí)、可重新編程、智能、適合當(dāng)前標(biāo)準(zhǔn)、可升級(jí)、安全性高、完整。ASPIRE的解決辦法是完全開(kāi)源和免版權(quán)費(fèi)用,這大大降低了總的開(kāi)發(fā)成本。5.1.3物聯(lián)網(wǎng)中間件舉例
(2)Hydra定位于操作系統(tǒng)和應(yīng)用之間的中間件層。中間件包含了眾多軟件組成部分,它們被設(shè)計(jì)用于處理各種任務(wù),以完成一個(gè)有效利用成本的智能物聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)過(guò)程??梢栽谛碌暮鸵呀?jīng)存在的分布式設(shè)備網(wǎng)絡(luò)上協(xié)作。5.1.3物聯(lián)網(wǎng)中間件舉例
(2)Hydra它是基于語(yǔ)義模式驅(qū)動(dòng)的架構(gòu)。Hydra中間件利于實(shí)現(xiàn)環(huán)境感知行為和解決在資源受限設(shè)備中處理數(shù)據(jù)的持久性問(wèn)題。Hydra安全框架部署了一個(gè)規(guī)則框架。虛擬化結(jié)構(gòu)。5.1.3物聯(lián)網(wǎng)中間件舉例
5.2物聯(lián)網(wǎng)中間件關(guān)鍵技術(shù)
5.2.1web服務(wù)5.2.2嵌入式中間件技術(shù)
5.2.3萬(wàn)維物聯(lián)網(wǎng)5.2.4上下文感知技術(shù)Web服務(wù)(WebServices)就是一種可以通過(guò)Web描述、發(fā)布、定位和調(diào)用的模塊化應(yīng)用。Web服務(wù)可以執(zhí)行多種功能,從簡(jiǎn)單的請(qǐng)求到復(fù)雜的業(yè)務(wù)過(guò)程。一旦Web服務(wù)被部署,其他的應(yīng)用程序或是Web服務(wù)就能夠發(fā)現(xiàn)并且調(diào)用這個(gè)部署的服務(wù)。5.2.1web服務(wù)
Web服務(wù)(WebServices)向外界提供一個(gè)能夠通過(guò)Web進(jìn)行調(diào)用的API(ApplicationProgrammingInterface,應(yīng)用程序編程接口),能夠用編程的方法通過(guò)Web來(lái)調(diào)用這個(gè)應(yīng)用程序。我們把調(diào)用這個(gè)WebServices的應(yīng)用程序叫做客戶(hù)。WebServices舉例:
創(chuàng)建一個(gè)WebServices,功能是返回當(dāng)前的天氣情況。WebServices定義:
建立可互操作的分布式應(yīng)用程序的平臺(tái)。WebServices平臺(tái)是一套標(biāo)準(zhǔn),它定義了應(yīng)用程序如何在Web上實(shí)現(xiàn)互操作性。WebServices為實(shí)現(xiàn)物聯(lián)網(wǎng)的應(yīng)用與服務(wù)提供了一個(gè)基本的框架。 WebServices通過(guò)簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SimpleObjectAccessProtocol,SOAP)來(lái)調(diào)用。
SOAP是一種輕量級(jí)的消息協(xié)議,它允許用任何語(yǔ)言編寫(xiě)的任何類(lèi)型的對(duì)象在任何平臺(tái)之上相互通信。
SOA(Service-OrientedArchitecture,面向服務(wù)的體系結(jié)構(gòu))是一個(gè)組件模型,它將應(yīng)用程序的不同功能單元通過(guò)這些服務(wù)之間定義的接口和協(xié)議聯(lián)系起來(lái)。 接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實(shí)現(xiàn)服務(wù)的硬件平臺(tái)、操作系統(tǒng)和編程語(yǔ)言。這使得構(gòu)建在各種這樣的系統(tǒng)中的服務(wù)可以用一種統(tǒng)一和通用的方式進(jìn)行交互。這種具有中立的接口定義的特征稱(chēng)為服務(wù)之間的松耦合。松耦合系統(tǒng)的優(yōu)勢(shì)主要有兩點(diǎn):一點(diǎn)是它具有很高的靈活性另一點(diǎn)是當(dāng)組成整個(gè)應(yīng)用程序的每個(gè)服務(wù)的內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)逐漸地發(fā)生改變時(shí),它能夠繼續(xù)存在 嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)。5.2.2嵌入式中間技術(shù)服務(wù)
嵌入式中間件是在嵌入式應(yīng)用程序和操作系統(tǒng)、硬件平臺(tái)之間嵌入的一個(gè)中間層,通常定義成一組較為完整的、標(biāo)準(zhǔn)的應(yīng)用程序接口。。1.嵌入式Web嵌入式Web服務(wù)主要具有以下優(yōu)點(diǎn)。(1)統(tǒng)一的客戶(hù)界面(2)平臺(tái)獨(dú)立性(3)高可擴(kuò)展性(4)并行性與分布性1.嵌入式WebWeb服務(wù)器
對(duì)Web服務(wù)器而言,在物理設(shè)備上是指存放那些供客戶(hù)訪問(wèn)的信息資源的計(jì)算機(jī)或嵌入式系統(tǒng);在軟件上是指能夠按照客戶(hù)的請(qǐng)求將信息資源傳送給客戶(hù)的應(yīng)用程序。1.嵌入式WebWeb客戶(hù)端 對(duì)Web客戶(hù)端而言,在物理設(shè)備上是指客戶(hù)所使用的本地計(jì)算機(jī)或者嵌入式設(shè)備;在軟件上是指能夠接受Web服務(wù)器上的信息資源并展現(xiàn)給客戶(hù)的應(yīng)用程序。 嵌入式Web服務(wù)器技術(shù)的核心是HTTP協(xié)議引擎。嵌入式Web服務(wù)器通過(guò)CGI接口和數(shù)據(jù)動(dòng)態(tài)顯示技術(shù),可以在HTML文件或表格中插入運(yùn)行代碼,供RAM讀取/寫(xiě)入數(shù)據(jù)。典型的嵌入式Web服務(wù)器系統(tǒng)模型 CGI是通用網(wǎng)關(guān)接口(CommonGatewayInterface)的縮寫(xiě)。它是Web服務(wù)器主機(jī)與外部擴(kuò)展應(yīng)用程序交互的一種標(biāo)準(zhǔn)接口。
它提供了將參數(shù)傳遞給程序并將結(jié)果返回給瀏覽器的一種機(jī)制。CGI工作流程示意圖 CGI程序可以通過(guò)以下兩種調(diào)用方式來(lái)獲取客戶(hù)請(qǐng)求的內(nèi)容: 一是通過(guò)URL直接調(diào)用 二通過(guò)交互式表單(Form)來(lái)調(diào)用。1.JAVAVM 除了利用Web實(shí)現(xiàn)中間件外,JavaVM(Java虛擬機(jī))以其良好的跨平臺(tái)特性成為了物聯(lián)網(wǎng)中間件的重要平臺(tái)。Java編譯執(zhí)行流程圖 每個(gè)Java
VM都有兩種機(jī)制,一個(gè)是裝載具有合適名稱(chēng)的類(lèi)(類(lèi)或是接口),叫做類(lèi)裝載子系統(tǒng);另一個(gè)是負(fù)責(zé)執(zhí)行包含在已裝載的類(lèi)或接口中的指令,叫做運(yùn)行引擎。 每個(gè)Java
VM又包括方法區(qū)、Java堆、Java棧、程序計(jì)數(shù)器和本地方法棧這5個(gè)部分,這幾個(gè)部分和類(lèi)裝載機(jī)制與運(yùn)行引擎機(jī)制一起組成JavaVM的體系結(jié)構(gòu)。JavaVM體系結(jié)構(gòu)圖 近幾年來(lái)隨著物聯(lián)網(wǎng)的興起,越來(lái)越多的研究正在考慮將Web技術(shù)與物聯(lián)網(wǎng)技術(shù)相結(jié)合。 基于這樣的思想就產(chǎn)生了萬(wàn)維物聯(lián)網(wǎng)(WebofThings)的概念。5.2.3萬(wàn)維物聯(lián)網(wǎng)
WebofThings具有以下特性:(1)使用HTTP作為應(yīng)用協(xié)議,HTTP不僅是用來(lái)連接傳感器和網(wǎng)絡(luò)的傳輸協(xié)議。(2)通過(guò)REST接口(或RESTAPI)將智能設(shè)備的同步功能開(kāi)放出來(lái)。(3)智能設(shè)備的異步功能開(kāi)放采用廣為接受的Web聚合標(biāo)準(zhǔn)。(4)前端利用Web的呈現(xiàn)方式,提供直觀、友好的用戶(hù)體驗(yàn)。(5)開(kāi)放平臺(tái)。 通過(guò)WebofThings,可以為物聯(lián)網(wǎng)應(yīng)用帶來(lái)了眾多便利,以下列舉其幾點(diǎn)優(yōu)勢(shì):減少智能設(shè)備安裝、整合、執(zhí)行和維護(hù)開(kāi)銷(xiāo);加快智能設(shè)備安裝和移除速度;對(duì)智能設(shè)備可進(jìn)行移動(dòng)和臨時(shí)安裝;任何時(shí)刻、任何地點(diǎn)都可以提供實(shí)時(shí)信息服務(wù);增強(qiáng)可視化、可預(yù)見(jiàn)、可預(yù)報(bào)和維護(hù)日程的能力;確保各類(lèi)應(yīng)用有效和高效率執(zhí)行。WebofThings的基本框架由以下3部分組成:(1)網(wǎng)絡(luò)節(jié)點(diǎn)集成接口(IntegrationInterfaceofNetworkNode)(2)基于REST風(fēng)格終端節(jié)點(diǎn)(TerminalNodesBasedonRESTStyle)對(duì)智能設(shè)備可進(jìn)行移動(dòng)和臨時(shí)安裝;(3)網(wǎng)絡(luò)Mashup功能(WebMashupFunction)增強(qiáng)可視化、可預(yù)見(jiàn)、可預(yù)報(bào)和維護(hù)日程的能力;基于REST風(fēng)格的WebofThings架構(gòu) 上下文感知技術(shù)是用來(lái)描述一種信息空間和物理空間相融合的重要支撐技術(shù),它能夠使用戶(hù)可用的計(jì)算環(huán)境和軟件資源動(dòng)態(tài)地適應(yīng)相關(guān)的歷史狀態(tài)信息,從而根據(jù)環(huán)境的變化自動(dòng)地采取符合用戶(hù)需要或者設(shè)定的行動(dòng)。5.2.4上下文感知技術(shù)
上下文感知系統(tǒng)首先必須知道整個(gè)物理環(huán)境、計(jì)算環(huán)境、用戶(hù)狀態(tài)等方面的靜態(tài)和動(dòng)態(tài)信息,即上下文(context)。 上下文能力的獲取依賴(lài)于上下文感知技術(shù),主要包括上下文的采集、建模、推理及融合等。上下文感知技術(shù)是實(shí)現(xiàn)服務(wù)自發(fā)性和無(wú)縫移動(dòng)性的關(guān)鍵。(1)上下文采集 上下文的應(yīng)用領(lǐng)域不同,上下文的采集方法也有所不同。通常情況下,有3種方法:傳感類(lèi)上下文、派生出的上下文(根據(jù)信息記錄和用戶(hù)設(shè)定)、明確提供的上下文。 采集技術(shù)屬于物聯(lián)網(wǎng)感知層的技術(shù)。(2)上下文建模 要正確地利用上下文信息,必須對(duì)獲得的上下文信息進(jìn)行建模。上下文信息模型反映了設(shè)計(jì)者對(duì)上下文的理解,決定了使用什么方法把物理世界里面的一些無(wú)意義和無(wú)規(guī)律的數(shù)據(jù)轉(zhuǎn)化成計(jì)算世界里的邏輯結(jié)構(gòu)語(yǔ)言,為實(shí)現(xiàn)上下文的正確運(yùn)行打下基礎(chǔ)。(3)上下文推理 系統(tǒng)中的所有上下文信息構(gòu)成上下文知識(shí)庫(kù),基于這些知識(shí)庫(kù),可以進(jìn)行上下文的推理。 實(shí)現(xiàn)推理一般有兩種方式,一是將邏輯規(guī)則用程序編碼實(shí)現(xiàn),二是采用基于規(guī)則的推理系統(tǒng)。(4)上下文融合 在上下文感知計(jì)算中,要獲得連續(xù)的上下文的解決方法,必須聯(lián)合相關(guān)的上下文服務(wù)從而聚集上下文信息,稱(chēng)為上下文融合。 這種上下文的融合類(lèi)似于目前已被廣泛應(yīng)用的傳感器融合,其關(guān)鍵在于處理不同上下文服務(wù)邊界之間的無(wú)縫融合。5.3物聯(lián)網(wǎng)中間件編程實(shí)例5.3.1利用RubyonRails開(kāi)發(fā)基于 REST風(fēng)格的中間件5.3.2用J2EE開(kāi)發(fā)WebService中間件5.3.1利用RubyonRails開(kāi)發(fā)基于REST風(fēng)格的中間件RubyonRails,簡(jiǎn)稱(chēng)RoR或Rails,是一個(gè)使用Ruby語(yǔ)言寫(xiě)的開(kāi)源網(wǎng)絡(luò)應(yīng)用框架,能使開(kāi)發(fā)變得更加容易,目前我們用其致力于Web應(yīng)用的開(kāi)發(fā)、部署和維護(hù)。
像其他Web框架一樣,Rails采用MVC的開(kāi)發(fā)框架。但相比于其他框架,Rails更加簡(jiǎn)單易用。這是因?yàn)椋?、Ruby語(yǔ)言的特性:自然、簡(jiǎn)介、快速,有豐富的類(lèi)庫(kù),并且全面地支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。2、Rails的基本設(shè)計(jì)原則:“不要重復(fù)你自己”(Don’tRepeatYourself,簡(jiǎn)稱(chēng)DRY)以及“慣例重于配置”。
Rails是一種敏捷的框架,它強(qiáng)調(diào)與客戶(hù)的交互,隨時(shí)準(zhǔn)備“響應(yīng)變化”。 Rails提倡測(cè)試驅(qū)動(dòng)開(kāi)發(fā),所有的Rails應(yīng)用內(nèi)嵌對(duì)于測(cè)試的支持。1.
RubyonRails開(kāi)發(fā)環(huán)境搭建RubyonRails可以運(yùn)行在各種操作系統(tǒng)下,其平臺(tái)是獨(dú)立的??偟膩?lái)說(shuō),要安裝運(yùn)行一個(gè)Rails應(yīng)用需要下列組件。
(1)Ruby解釋器:我們?cè)诖耸褂肦uby-1.8.6。這個(gè)版本的解析器可以很好的滿(mǎn)足Rails以及后續(xù)一些RubyGems的要求。
(2)RubyGems:它是一個(gè)標(biāo)準(zhǔn)的Ruby程序包管理器,可以很方便的在線安裝各種Ruby程序包,包括Rails等。
(3)RubyonRails框架:為簡(jiǎn)單起見(jiàn),我們采用gem自動(dòng)進(jìn)行安裝,在撰寫(xiě)本書(shū)時(shí)Rails的最新版本為2.3.8。(4)數(shù)據(jù)庫(kù):Rails的最新版本默認(rèn)是采用SQLite3的數(shù)據(jù)庫(kù),在此為了通用性考慮,我們采用最常用的MySQL數(shù)據(jù)庫(kù)。
(5)一些必要的庫(kù):采用MySQL數(shù)據(jù)庫(kù)只需要安裝mysqlgem包即可。如果使用Rails默認(rèn)的數(shù)據(jù)庫(kù)則需安裝sqlite3-rubygem包。
下面我們主要介紹在Windows下安裝部署Rails的具體過(guò)程。由于很多程序針對(duì)Windows平臺(tái)都有很方便的一鍵式安裝,所以在Windows下安裝Rails還是很輕松的。
(1)安裝Ruby解釋器。可以從Ruby官網(wǎng)(/en/downloads/)上下載Ruby-1.8.6One-Click的安裝包。
為了檢驗(yàn)是否安裝成功,可以從Windows的開(kāi)始菜單點(diǎn)擊“運(yùn)行”,輸入“cmd”,啟動(dòng)Windows命令提示符,然后輸入“ruby–v”(回車(chē)),如能正確顯示Ruby程序的版本號(hào)則證明安裝成功。
(2)安裝RubyGems。可以從RubyForge(/)或是RubyGems的官網(wǎng)(/)上下載最新的安裝包。下載完成后將該壓縮包進(jìn)行解壓,我們假設(shè)解壓后根目錄為${dir}目錄;然后啟動(dòng)命令提示符,并切換到${dir}中,然后輸入rubysetup.rb運(yùn)行RubyGems的安裝程序。為了驗(yàn)證是否安裝成功,可以從Windows命令提示符中輸入“gem–v”(回車(chē));如能正確顯示RubyGems的版本號(hào)則安裝成功。(3)安裝RubyonRails。在命令提示符中輸入“geminstallrails”(回車(chē)),然后將會(huì)在線安裝Rails的程序以及Rails的一些依賴(lài)包。安裝完成后可以通過(guò)“rails–v”命令查看Rails的版本號(hào)來(lái)驗(yàn)證是否安裝成功。(4)MySQL數(shù)據(jù)庫(kù)。在MySQL官網(wǎng)上下載最新的MySQL-5.1版本的安裝程序,然后進(jìn)行安裝即可。具體安裝過(guò)程也可參考官方的安裝說(shuō)明(/doc/refman/5.1/
zh/installing.html)。(5)安裝mysqlgem包。在命令提示符中輸入“geminstallmysql”進(jìn)行在線安裝。
至此Rails的安裝過(guò)程就已經(jīng)全部完成。在Linux下的安裝也大同小異,主要是安裝Ruby和mysql時(shí)略有不同,其他安裝步驟都和Windows下安裝相同。2.RubyonRails編程實(shí)例下面的章節(jié)將簡(jiǎn)單介紹一個(gè)關(guān)于溫度的Rails物聯(lián)網(wǎng)中間件實(shí)例。Rails是一個(gè)網(wǎng)絡(luò)應(yīng)用框架,它可以很方便地處理各種應(yīng)用請(qǐng)求,客戶(hù)端和Rails服務(wù)器之間采用統(tǒng)一的REST接口,它們通過(guò)HTTP協(xié)議來(lái)向服務(wù)器端發(fā)送請(qǐng)求。
※本示例的系統(tǒng)整體架構(gòu)圖如圖5-8所示。在該示例中溫度傳感器也認(rèn)為是Rails服務(wù)器的一個(gè)客戶(hù)端,它會(huì)實(shí)時(shí)地向服務(wù)器端發(fā)送數(shù)據(jù),服務(wù)器會(huì)把這些數(shù)據(jù)處理后保存到數(shù)據(jù)庫(kù)中以供瀏覽器或其他客戶(hù)端調(diào)用。服務(wù)器的另一種客戶(hù)端是瀏覽器或是手機(jī)Widget應(yīng)用,這些客戶(hù)可以向服務(wù)器端發(fā)送請(qǐng)求來(lái)獲取自己所關(guān)心的數(shù)據(jù)。
※
本示例中采用REST的方式來(lái)進(jìn)行服務(wù)器端的設(shè)計(jì),我們將溫度(temperature)看做一種資源,每個(gè)資源有相應(yīng)的id、溫度值、更新時(shí)間、設(shè)備名稱(chēng)等信息。本示例中對(duì)于溫度資源的操作只包括Put和Get兩種操作,這兩種操作分別通過(guò)HTTP的Post和Get請(qǐng)求來(lái)完成。具體為溫度傳感器通過(guò)Post請(qǐng)求向服務(wù)器上傳溫度數(shù)據(jù),而瀏覽器通過(guò)Get請(qǐng)求來(lái)從服務(wù)器獲得溫度數(shù)據(jù)的記錄。
對(duì)于REST中的其他資源操作如Update、Destroy等操作在本示例中可以不需要,所以進(jìn)行了省略。RubyonRails是支持所有的REST操作的,可以通過(guò)scaffold來(lái)進(jìn)行實(shí)現(xiàn)。假定對(duì)于這種資源的Put操作對(duì)應(yīng)HTTP的Post請(qǐng)求,請(qǐng)求的URL為{root_
dir}/temperature/post_temperature;獲取資源的Get操作對(duì)應(yīng)HTTP的Get請(qǐng)求,請(qǐng)求的URL為{root_dir}/temperature/index。
※
在此示例中采用mysql數(shù)據(jù)庫(kù),其實(shí)由于Rails對(duì)于不同數(shù)據(jù)庫(kù)接口有很好的封裝和適配,采用不同的數(shù)據(jù)庫(kù)不會(huì)對(duì)代碼產(chǎn)生太大影響。針對(duì)該示例,數(shù)據(jù)庫(kù)中只建立一張表來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ)。表的結(jié)構(gòu)如表5-1所示,其中id字段用于標(biāo)識(shí)每條記錄,value字段記錄溫度值,time字段記錄上傳的時(shí)間,device_id字段記錄上傳數(shù)據(jù)的設(shè)備標(biāo)識(shí)。圖5-8溫度傳感中間件系統(tǒng)架構(gòu)示意圖表5-1溫度表結(jié)構(gòu)idvaluetimedevice_id(1)建立工程。
建立一個(gè)名稱(chēng)為smart_sensor的工程,首先在命令提示符中進(jìn)入待建工程的目錄,在此使用F:\example目錄,然后輸入rails--database=mysqlsmart_sensor,如圖5-9所示。圖5-9建立smart_sensor工程本示例的實(shí)現(xiàn)步驟包括以下幾步:
此時(shí)修改smart_sensor\config\database.yml文件,在這個(gè)文件中會(huì)有3個(gè)數(shù)據(jù)庫(kù)配置選項(xiàng),分別為development、test、production,在此只修改development選項(xiàng)即可,修改成如下格式。 development: adapter:mysql encoding:utf8 reconnect:false database:smart_sensor_development pool:5 username:root password:mysql host:localhost(2)建立數(shù)據(jù)庫(kù)。
需要修改的主要是username和password,修改成mysql數(shù)據(jù)庫(kù)的用戶(hù)名和密碼即可。然后在命令行根目錄smart_sensor下執(zhí)行rakedb:create來(lái)建立數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)名稱(chēng)默認(rèn)為smart_sensor_development,如圖5-10所示。下面的命令如沒(méi)有特別說(shuō)明均是在smart_sensor根目錄下執(zhí)行的。圖5-10建立數(shù)據(jù)庫(kù)
下面需要建立基本的數(shù)據(jù)表,在Rails中數(shù)據(jù)表是由一個(gè)Model來(lái)管理的,可以用Rails的命令來(lái)建立基本的Model。在根目錄下輸入rubyscript\generatemodeltemperature,如圖5-11所示。圖5-11建立基本的Model(3)建立基本的Model類(lèi)。此時(shí)在db\migrate目錄下會(huì)生成一個(gè)xxx_create_temperatures.rb的文件,打開(kāi)該文件并修改成如下結(jié)果。這里主要是設(shè)置數(shù)據(jù)表的各個(gè)字段的類(lèi)型以及其他細(xì)節(jié)。classCreateTemperatures<ActiveRecord::Migrationdefself.upcreate_table:temperaturesdo|t|
#establishthedatatablet.decimal:value,:precision=>4,:scale=>1t.datetime:timeeger:device_idt.timestampsendenddefself.downdrop_table:temperaturesendend
然后執(zhí)行rakedb:migrate命令將temperatures表的結(jié)構(gòu)寫(xiě)入數(shù)據(jù)庫(kù)。
控制器的功能主要是對(duì)外部的請(qǐng)求進(jìn)行處理并返回相應(yīng)的結(jié)果。此處可以通過(guò)Rails的基本命令來(lái)建立基本的控制器。在根目錄下輸入命令rubyscript\generatecontrollertemperatureindex,如圖5-12所示。圖5-12生成基本的控制器(4)建立temperature控制器。
classTemperatureController<ApplicationController#listallthetemperaturesinthedatabasedefindex@temperatures=Temperature.allrespond_todo|format|format.html#index.html.erbformat.xml{render:xml=>@temperatures}endend
然后修改app\controllers\temperature_controller.rb文件以真正實(shí)現(xiàn)該示例需要的方法。在此我們將實(shí)現(xiàn)index方法以輸出所有的temperature數(shù)據(jù),并且增加一個(gè)添加數(shù)據(jù)的方法以把傳感器發(fā)來(lái)的數(shù)據(jù)存入數(shù)據(jù)庫(kù),具體修改如下。
#processthepostrequestandstorethedatainthedatabasedefpost_temperaturebegin#constructaninstanceofTemperaturea_temperature=Temperature.new(:value=>params[:value],:time=>params[:time],:device_id=>params[:device_id])#storea_temperatureinthedatabasea_temperature.saverescue#returnFailiffailsstorethedatarender:text=>"Fail"returnend#returnOKifallsuccessrender:text=>"OK"returnendend這里增加了兩個(gè)方法,index和post_temperature。其中index方法用于輸出當(dāng)前存入數(shù)據(jù)庫(kù)的所有溫度的記錄,post_temperature方法是用來(lái)處理傳感器發(fā)來(lái)的提交數(shù)據(jù)的請(qǐng)求,并把這些溫度數(shù)據(jù)存入數(shù)據(jù)庫(kù),執(zhí)行成功則返回“OK”,否則返回“Fail”。
在此因?yàn)閕ndex方法會(huì)返回一個(gè)html文件,來(lái)控制返回結(jié)果的顯示。在Rails中會(huì)在views目錄下對(duì)返回的頁(yè)面文件進(jìn)行集中的管理。在此需要修改app\views\
temperature\index.html.erb文件,修改結(jié)果如下。(5)修改view頁(yè)面。<divid="temperature-list"><h1>Listingtemperatures</h1><table><%fortemperaturein@temperatures%><tr><td> <%=temperature.id%></td><td> <%=temperature.value%></td><td> <%=temperature.time%></td><td> <%=temperature.device_id%></td></tr><%end%></table></div>
為了讓Rails當(dāng)收到某個(gè)請(qǐng)求時(shí)知道該調(diào)用哪個(gè)控制器下的哪個(gè)方法來(lái)進(jìn)行處理,在此需要修改Rails的路由以符合該示例的要求。在Rails中修改路由也十分簡(jiǎn)單,只需要修改config\routes.rb文件即可。在該文件的最后已經(jīng)有兩條默認(rèn)的路由格式,需要修改這些路由規(guī)則以符合我們的需要,具體如下。
map.connect'temperature/post_temperature',:controller=>"temperature",
:action=>"post_temperature",:conditions=>{:method=>:post} map.connect':controller/:action' map.connect':controller/:action.:format’(6)修改路由。
①當(dāng)收到發(fā)往temperature/post_temperature這個(gè)路徑的Post請(qǐng)求時(shí)調(diào)用temperature控制器的post_temperature方法來(lái)進(jìn)行處理。
②當(dāng)收到:controller/:action格式的路由時(shí),則將第一個(gè)參數(shù)作為controller,第二個(gè)作為action。例如發(fā)送temperature/index,此時(shí)則會(huì)采用temperature控制器的index方法來(lái)進(jìn)行處理。這里解釋一下這3條路由分別的含義。
③前面與(2)相同,另外增加了:format參數(shù)用來(lái)控制返回的格式,例如發(fā)送temperature/index.html則采用temperature控制器的index方法,采用html格式的返回結(jié)果。如果發(fā)送temperature/index.xml則以xml格式返回結(jié)果。路由的匹配規(guī)則是從上向下依次進(jìn)行匹配,如果遇到匹配的規(guī)則,則采用該規(guī)則,并且停止向下匹配。
在此我們采用外部客戶(hù)主動(dòng)POST數(shù)據(jù)的方式來(lái)向Server發(fā)送請(qǐng)求。Rails中為了避免惡意的POST數(shù)據(jù),采用了認(rèn)證授權(quán)的機(jī)制來(lái)防止這種攻擊,類(lèi)似我們現(xiàn)在采用的POST的方式進(jìn)行上傳數(shù)據(jù),則會(huì)引發(fā)RailsActionController::Invalid
AuthenticityToken異常,并且不會(huì)對(duì)我們的POST操作進(jìn)行處理。我們?cè)诖诵枰迷撜J(rèn)證機(jī)制,方法也很簡(jiǎn)單,只要修改app\controllers\application_controller.rb文件即可,修改結(jié)果如下。(7)修改控制器的認(rèn)證過(guò)濾器。classApplicationController<ActionController::Basehelper:all#includeallhelpers,allthetimeprotect_from_forgery#SeeActionController::RequestForgeryProtectionfordetails
#allowuploadthedatadirectlyskip_before_filter:verify_authenticity_token
#Scrubsensitiveparametersfromyourlog#filter_parameter_logging:passwordend
接下來(lái)我們對(duì)本實(shí)例的功能進(jìn)行測(cè)試,包括兩部分:數(shù)據(jù)上傳和數(shù)據(jù)顯示。
①數(shù)據(jù)上傳。
我們采用Curl來(lái)發(fā)送HTTP的POST請(qǐng)求。Curl工具是Lin
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 南通智能裝備制造基地建設(shè)合作合同
- 報(bào)警器安裝施工合同
- 個(gè)人居間合同
- 借款合同抵押與擔(dān)保
- 民間借貸抵押合同年
- 冬季水果供應(yīng)鏈管理服務(wù)合同
- 森林資源培育與利用合作合同
- 沈陽(yáng)科技學(xué)院《推銷(xiāo)理論與實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州城市理工學(xué)院《科研實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 雙手向后拋實(shí)心球的練習(xí) 教學(xué)設(shè)計(jì)-2023-2024學(xué)年高一上學(xué)期體育與健康人教版必修第一冊(cè)
- 高中課程表模板1
- tlc-jc dy001通信用高頻開(kāi)關(guān)電源系統(tǒng)檢驗(yàn)報(bào)告模板va
- 閥門(mén)噪聲計(jì)算程序(IEC)(帶公式)
- 2022年RDA5807m+IIC收音機(jī)51單片機(jī)C程序上課講義
- 雅馬哈貼片機(jī)_修機(jī)_調(diào)機(jī)的經(jīng)驗(yàn)之談1
- 全自動(dòng)咖啡機(jī)基本結(jié)構(gòu)及原理教程課件
- 金屬風(fēng)管支架重量計(jì)算表
- 正負(fù)零以下基礎(chǔ)施工方案(44頁(yè))
- 簡(jiǎn)愛(ài)人物形象分析(課堂PPT)
- 義務(wù)教育《勞動(dòng)》課程標(biāo)準(zhǔn)(2022年版)
- 從業(yè)務(wù)骨干到管理者(課堂PPT)
評(píng)論
0/150
提交評(píng)論