當前位置:
首頁 > 科技 > JavaScript——下一代物聯網全棧開發

JavaScript——下一代物聯網全棧開發

作者 | 李知周


責編 | 賈維娣


Jeff Atwood曾提出「任何能夠用JavaScript實現的應用,最終都必將用JavaScript實現」他對JavaScript的推崇不言而喻。而當下這個物聯網大熱的時代,JavaScript支持HTTP和JSON、支持函數式編程、可提供互動式環境等特點堪稱適用於物聯網全棧開發。本文詳解了JavaScript可參與的每一個物聯網過程,並針對開源項目進行了匯總。


物聯網節點JavaScript開發


網路中,HTTP協議與JSON數據格式特別是RESTful API無疑具有支配地位,各種雲服務,數據傳輸都基於這些協議來進行。而JavaScript為HTTP和JSON提供了最好的支持,當物聯網系統採用JavaScript開發時,天然對接了互聯網上海量的雲服務與雲資源,包括雲存儲、雲計算等一系列資源都可被方便調用,就像你在手機端訪問各種雲服務一樣。微服務構架在伺服器端的興起,讓JavaScript編寫的每一個物聯網節點都可以作為一個大系統中的微服務,通過RESTful API介面提供自己的服務。

在設計模式上,JavaScript的回調與事件循環等基於事件驅動的編程模型非常適合物聯網。在物聯網環境下,環境在不斷變化,物聯網節點要不斷對環境的變動做出響應,換句話說物聯網系統通常是I/O密集型的系統,回調與事件循環高效地完成了密集I/O操作這項工作,而事件響應式編程相比於多進程和多線程編程在內存的使用上又非常高效,而這又是物聯網系統所需要的,通常物聯網系統都是資源受限系統,內存與CPU的頻率都非常有限。物聯網節點底層開發中通常採用中斷響應模式,在CPU中由稱為中斷控制器的硬體來檢查中斷信號的出現,並在中斷出現後控制CPU執行特定程序片段,這一執行模式和JavaScript的回調一致,很容易使用JavaScript回調機制來實現硬體的中斷響應。


物聯網節點的部署特點決定了其回收維護成本非常高昂甚至是不可接受的。而物聯網節點要不斷應對新的環境與應用需求,所以在開發中物聯網節點的遠程部署與更新是非常重要的一個功能。JavaScript本來就是實現從伺服器端向客戶端部署的一門語言,其天然就具有在網路上實現遠程部署的屬性,實現起來就像你用瀏覽器下載JavaScript腳本並運行一樣簡單。JavaScript的熱部署也是一個比較熱門的研究領域,通過熱部署,物聯網節點可以實現在運行過程中遠程添加新功能,遠程修正bug。


前面講了使用JavaScript來做物聯網開發的好處,那麼也有必要講一下JavaScript在物聯網應用中相對於Web應用的不同以及誤區。第一個問題就是實時性。作為嵌入式系統的物聯網網關,首要面對的就是實時性問題,比如各種電機的控制,一些電壓信號的採集都是有實時性要求的,需要在規定的時間內完成所需工作。由於JavaScript的內存管理使用垃圾收集機制,所以必然存在由於垃圾收集而導致應用中斷執行的情況,甚至有可能在一些情況下造成實時性要求遭到破壞。所以在設計JavaScript物聯網實時程序時需要考慮內存垃圾數據時間對實時性的影響。當然,也可以採用另一個設計模式,就是把實時任務使用C語言編寫的單獨線程來實現,利用JavaScript的單線程特點,這種設計模式不會在嵌入式系統中佔用過多的資源,畢竟JavaScript本來就是一種嵌入在瀏覽器里的語言。


另一方面,由於物聯網網關是需要長期運行的設備,相對於Web端需要有更高的可靠性與穩定性,所以單元測試與集成測試是必須的,而且需要使用代碼分析工具保證代碼沒有任何內存及文件句柄的泄漏。即使在垃圾收集環境下,內存泄漏也是存在的,而在嵌入式系統中由於內存有限,特別容易泄漏。好在伺服器端JavaScript的開發應用已經有很長一段時間了,可以從伺服器開發里借鑒不少工具。


