日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JavaScript——下一代物聯(lián)網(wǎng)全棧開(kāi)發(fā)

 timtxu 2017-05-02

Jeff Atwood曾提出“任何能夠用JavaScript實(shí)現(xiàn)的應(yīng)用,最終都必將用JavaScript實(shí)現(xiàn)”他對(duì)JavaScript的推崇不言而喻。而當(dāng)下這個(gè)物聯(lián)網(wǎng)大熱的時(shí)代,JavaScript支持HTTP和JSON、支持函數(shù)式編程、可提供交互式環(huán)境等特點(diǎn)堪稱(chēng)適用于物聯(lián)網(wǎng)全棧開(kāi)發(fā)。本文詳解了JavaScript可參與的每一個(gè)物聯(lián)網(wǎng)過(guò)程,并針對(duì)開(kāi)源項(xiàng)目進(jìn)行了匯總。

物聯(lián)網(wǎng)節(jié)點(diǎn)JavaScript開(kāi)發(fā)

網(wǎng)絡(luò)中,HTTP協(xié)議與JSON數(shù)據(jù)格式特別是RESTful API無(wú)疑具有支配地位,各種云服務(wù),數(shù)據(jù)傳輸都基于這些協(xié)議來(lái)進(jìn)行。而JavaScript為HTTP和JSON提供了最好的支持,當(dāng)物聯(lián)網(wǎng)系統(tǒng)采用JavaScript開(kāi)發(fā)時(shí),天然對(duì)接了互聯(lián)網(wǎng)上海量的云服務(wù)與云資源,包括云存儲(chǔ)、云計(jì)算等一系列資源都可被方便調(diào)用,就像你在手機(jī)端訪問(wèn)各種云服務(wù)一樣。微服務(wù)構(gòu)架在服務(wù)器端的興起,讓JavaScript編寫(xiě)的每一個(gè)物聯(lián)網(wǎng)節(jié)點(diǎn)都可以作為一個(gè)大系統(tǒng)中的微服務(wù),通過(guò)RESTful API接口提供自己的服務(wù)。

在設(shè)計(jì)模式上,JavaScript的回調(diào)與事件循環(huán)等基于事件驅(qū)動(dòng)的編程模型非常適合物聯(lián)網(wǎng)。在物聯(lián)網(wǎng)環(huán)境下,環(huán)境在不斷變化,物聯(lián)網(wǎng)節(jié)點(diǎn)要不斷對(duì)環(huán)境的變動(dòng)做出響應(yīng),換句話說(shuō)物聯(lián)網(wǎng)系統(tǒng)通常是I/O密集型的系統(tǒng),回調(diào)與事件循環(huán)高效地完成了密集I/O操作這項(xiàng)工作,而事件響應(yīng)式編程相比于多進(jìn)程和多線程編程在內(nèi)存的使用上又非常高效,而這又是物聯(lián)網(wǎng)系統(tǒng)所需要的,通常物聯(lián)網(wǎng)系統(tǒng)都是資源受限系統(tǒng),內(nèi)存與CPU的頻率都非常有限。物聯(lián)網(wǎng)節(jié)點(diǎn)底層開(kāi)發(fā)中通常采用中斷響應(yīng)模式,在CPU中由稱(chēng)為中斷控制器的硬件來(lái)檢查中斷信號(hào)的出現(xiàn),并在中斷出現(xiàn)后控制CPU執(zhí)行特定程序片段,這一執(zhí)行模式和JavaScript的回調(diào)一致,很容易使用JavaScript回調(diào)機(jī)制來(lái)實(shí)現(xiàn)硬件的中斷響應(yīng)。

