javascript下一代物聯(lián)網(wǎng)開發(fā)
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)堪稱適用于物聯(lián)網(wǎng)全棧開發(fā)。本文詳解了JavaScript可參與的每一個(gè)物聯(lián)網(wǎng)過程,并針對(duì)開源項(xiàng)目進(jìn)行了匯總。
物聯(lián)網(wǎng)節(jié)點(diǎn)JavaScript開發(fā)
網(wǎng)絡(luò)中,HTTP協(xié)議與JSON數(shù)據(jù)格式特別是RESTful API無疑具有支配地位,各種云服務(wù),數(shù)據(jù)傳輸都基于這些協(xié)議來進(jìn)行。而JavaScript為HTTP和JSON提供了最好的支持,當(dāng)物聯(lián)網(wǎng)系統(tǒng)采用JavaScript開發(fā)時(shí),天然對(duì)接了互聯(lián)網(wǎng)上海量的云服務(wù)與云資源,包括云存儲(chǔ)、云計(jì)算等一系列資源都可被方便調(diào)用,就像你在手機(jī)端訪問各種云服務(wù)一樣。微服務(wù)構(gòu)架在服務(wù)器端的興起,讓JavaScript編寫的每一個(gè)物聯(lián)網(wǎng)節(jié)點(diǎn)都可以作為一個(gè)大系統(tǒng)中的微服務(wù),通過RESTfulAPI接口提供自己的服務(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),換句話說物聯(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)底層開發(fā)中通常采用中斷響應(yīng)模式,在CPU中由稱為中斷控制器的硬件來檢查中斷信號(hào)的出現(xiàn),并在中斷出現(xiàn)后控制CPU執(zhí)行特定程序片段,這一執(zhí)行模式和JavaScript的回調(diào)一致,很容易使用JavaScript回調(diào)機(jī)制來實(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)用需求,所以在開發(fā)中物聯(lián)網(wǎng)節(jié)點(diǎn)的遠(yuǎn)程部署與更新是非常重要的一個(gè)功能。JavaScript本來就是實(shí)現(xiàn)從服務(wù)器端向客戶端部署的一門語言,其天然就具有在網(wǎng)路上實(shí)現(xiàn)遠(yuǎn)程部署的屬性,實(shí)現(xiàn)起來就像你用瀏覽器下載JavaScript腳本并運(yùn)行一樣簡(jiǎn)單。JavaScript的熱部署也是一個(gè)比較熱門的研究領(lǐng)域,通過熱部署,物聯(lián)網(wǎng)節(jié)點(diǎn)可以實(shí)現(xiàn)在運(yùn)行過程中遠(yuǎn)程添加新功能,遠(yuǎn)程修正bug。
前面講了使用JavaScript來做物聯(lián)網(wǎng)開發(fā)的好處,那么也有必要講一下JavaScript在物聯(lián)網(wǎng)應(yīng)用中相對(duì)于Web應(yīng)用的不同以及誤區(qū)。第一個(gè)問題就是實(shí)時(shí)性。作為嵌入式系統(tǒng)的物聯(lián)網(wǎng)網(wǎng)關(guān),首要面對(duì)的就是實(shí)時(shí)性問題,比如各種電機(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語言編寫的單獨(dú)線程來實(shí)現(xiàn),利用JavaScript的單線程特點(diǎn),這種設(shè)計(jì)模式不會(huì)在嵌入式系統(tǒng)中占用過多的資源,畢竟JavaScript本來就是一種嵌入在瀏覽器里的語言。
另一方面,由于物聯(lián)網(wǎng)網(wǎng)關(guān)是需要長(zhǎng)期運(yùn)行的設(shè)備,相對(duì)于Web端需要有更高的可靠性與穩(wěn)定性,所以單元測(cè)試與集成測(cè)試是必須的,而且需要使用代碼分析工具保證代碼沒有任何內(nèi)存及文件句柄的泄漏。即使在垃圾收集環(huán)境下,內(nèi)存泄漏也是存在的,而在嵌入式系統(tǒng)中由于內(nèi)存有限,特別容易泄漏。好在服務(wù)器端JavaScript的開發(fā)應(yīng)用已經(jīng)有很長(zhǎng)一段時(shí)間了,可以從服務(wù)器開發(fā)里借鑒不少工具。