JavaScript物聯網節點開發開源項目匯總


OpenFPGAduino(https://github.com/OpenFPGAduino/)是筆者設計的基於Node.js與 FPGA的開源物聯網軟硬體開發平台,與Arduino等快速原型開發平台類似。基於Node.js提供了網路交互能力,特別包括用於開發的網路IDE以及類似於樹莓派的Linux軟體開發系統,方便安裝各種Linux通用軟體,並且通過FPGA提供了可編程的兼容Arduino外圍介面用於與豐富的物聯網感測器進行連接。


iotjs(https://github.com/Samsung/iotjs)是三星開發的嵌入式JavaScript執行環境,能夠在幾百KB內存的嵌入式系統上,不依靠操作系統實現完整的網路與JavaScript支持。JavaScript解釋引擎採用


JerryScript(https://github.com/jerryscript-project/jerryscript),事件循環採用libtuv。可以說是Node.js的嵌入式版本,其API與Node.js相兼容。


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


Cyclon(https://github.com/hybridgroup/cylon)是使用JavaScript來做機器人控制的項目,支持市面上主要的開發板,通過提供各種外設的驅動,實現了不需要寫一句C語言就能開發和組裝一個機器人。

物聯網JavaScript大數據處理


現在大數據技術方興未艾,在這些技術中,最基本的思想是MapReduce,這一思想將不同運算拆解為Map與Reduce,然後將這些Map與Reduce任務在集群當中最大限度地並行執行。實現MapReduce模式編程最重要的一點就是支持函數式編程或者又稱為Lambda編程,所有的Map與Reduce操作都接受函數式編程作為參數。大數據的成功推動了函數式編程的復興,由此多數現代編程語言包括C++與Java的新版本均支持函數式編程。JavaScript在它出生的那一天就支持函數式編程,其回調函數就是一種函數式編程模式。自然而然,支持Map與Reduce也不是什麼困難的事情,因此使用JavaScript做物聯網大數據分析與處理非常容易而高效。JSON數據格式因為格式簡單、處理方便的特點而受到不少青睞,被大量應用於HTTP網路傳輸,現有互聯網上的基礎設施與雲服務也都採用JSON格式。以這些設施作為數據源,就要使用JavaScript來處理大數據,這是因為JSON作為JavaScript代碼片段,本質上來說一切基於RESTful API設計的介面幾乎都是對JavaScript友好的,當然為了效率,有時會使用JSON的二進位形式BSON。


由於物聯網的對稱性,物理網的節點不僅可以是數據的收集者,同樣可以是數據的發起者,使用JavaScript來處理物聯網大數據,那麼每個物聯網數據節點也能夠發起大數據的處理,並利用後台大數據環境做出決策並響應環境的變化。這樣利用JavaScript將物聯網前端和後端數據處理直接無縫鏈接起來,實現了大數據的實時處理與響應的Lambda構架,並同時完成了批處理與實時處理構架的統一。在未來,可以用JavaScript設計基於Node.js的處理框架,把物理網節點當作大數據節點來統一物聯網中數據的處理與傳輸。


機器學習作為現在最熱門的大數據處理手段不得不提。由於JavaScript在瀏覽器端的支配地位,使用JavaScript做機器學習的嘗試也非常多,有了JavaScript的機器學習庫,就可以非常簡單地在瀏覽器上運行一些機器學習的小程序,同樣也可以將這些機器學習庫運行在Node.js上,使得物聯網節點也具有一定的機器學習能力及數據處理能力。當然使用JavaScript直接控制深度機器學習集群也是一個不錯的選擇,JavaScript在數據可視化方面的成功,幫助了它能夠很方便地可視化機器學習的過程與結果,方便以遠程方式來控制機器學習集群。


JavaScript物聯網大數據開源項目


Eclairjs(https://github.com/EclairJS/eclairjs-node)是基於Node.js的Spark大數據處理平台前端,通過Eclairjs,可以使用JavaScript來操作基於內存處理的大數據分析平台Spark,通過Spark內置的調度器,實現了在整個集群上調度資源,以最大化並行度來執行JavaScript的演算法。目前,Spark是最主流和發展最快的大數據處理平台。


skale(https://github.com/skale-me/skale-engine)是一個完全使用JavaScript開發,採用Node.js作為執行環境的分布式數據處理系統,具有比Spark更快的性能。


MQTT是為物聯網設計的輕量級通訊協議,協議基於TCP/IP,適用於低帶寬不可靠環境。協議的開銷非常小,支持發布訂閱模式,是種非常高效的通信協議。MQTT.js(https://github.com/mqttjs/MQTT.js)是Node.js的MQTT通信模塊,實現了Node.js收發MQTT數據。


Kafka是大數據分布式消息匯流排,提供了對海量消息的持久化能力,通過將接收到的數據直接持久化到硬碟,提供了穩定的數據吞吐量以及高可用性。Kafka Rest(https://github.com/confluentinc/kafka-rest)模塊為Kafka消息匯流排提供了Restful API 的支持,無論是使用瀏覽器還是Node.js都可以方便使用JavaScript來收發消息。


convnetjs(https://github.com/karpathy/convnetjs)是完全用JavaScript寫成的神經網路機器學習庫,可以運行在瀏覽器中或Node.js中。convnetjs提供了許多有趣的例子,在瀏覽器上實現了對神經網路學習過程的可視動畫呈現與交互模式,對理解神經網路機器學習有非常好的幫助。

作為深度神經網路學習方向最重要也是最熱門的項目,Google的TensorFlow是深度學習開源的里程碑。TensorFlow的開源使得使用深度學習來做數據處理已經不再是一件高難度的事情。Node-tensorflow(https://github.com/node-tensorflow/node-tensorflow)是一個NodeJS API,使用了Google的開源機器學習庫TensorFlow。


物聯網JavaScript數據展示


在瀏覽器端,JavaScript在數據的可視化方面早已處於支配地位,作為現在幾乎唯一可在所有瀏覽器上運行的編程語言,使用JavaScript不僅可以給用戶提供互動式的環境,而且可以做出非常漂亮的圖表與動畫效果,包括兩維的圖表曲線以及三維的虛擬空間,都可以使用JavaScript控制瀏覽器來實現,現在許多基於瀏覽器的VR環境也可以通過JavaScript來開發了。使用JavaScript來做物聯網的數據展示實在太合適不過了。


當今互聯網世界,JavaScript已經是一種全棧網路開發語言。特別是HTML5興起以後,JavaScript不再局限於瀏覽器端,而是將觸手伸到了網路的方方面面,包括物聯網端、手機的移動端和傳統的PC端。HTML5為瀏覽器設計,很好地發揮了JavaScript的跨平台特點,真正做到了開發一次JavaScript代碼,從手機上的iOS、Android到電腦端的Windows、macOS、Linux的跨平台運行。雖然目前JavaScript在性能上仍然無法與原生開發應用相匹敵,但是僅使用單一的JavaScript來開發各種應用程序,開發成本與響應速度上是其他開發方式所無法比擬的。特別是在物聯網開發環境中,很多應用是輕量級的,對性能沒有特別高的要求,但是卻需要依照不同物聯網環境進行不同的定製與適配,JavaScript來做這樣的數據展示工作再合適不過。根據網路的對稱性特點,甚至於,完全可以用JavaScript來實現在物聯網節點上完成數據展示的工作,一如我們用手機來進行數據展示與控制。


JavaScript數據展示開源項目匯總


D3(https://github.com/d3/d3)是基於SVG的矢量圖操作工具。通過使用JavaScript,D3將數據以矢量圖形式展示出來並提供了任意伸縮的能力,在HTML5出現之前,D3是二維可視化的底層標準。通常許多繪製圖表與數據可視化工具都使用D3作為底層驅動引擎,在其之上提供用戶友好的API介面。


three.js(https://github.com/mrdoob/three.js/)是基於WebGL的JavaScript3D繪圖工具。通過WebGL擴展,JavaScript語言實現了直接驅動底層顯卡進行3D繪圖。three.js在3D圖像基礎上還提供了VR支持,可以方便的使用JavaScript來實現VR數據展示。


ionic(https://github.com/driftyco/ionic)是基於AngularJS的移動端跨平台開發環境,能夠在一個統一的框架下使用JavaScript HTML CSS,同時完成開發iOS、Android、Window Phone程序,並根據各個環境的不同UI做自動適配。


Electron(https://github.com/electron/electron)是基於Node.js與chrome的跨平台桌面開發環境,electron通過將瀏覽器內核和後台Node.js服務進行打包,實現了一個使用JavaScript的全棧開發環境,無需任何修改就能夠將程序部署到Windows、macOS、Linux平台上。


nw(https://github.com/nwjs/nw.js)是輕量級的JavaScript跨平台桌面開發環境,它實現了在HTML代碼中直接調用Node.js的各種API函數,提供了一個平滑自然的桌面應用開發環境,隱藏了客戶端伺服器編程的細節。

物聯網JavaScript實例講解


物聯網網關最小系統硬體設計


對於應用於物聯網的嵌入式系統,系統的硬體設計是重要的組成部分,通常來說應對不同的應用,嵌入式硬體的系統設計會有所不同,每個系統都會按照相應的應用場景進行調整。但是物聯網的核心系統通常是一個設計構架可以應用於一大類的系統,所需要調整的通常是外圍設備。

JavaScript——下一代物聯網全棧開發



圖1


如圖1所示是筆者設計的物聯網網關最小系統,在系統設計思想上首先保證了核心系統的通用性,採用了ARM處理器。因為是網關節點,設計上需要網關直接連接IP網路並提供全功能的網路服務,因此選擇了能夠完整運行Linux系統的ARM9處理器,運行完整的Linux也是能夠運行Node.js與完整JavaScript的必要條件。由於採用了標準Linux,雖然Linux內核提供了一些實時性補丁,但由於編程模型複雜而且也不適合與Node.js集成,因此在最小核心系統中加入了FPGA。FPGA能夠在硬體層面完成實時響應,解決了系統的實時響應需求,其次由於FPGA是一種可配置系統,能夠根據應用需要進行設計與配置,所以引入FPGA也極大提高了系統的適配能力,為靈活適配各種不同物聯網應用提供了基礎。


物聯網網關係統軟體設計


物聯網網關的軟體設計完全是基於硬體設計的構架,最大限度發揮硬體的功能,設計流程如下:


1.首先在ARM9處理器上運行完整的Linux系統,其擁有完整的網路服務,並能根據需要通過APT-GET命令來安裝所需要的軟體包。

2.在Linux系統基礎上,運行Node.js+MongoDB來提供所有網路服務。


3.在Node.js里運行HTTP伺服器來提供基於Restful API的各種本地服務,包括各種外設與I/O的控制。


4.運行HTTP伺服器,基於RESTful API,實現了基於HTML5的雲IDE開發環境。方便技術極客對網關的功能進行定製,這些IDE包括了JavaScript的IDE,基於圖形編程的Blockly IDE和可以配置FPGA模塊功能和引腳定義的Web設計工具,當然也包括較為底層的c語言IDE。


有了這些功能,用戶就可以根據自己的需要,編寫簡單的程序來控制與物聯網網關連接的任何設備,實現自己的智能物聯網。


在板子內部,通過實現Linux內核驅動的用戶空間模式,實現了Node.js直接訪問FPGA內存空間、控制FPGA內部邏輯,並最終控制與FPGA相連接的各種物聯網外設的功能。同時還實現了Node.js對FPGA的現場再配置,這樣直接通過網路下載FPGA配置文件,即可現場改變整個核心系統。

JavaScript——下一代物聯網全棧開發



物聯網網關係統軟體設計


物聯網雲構建系統設計


如圖3所示是物聯網網關的雲構建系統,圖中可以看到物聯網雲構建系統由GitHub,Docker Build與七牛雲存儲三部分組成。雲構建系統的想法來源於持續集成,在軟體工程里,持續集成的概念已經非常普遍了,每次有代碼改動的提交都會觸發一個編譯測試的持續過程。模仿軟體持續集成,在雲端構建了一個對應於物聯網網關的持續集成環境,選擇雲端是因為嵌入式系統本身的能力與處理速度都有限,不適於做為持續集成的構建環境。在雲構建系統中,使用GitHub來管理代碼的基礎版本,使用Docker Hub的容器構建機制完成應用程序與FPGA程序的構建,最後使用七牛雲做為構建結果的分發平台。所有開發板通過RESTful API驅動雲編譯環境,並訪問七牛雲來實現程序配置的升級。利用這一套雲持續集成系統,不僅可以迅速對應用進行部署而且可以開放支持用戶進行自定義開發的雲開發環境,用戶利用這一雲環境,能夠輕鬆實現對FPGA的定製設計,實現一套雲端FPGA設計環境。

JavaScript——下一代物聯網全棧開發



物聯網網關的雲架構


物聯網大數據處理系統設計


如圖4所示是物聯網大數據處理系統的設計構架圖,物聯網網關上收集到的物聯網數據被系統上的Node.js源源不斷地送往大數據消息匯流排Kafka的HTTP proxy,每一個Kafka HTTP proxy可以承接數千個這樣的物聯網網關,而proxy又將匯總的的數據發送到Kafka的集群中做進一步匯總,然後在Kafka 集群內部實現對數據的ETL過程,包括數據異常值的過濾,重複數據的去除,數據格式的轉換。最後利用Kafka集群,將數據發送到不同的下游消費者那裡,先發送到大數據存儲系統S3或者HDFS做永久保存,為將來用Hadoop或者Spark等離線分析系統提供數據;接著數據被發送到ElasticSearch中做索引,方便對數據進行快速的搜索與查詢,並且利用Kibana做數據的可視化,提供整個數據流的健康狀態監控;最後數據被發送到實時在線大數據處理系統Spark Streaming中做數據在線分析、機器學習等任務,實現數據在在線分析與響應。

JavaScript——下一代物聯網全棧開發



大數據處理系統的設計結構圖


參考文獻


https://blog.jscrambler.com/javascript-the-perfect-language-for-the-internet-of-things-iot/

http://fex.baidu.com/blog/2015/05/nodejs-hot-swapping/


https://cnodejs.org/topic/5659a9e0c4fa25cb27cc3c23


http://openfpgaduino.github.io/docs/index.html


https://www.burakkanber.com/blog/machine-learning-in-other-languages-introduction/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

神經網路:比原來更容易學習了
從開發零基礎到登上Steam和Oculus:一個VR遊戲開發者的自述

TAG:CSDN |

您可能感興趣

第一三共與Glycotope聯合開發gatipotuzumab的抗體偶聯藥物
Go image網站開發
RogueInitiative與EmblematicGroup合作開發全新沉浸式內容
JetBrains殺入Python開發,發布全新機器學習Web方案!
SpringBoot整合Quartz 註解開發
Mozilla推出開源瀏覽器Firefox Reality,專為VR一體機開發
Chrome即將登陸聯想Mirage Solo VR一體機;Oculus開發主管:開發者應考慮內容的全平台適用性
谷歌開發新系統Fuchsia 計劃取代Android和Chrome OS
Oculus開始向開發者提供VR一體機Santa Cruz
開發者推出全新VR瀏覽器Supermedium
GameFace Labs發布VR一體機開發者版本兼容SteamVR
Imagination 發布神經網路軟體開發套件 (SDK)
《半條命》主創Chet Faliszek加入VR殭屍遊戲開發商Vertigo Games
Sony PlayStation 5來了?索尼:開發下一代主機硬體
Magic Leap開發者大會開放申請;Adobe Captivate
BCH應用開發的門戶網站:developer.bitcoin.com
Mozilla發布Firefox Reality WebVR開發者指南
Core開發者眼鏡蛇Cobra公開打臉 Blockstream
Volkswagen 將停止開發新一代 Beetle 甲殼蟲
Facebook:一批開發者已經拿到了Santa Cruz開發機