物聯(lián)網(wǎng)節(jié)點(diǎn)的部署特點(diǎn)決定了其回收維護(hù)成本非常高昂甚至是不可接受的。而物聯(lián)網(wǎng)節(jié)點(diǎn)要不斷應(yīng)對(duì)新的環(huán)境與應(yīng)用需求,所以在開(kāi)發(fā)中物聯(lián)網(wǎng)節(jié)點(diǎn)的遠(yuǎn)程部署與更新是非常重要的一個(gè)功能。JavaScript本來(lái)就是實(shí)現(xiàn)從服務(wù)器端向客戶(hù)端部署的一門(mén)語(yǔ)言,其天然就具有在網(wǎng)路上實(shí)現(xiàn)遠(yuǎn)程部署的屬性,實(shí)現(xiàn)起來(lái)就像你用瀏覽器下載JavaScript腳本并運(yùn)行一樣簡(jiǎn)單。JavaScript的熱部署也是一個(gè)比較熱門(mén)的研究領(lǐng)域,通過(guò)熱部署,物聯(lián)網(wǎng)節(jié)點(diǎn)可以實(shí)現(xiàn)在運(yùn)行過(guò)程中遠(yuǎn)程添加新功能,遠(yuǎn)程修正bug。

前面講了使用JavaScript來(lái)做物聯(lián)網(wǎng)開(kāi)發(fā)的好處,那么也有必要講一下JavaScript在物聯(lián)網(wǎng)應(yīng)用中相對(duì)于Web應(yīng)用的不同以及誤區(qū)。第一個(gè)問(wèn)題就是實(shí)時(shí)性。作為嵌入式系統(tǒng)物聯(lián)網(wǎng)網(wǎng)關(guān),首要面對(duì)的就是實(shí)時(shí)性問(wèn)題,比如各種電機(jī)的控制,一些電壓信號(hào)的采集都是有實(shí)時(shí)性要求的,需要在規(guī)定的時(shí)間內(nèi)完成所需工作。由于JavaScript的內(nèi)存管理使用垃圾收集機(jī)制,所以必然存在由于垃圾收集而導(dǎo)致應(yīng)用中斷執(zhí)行的情況,甚至有可能在一些情況下造成實(shí)時(shí)性要求遭到破壞。所以在設(shè)計(jì)JavaScript物聯(lián)網(wǎng)實(shí)時(shí)程序時(shí)需要考慮內(nèi)存垃圾數(shù)據(jù)時(shí)間對(duì)實(shí)時(shí)性的影響。當(dāng)然,也可以采用另一個(gè)設(shè)計(jì)模式,就是把實(shí)時(shí)任務(wù)使用C語(yǔ)言編寫(xiě)的單獨(dú)線程來(lái)實(shí)現(xiàn),利用JavaScript的單線程特點(diǎn),這種設(shè)計(jì)模式不會(huì)在嵌入式系統(tǒng)中占用過(guò)多的資源,畢竟JavaScript本來(lái)就是一種嵌入在瀏覽器里的語(yǔ)言。

另一方面,由于物聯(lián)網(wǎng)網(wǎng)關(guān)是需要長(zhǎng)期運(yùn)行的設(shè)備,相對(duì)于Web端需要有更高的可靠性與穩(wěn)定性,所以單元測(cè)試與集成測(cè)試是必須的,而且需要使用代碼分析工具保證代碼沒(méi)有任何內(nèi)存及文件句柄的泄漏。即使在垃圾收集環(huán)境下,內(nèi)存泄漏也是存在的,而在嵌入式系統(tǒng)中由于內(nèi)存有限,特別容易泄漏。好在服務(wù)器端JavaScript的開(kāi)發(fā)應(yīng)用已經(jīng)有很長(zhǎng)一段時(shí)間了,可以從服務(wù)器開(kāi)發(fā)里借鑒不少工具。

JavaScript物聯(lián)網(wǎng)節(jié)點(diǎn)開(kāi)發(fā)開(kāi)源項(xiàng)目匯總

OpenFPGAduino(https://github.com/OpenFPGAduino/)是筆者設(shè)計(jì)的基于Node.js與 FPGA的開(kāi)源物聯(lián)網(wǎng)軟硬件開(kāi)發(fā)平臺(tái),與Arduino等快速原型開(kāi)發(fā)平臺(tái)類(lèi)似。基于Node.js提供了網(wǎng)絡(luò)交互能力,特別包括用于開(kāi)發(fā)的網(wǎng)絡(luò)IDE以及類(lèi)似于樹(shù)莓派的Linux軟件開(kāi)發(fā)系統(tǒng),方便安裝各種Linux通用軟件,并且通過(guò)FPGA提供了可編程的兼容Arduino外圍接口用于與豐富的物聯(lián)網(wǎng)傳感器進(jìn)行連接。

iotjs(https://github.com/Samsung/iotjs)是三星開(kāi)發(fā)的嵌入式JavaScript執(zhí)行環(huán)境,能夠在幾百KB內(nèi)存的嵌入式系統(tǒng)上,不依靠操作系統(tǒng)實(shí)現(xiàn)完整的網(wǎng)絡(luò)與JavaScript支持。JavaScript解釋引擎采用

JerryScript(https://github.com/jerryscript-project/jerryscript),事件循環(huán)采用libtuv??梢哉f(shuō)是Node.js的嵌入式版本,其API與Node.js相兼容。

Esprunio(https://github.com/espruino/Espruino)是為微控制開(kāi)發(fā)的嵌入式JavaScript解釋引擎,提供了最小化的配置,可以在內(nèi)存低至8KB的微控制器上執(zhí)行JavaScript語(yǔ)言。

Cyclon(https://github.com/hybridgroup/cylon)是使用JavaScript來(lái)做機(jī)器人控制的項(xiàng)目,支持市面上主要的開(kāi)發(fā)板,通過(guò)提供各種外設(shè)的驅(qū)動(dòng),實(shí)現(xiàn)了不需要寫(xiě)一句C語(yǔ)言就能開(kāi)發(fā)和組裝一個(gè)機(jī)器人

物聯(lián)網(wǎng)JavaScript大數(shù)據(jù)處理

現(xiàn)在大數(shù)據(jù)技術(shù)方興未艾,在這些技術(shù)中,最基本的思想是MapReduce,這一思想將不同運(yùn)算拆解為Map與Reduce,然后將這些Map與Reduce任務(wù)在集群當(dāng)中最大限度地并行執(zhí)行。實(shí)現(xiàn)MapReduce模式編程最重要的一點(diǎn)就是支持函數(shù)式編程或者又稱(chēng)為L(zhǎng)ambda編程,所有的Map與Reduce操作都接受函數(shù)式編程作為參數(shù)。大數(shù)據(jù)的成功推動(dòng)了函數(shù)式編程的復(fù)興,由此多數(shù)現(xiàn)代編程語(yǔ)言包括C++與Java的新版本均支持函數(shù)式編程。JavaScript在它出生的那一天就支持函數(shù)式編程,其回調(diào)函數(shù)就是一種函數(shù)式編程模式。自然而然,支持Map與Reduce也不是什么困難的事情,因此使用JavaScript做物聯(lián)網(wǎng)大數(shù)據(jù)分析與處理非常容易而高效。JSON數(shù)據(jù)格式因?yàn)楦袷胶?jiǎn)單、處理方便的特點(diǎn)而受到不少青睞,被大量應(yīng)用于HTTP網(wǎng)絡(luò)傳輸,現(xiàn)有互聯(lián)網(wǎng)上的基礎(chǔ)設(shè)施與云服務(wù)也都采用JSON格式。以這些設(shè)施作為數(shù)據(jù)源,就要使用JavaScript來(lái)處理大數(shù)據(jù),這是因?yàn)镴SON作為JavaScript代碼片段,本質(zhì)上來(lái)說(shuō)一切基于RESTful API設(shè)計(jì)的接口幾乎都是對(duì)JavaScript友好的,當(dāng)然為了效率,有時(shí)會(huì)使用JSON的二進(jìn)制形式BSON。

由于物聯(lián)網(wǎng)的對(duì)稱(chēng)性,物理網(wǎng)的節(jié)點(diǎn)不僅可以是數(shù)據(jù)的收集者,同樣可以是數(shù)據(jù)的發(fā)起者,使用JavaScript來(lái)處理物聯(lián)網(wǎng)大數(shù)據(jù),那么每個(gè)物聯(lián)網(wǎng)數(shù)據(jù)節(jié)點(diǎn)也能夠發(fā)起大數(shù)據(jù)的處理,并利用后臺(tái)大數(shù)據(jù)環(huán)境做出決策并響應(yīng)環(huán)境的變化。這樣利用JavaScript將物聯(lián)網(wǎng)前端和后端數(shù)據(jù)處理直接無(wú)縫鏈接起來(lái),實(shí)現(xiàn)了大數(shù)據(jù)的實(shí)時(shí)處理與響應(yīng)的Lambda構(gòu)架,并同時(shí)完成了批處理與實(shí)時(shí)處理構(gòu)架的統(tǒng)一。在未來(lái),可以用JavaScript設(shè)計(jì)基于Node.js的處理框架,把物理網(wǎng)節(jié)點(diǎn)當(dāng)作大數(shù)據(jù)節(jié)點(diǎn)來(lái)統(tǒng)一物聯(lián)網(wǎng)中數(shù)據(jù)的處理與傳輸。

機(jī)器學(xué)習(xí)作為現(xiàn)在最熱門(mén)的大數(shù)據(jù)處理手段不得不提。由于JavaScript在瀏覽器端的支配地位,使用JavaScript做機(jī)器學(xué)習(xí)的嘗試也非常多,有了JavaScript的機(jī)器學(xué)習(xí)庫(kù),就可以非常簡(jiǎn)單地在瀏覽器上運(yùn)行一些機(jī)器學(xué)習(xí)的小程序,同樣也可以將這些機(jī)器學(xué)習(xí)庫(kù)運(yùn)行在Node.js上,使得物聯(lián)網(wǎng)節(jié)點(diǎn)也具有一定的機(jī)器學(xué)習(xí)能力及數(shù)據(jù)處理能力。當(dāng)然使用JavaScript直接控制深度機(jī)器學(xué)習(xí)集群也是一個(gè)不錯(cuò)的選擇,JavaScript在數(shù)據(jù)可視化方面的成功,幫助了它能夠很方便地可視化機(jī)器學(xué)習(xí)的過(guò)程與結(jié)果,方便以遠(yuǎn)程方式來(lái)控制機(jī)器學(xué)習(xí)集群。

JavaScript物聯(lián)網(wǎng)大數(shù)據(jù)開(kāi)源項(xiàng)目

Eclairjs(https://github.com/EclairJS/eclairjs-node)是基于Node.js的Spark大數(shù)據(jù)處理平臺(tái)前端,通過(guò)Eclairjs,可以使用JavaScript來(lái)操作基于內(nèi)存處理的大數(shù)據(jù)分析平臺(tái)Spark,通過(guò)Spark內(nèi)置的調(diào)度器,實(shí)現(xiàn)了在整個(gè)集群上調(diào)度資源,以最大化并行度來(lái)執(zhí)行JavaScript的算法。目前,Spark是最主流和發(fā)展最快的大數(shù)據(jù)處理平臺(tái)。

skale(https://github.com/skale-me/skale-engine)是一個(gè)完全使用JavaScript開(kāi)發(fā),采用Node.js作為執(zhí)行環(huán)境的分布式數(shù)據(jù)處理系統(tǒng),具有比Spark更快的性能。

MQTT是為物聯(lián)網(wǎng)設(shè)計(jì)的輕量級(jí)通訊協(xié)議,協(xié)議基于TCP/IP,適用于低帶寬不可靠環(huán)境。協(xié)議的開(kāi)銷(xiāo)非常小,支持發(fā)布訂閱模式,是種非常高效的通信協(xié)議。MQTT.js(https://github.com/mqttjs/MQTT.js)是Node.js的MQTT通信模塊,實(shí)現(xiàn)了Node.js收發(fā)MQTT數(shù)據(jù)。

Kafka是大數(shù)據(jù)分布式消息總線,提供了對(duì)海量消息的持久化能力,通過(guò)將接收到的數(shù)據(jù)直接持久化到硬盤(pán),提供了穩(wěn)定的數(shù)據(jù)吞吐量以及高可用性。Kafka Rest(https://github.com/confluentinc/kafka-rest)模塊為Kafka消息總線提供了Restful API 的支持,無(wú)論是使用瀏覽器還是Node.js都可以方便使用JavaScript來(lái)收發(fā)消息。

convnetjs(https://github.com/karpathy/convnetjs)是完全用JavaScript寫(xiě)成的神經(jīng)網(wǎng)絡(luò)機(jī)器學(xué)習(xí)庫(kù),可以運(yùn)行在瀏覽器中或Node.js中。convnetjs提供了許多有趣的例子,在瀏覽器上實(shí)現(xiàn)了對(duì)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過(guò)程的可視動(dòng)畫(huà)呈現(xiàn)與交互模式,對(duì)理解神經(jīng)網(wǎng)絡(luò)機(jī)器學(xué)習(xí)有非常好的幫助。

作為深度神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)方向最重要也是最熱門(mén)的項(xiàng)目,Google的TensorFlow是深度學(xué)習(xí)開(kāi)源的里程碑。TensorFlow的開(kāi)源使得使用深度學(xué)習(xí)來(lái)做數(shù)據(jù)處理已經(jīng)不再是一件高難度的事情。Node-tensorflow(https://github.com/node-tensorflow/node-tensorflow)是一個(gè)NodeJS API,使用了Google的開(kāi)源機(jī)器學(xué)習(xí)庫(kù)TensorFlow。

物聯(lián)網(wǎng)JavaScript數(shù)據(jù)展示

在瀏覽器端,JavaScript在數(shù)據(jù)的可視化方面早已處于支配地位,作為現(xiàn)在幾乎唯一可在所有瀏覽器上運(yùn)行的編程語(yǔ)言,使用JavaScript不僅可以給用戶(hù)提供交互式的環(huán)境,而且可以做出非常漂亮的圖表與動(dòng)畫(huà)效果,包括兩維的圖表曲線以及三維的虛擬空間,都可以使用JavaScript控制瀏覽器來(lái)實(shí)現(xiàn),現(xiàn)在許多基于瀏覽器的VR環(huán)境也可以通過(guò)JavaScript來(lái)開(kāi)發(fā)了。使用JavaScript來(lái)做物聯(lián)網(wǎng)的數(shù)據(jù)展示實(shí)在太合適不過(guò)了。

當(dāng)今互聯(lián)網(wǎng)世界,JavaScript已經(jīng)是一種全棧網(wǎng)絡(luò)開(kāi)發(fā)語(yǔ)言。特別是HTML5興起以后,JavaScript不再局限于瀏覽器端,而是將觸手伸到了網(wǎng)絡(luò)的方方面面,包括物聯(lián)網(wǎng)端、手機(jī)的移動(dòng)端和傳統(tǒng)的PC端。HTML5為瀏覽器設(shè)計(jì),很好地發(fā)揮了JavaScript的跨平臺(tái)特點(diǎn),真正做到了開(kāi)發(fā)一次JavaScript代碼,從手機(jī)上的iOS、Android到電腦端的Windows、macOS、Linux的跨平臺(tái)運(yùn)行。雖然目前JavaScript在性能上仍然無(wú)法與原生開(kāi)發(fā)應(yīng)用相匹敵,但是僅使用單一的JavaScript來(lái)開(kāi)發(fā)各種應(yīng)用程序,開(kāi)發(fā)成本與響應(yīng)速度上是其他開(kāi)發(fā)方式所無(wú)法比擬的。特別是在物聯(lián)網(wǎng)開(kāi)發(fā)環(huán)境中,很多應(yīng)用是輕量級(jí)的,對(duì)性能沒(méi)有特別高的要求,但是卻需要依照不同物聯(lián)網(wǎng)環(huán)境進(jìn)行不同的定制與適配,JavaScript來(lái)做這樣的數(shù)據(jù)展示工作再合適不過(guò)。根據(jù)網(wǎng)絡(luò)的對(duì)稱(chēng)性特點(diǎn),甚至于,完全可以用JavaScript來(lái)實(shí)現(xiàn)在物聯(lián)網(wǎng)節(jié)點(diǎn)上完成數(shù)據(jù)展示的工作,一如我們用手機(jī)來(lái)進(jìn)行數(shù)據(jù)展示與控制。

JavaScript數(shù)據(jù)展示開(kāi)源項(xiàng)目匯總

D3(https://github.com/d3/d3)是基于SVG的矢量圖操作工具。通過(guò)使用JavaScript,D3將數(shù)據(jù)以矢量圖形式展示出來(lái)并提供了任意伸縮的能力,在HTML5出現(xiàn)之前,D3是二維可視化的底層標(biāo)準(zhǔn)。通常許多繪制圖表與數(shù)據(jù)可視化工具都使用D3作為底層驅(qū)動(dòng)引擎,在其之上提供用戶(hù)友好的API接口

three.js(https://github.com/mrdoob/three.js/)是基于WebGL的JavaScript3D繪圖工具。通過(guò)WebGL擴(kuò)展,JavaScript語(yǔ)言實(shí)現(xiàn)了直接驅(qū)動(dòng)底層顯卡進(jìn)行3D繪圖。three.js在3D圖像基礎(chǔ)上還提供了VR支持,可以方便的使用JavaScript來(lái)實(shí)現(xiàn)VR數(shù)據(jù)展示。

ionic(https://github.com/driftyco/ionic)是基于AngularJS的移動(dòng)端跨平臺(tái)開(kāi)發(fā)環(huán)境,能夠在一個(gè)統(tǒng)一的框架下使用JavaScript HTML CSS,同時(shí)完成開(kāi)發(fā)iOS、Android、Window Phone程序,并根據(jù)各個(gè)環(huán)境的不同UI做自動(dòng)適配。

Electron(https://github.com/electron/electron)是基于Node.js與chrome的跨平臺(tái)桌面開(kāi)發(fā)環(huán)境,electron通過(guò)將瀏覽器內(nèi)核和后臺(tái)Node.js服務(wù)進(jìn)行打包,實(shí)現(xiàn)了一個(gè)使用JavaScript的全棧開(kāi)發(fā)環(huán)境,無(wú)需任何修改就能夠?qū)⒊绦虿渴鸬?span>Windows、macOS、Linux平臺(tái)上。

nw(https://github.com/nwjs/nw.js)是輕量級(jí)的JavaScript跨平臺(tái)桌面開(kāi)發(fā)環(huán)境,它實(shí)現(xiàn)了在HTML代碼中直接調(diào)用Node.js的各種API函數(shù),提供了一個(gè)平滑自然的桌面應(yīng)用開(kāi)發(fā)環(huán)境,隱藏了客戶(hù)端服務(wù)器編程的細(xì)節(jié)。



物聯(lián)網(wǎng)JavaScript實(shí)例講解

為更好理解JavaScript物聯(lián)網(wǎng)開(kāi)發(fā),下面以筆者設(shè)計(jì)的物聯(lián)網(wǎng)系統(tǒng)為例,詳細(xì)介紹物聯(lián)網(wǎng)系統(tǒng)的設(shè)計(jì)。所有設(shè)計(jì)資料都是開(kāi)源的,讀者可以對(duì)照源碼網(wǎng)頁(yè)與文檔。( http://openfpgaduino.)

● 物聯(lián)網(wǎng)網(wǎng)關(guān)最小系統(tǒng)硬件設(shè)計(jì)

對(duì)于應(yīng)用于物聯(lián)網(wǎng)的嵌入式系統(tǒng),系統(tǒng)的硬件設(shè)計(jì)是重要的組成部分,通常來(lái)說(shuō)應(yīng)對(duì)不同的應(yīng)用,嵌入式硬件的系統(tǒng)設(shè)計(jì)會(huì)有所不同,每個(gè)系統(tǒng)都會(huì)按照相應(yīng)的應(yīng)用場(chǎng)景進(jìn)行調(diào)整。但是物聯(lián)網(wǎng)的核心系統(tǒng)通常是一個(gè)設(shè)計(jì)構(gòu)架可以應(yīng)用于一大類(lèi)的系統(tǒng),所需要調(diào)整的通常是外圍設(shè)備。

圖1

如圖1所示是筆者設(shè)計(jì)的物聯(lián)網(wǎng)網(wǎng)關(guān)最小系統(tǒng),在系統(tǒng)設(shè)計(jì)思想上首先保證了核心系統(tǒng)的通用性,采用了ARM處理器。因?yàn)槭蔷W(wǎng)關(guān)節(jié)點(diǎn),設(shè)計(jì)上需要網(wǎng)關(guān)直接連接IP網(wǎng)絡(luò)并提供全功能的網(wǎng)絡(luò)服務(wù),因此選擇了能夠完整運(yùn)行Linux系統(tǒng)的ARM9處理器,運(yùn)行完整的Linux也是能夠運(yùn)行Node.js與完整JavaScript的必要條件。由于采用了標(biāo)準(zhǔn)Linux,雖然Linux內(nèi)核提供了一些實(shí)時(shí)性補(bǔ)丁,但由于編程模型復(fù)雜而且也不適合與Node.js集成,因此在最小核心系統(tǒng)中加入了FPGA。FPGA能夠在硬件層面完成實(shí)時(shí)響應(yīng),解決了系統(tǒng)的實(shí)時(shí)響應(yīng)需求,其次由于FPGA是一種可配置系統(tǒng),能夠根據(jù)應(yīng)用需要進(jìn)行設(shè)計(jì)與配置,所以引入FPGA也極大提高了系統(tǒng)的適配能力,為靈活適配各種不同物聯(lián)網(wǎng)應(yīng)用提供了基礎(chǔ)。

● 物聯(lián)網(wǎng)網(wǎng)關(guān)系統(tǒng)軟件設(shè)計(jì)

物聯(lián)網(wǎng)網(wǎng)關(guān)的軟件設(shè)計(jì)完全是基于硬件設(shè)計(jì)的構(gòu)架,最大限度發(fā)揮硬件的功能,設(shè)計(jì)流程如下:

1.首先在ARM9處理器上運(yùn)行完整的Linux系統(tǒng),其擁有完整的網(wǎng)絡(luò)服務(wù),并能根據(jù)需要通過(guò)APT-GET命令來(lái)安裝所需要的軟件包。

2.在Linux系統(tǒng)基礎(chǔ)上,運(yùn)行Node.js+MongoDB來(lái)提供所有網(wǎng)絡(luò)服務(wù)。

3.在Node.js里運(yùn)行HTTP服務(wù)器來(lái)提供基于Restful API的各種本地服務(wù),包括各種外設(shè)與I/O的控制。

4.運(yùn)行HTTP服務(wù)器,基于RESTful API,實(shí)現(xiàn)了基于HTML5的云IDE開(kāi)發(fā)環(huán)境。方便技術(shù)極客對(duì)網(wǎng)關(guān)的功能進(jìn)行定制,這些IDE包括了JavaScript的IDE,基于圖形編程的Blockly IDE和可以配置FPGA模塊功能和引腳定義的Web設(shè)計(jì)工具,當(dāng)然也包括較為底層的c語(yǔ)言IDE

有了這些功能,用戶(hù)就可以根據(jù)自己的需要,編寫(xiě)簡(jiǎn)單的程序來(lái)控制與物聯(lián)網(wǎng)網(wǎng)關(guān)連接的任何設(shè)備,實(shí)現(xiàn)自己的智能物聯(lián)網(wǎng)。

在板子內(nèi)部,通過(guò)實(shí)現(xiàn)Linux內(nèi)核驅(qū)動(dòng)的用戶(hù)空間模式,實(shí)現(xiàn)了Node.js直接訪問(wèn)FPGA內(nèi)存空間、控制FPGA內(nèi)部邏輯,并最終控制與FPGA相連接的各種物聯(lián)網(wǎng)外設(shè)的功能。同時(shí)還實(shí)現(xiàn)了Node.js對(duì)FPGA的現(xiàn)場(chǎng)再配置,這樣直接通過(guò)網(wǎng)絡(luò)下載FPGA配置文件,即可現(xiàn)場(chǎng)改變整個(gè)核心系統(tǒng)。

物聯(lián)網(wǎng)網(wǎng)關(guān)系統(tǒng)軟件設(shè)計(jì)

● 物聯(lián)網(wǎng)云構(gòu)建系統(tǒng)設(shè)計(jì)

如圖3所示是物聯(lián)網(wǎng)網(wǎng)關(guān)的云構(gòu)建系統(tǒng),圖中可以看到物聯(lián)網(wǎng)云構(gòu)建系統(tǒng)由GitHub,Docker Build與七牛云存儲(chǔ)三部分組成。云構(gòu)建系統(tǒng)的想法來(lái)源于持續(xù)集成,在軟件工程里,持續(xù)集成的概念已經(jīng)非常普遍了,每次有代碼改動(dòng)的提交都會(huì)觸發(fā)一個(gè)編譯測(cè)試的持續(xù)過(guò)程。模仿軟件持續(xù)集成,在云端構(gòu)建了一個(gè)對(duì)應(yīng)于物聯(lián)網(wǎng)網(wǎng)關(guān)的持續(xù)集成環(huán)境,選擇云端是因?yàn)?span>嵌入式系統(tǒng)本身的能力與處理速度都有限,不適于做為持續(xù)集成的構(gòu)建環(huán)境。在云構(gòu)建系統(tǒng)中,使用GitHub來(lái)管理代碼的基礎(chǔ)版本,使用Docker Hub的容器構(gòu)建機(jī)制完成應(yīng)用程序與FPGA程序的構(gòu)建,最后使用七牛云做為構(gòu)建結(jié)果的分發(fā)平臺(tái)。所有開(kāi)發(fā)板通過(guò)RESTful API驅(qū)動(dòng)云編譯環(huán)境,并訪問(wèn)七牛云來(lái)實(shí)現(xiàn)程序配置的升級(jí)。利用這一套云持續(xù)集成系統(tǒng),不僅可以迅速對(duì)應(yīng)用進(jìn)行部署而且可以開(kāi)放支持用戶(hù)進(jìn)行自定義開(kāi)發(fā)的云開(kāi)發(fā)環(huán)境,用戶(hù)利用這一云環(huán)境,能夠輕松實(shí)現(xiàn)對(duì)FPGA的定制設(shè)計(jì),實(shí)現(xiàn)一套云端FPGA設(shè)計(jì)環(huán)境。

物聯(lián)網(wǎng)網(wǎng)關(guān)的云架構(gòu)

● 物聯(lián)網(wǎng)大數(shù)據(jù)處理系統(tǒng)設(shè)計(jì)

如圖4所示是物聯(lián)網(wǎng)大數(shù)據(jù)處理系統(tǒng)的設(shè)計(jì)構(gòu)架圖,物聯(lián)網(wǎng)網(wǎng)關(guān)上收集到的物聯(lián)網(wǎng)數(shù)據(jù)被系統(tǒng)上的Node.js源源不斷地送往大數(shù)據(jù)消息總線Kafka的HTTP proxy,每一個(gè)Kafka HTTP proxy可以承接數(shù)千個(gè)這樣的物聯(lián)網(wǎng)網(wǎng)關(guān),而proxy又將匯總的的數(shù)據(jù)發(fā)送到Kafka的集群中做進(jìn)一步匯總,然后在Kafka 集群內(nèi)部實(shí)現(xiàn)對(duì)數(shù)據(jù)的ETL過(guò)程,包括數(shù)據(jù)異常值的過(guò)濾,重復(fù)數(shù)據(jù)的去除,數(shù)據(jù)格式的轉(zhuǎn)換。最后利用Kafka集群,將數(shù)據(jù)發(fā)送到不同的下游消費(fèi)者那里,先發(fā)送到大數(shù)據(jù)存儲(chǔ)系統(tǒng)S3或者HDFS做永久保存,為將來(lái)用Hadoop或者Spark等離線分析系統(tǒng)提供數(shù)據(jù);接著數(shù)據(jù)被發(fā)送到ElasticSearch中做索引,方便對(duì)數(shù)據(jù)進(jìn)行快速的搜索與查詢(xún),并且利用Kibana做數(shù)據(jù)的可視化,提供整個(gè)數(shù)據(jù)流的健康狀態(tài)監(jiān)控;最后數(shù)據(jù)被發(fā)送到實(shí)時(shí)在線大數(shù)據(jù)處理系統(tǒng)Spark Streaming中做數(shù)據(jù)在線分析、機(jī)器學(xué)習(xí)等任務(wù),實(shí)現(xiàn)數(shù)據(jù)在在線分析與響應(yīng)。

大數(shù)據(jù)處理系統(tǒng)的設(shè)計(jì)結(jié)構(gòu)圖

參考文獻(xiàn)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多