專訪Yorkie:JavaScript如何開發IoT應用?

隨着5G的到來,各大公司都紛紛加大了在物聯網和邊緣計算方面的投入,一些先驅者試圖將JavaScript 引入 IoT 開發,打通物聯網與龐大的前端開發者生態,ShadowNode 就是其中的一位。在6月20日舉辦的 GMTC 全球大前端技術大會中,ShadowNode 作者 Yorkie 將分享《JavaScript in IoT》的話題,藉此機會我們對他進行了採訪,瞭解 JavaScript 在 IoT 領域開發的一些問題。

InfoQ:能否和我們講講,現在IoT開發領域有哪些具體的場景和產品?

Yorkie:場景可以分爲使用場景和開發場景,首先是針對用戶使用場景,IoT 可以劃分爲2個主要分類:一種是對單個家庭設備的控制,諸如控制空調、打開開關、打開電燈等。還有一種一般叫智能場景,就是通過一些簡單的操作來配置某個事件發生時的一系列控制指令。舉個簡單例子,每天用戶起牀,自動打開窗簾、打開衛生間的燈光、自動播放當日早間新聞等。

除了以上兩種外,其實還有一些非常定製化的場景,比如當播放家庭影院時,家裏的智能電燈可以根據電影的情節,調節不同的燈光顏色來烘托電影氣氛。

對於開發場景來說,IoT 設備在我看來,主要分爲:

  • 以1GB內存爲主的 Android 設備,主要是一些帶屏的智能設備,如我們常用的手機,電子相冊等,開發環境以 Android 爲主。
  • 以128MB內存爲主的 Linux 設備,主要是作爲家庭網關、智能音箱等,開發環境以 C/C++ 爲主。
  • 以512KB內存爲主的 RTOS 設備,主要代表爲智能電燈、智能手環、智能空調等,開發環境以 C 爲主。

目前的現狀是這樣。

InfoQ:請您介紹一下 ShadowNode,以及爲什麼要做這個項目?

Yorkie:簡單的說,ShadowNode 被我定義爲設備端的 Node.js 運行時,並支持 N-API。物聯網按照資源富有程度,分爲3個等級,對於 1GB 以上的設備,社區版的 Node.js 是完全可以勝任的,而 ShadowNode 則是爲了解決開發者在 128MB 設備下,運行 Node.js 的使用問題,它可以做到裸運行時只有 1MB 佔用。

提到 ShadowNode,就不得不提到 IoT.js,其實 ShadowNode 是 fork 自 IoT.js,而且當我發現它的時候,就已經具備了大部分 Node.js 的功能了,包括 net, stream, dns, udp, fs, http 等重要模塊,ShadowNode 在其基礎上增加了 child_process, tls, mqtt, websocket 等,並且增加了 N-API 的支持和兼容了部分 NPM 包生態。

做 ShadowNode 的原因也很簡單,就是想補齊 Node.js 在物聯網的部分,讓 JS 開發者從雲端開發再次回到用戶端,並希望 JS 生態和 IoT 生態能融合得更加緊密。我非常希望能把社區和 IoT 行業聯繫在一起,而不是讓它停留在給開發者玩玩的狀態,因此纔會在樹莓派這類開發板配置越來越好的大環境下,仍然選擇去做更低成本配置的適配,也正因如此,纔會有 ShadowNode 的誕生。

InfoQ:對不瞭解 IoT 的人來說,Node.js 和 JavaScript 的性能似乎不夠好,爲什麼能用在嵌入式平臺上面呢?

Yorkie:嚴格來說,現在我們仍然沒有完成在真正的嵌入式平臺上運行 Node.js,不過我可以分享下在設備成本一降再降時,如何優化性能與內存的。

首先是內存上的優化,主要包括常用 ByteCode 的 Compact 模式,Compressed Pointer(壓縮指針),選擇性地支持了 ECMA 標準等。

接下來是性能優化,由於 ShadowNode 是集成在我們自己的操作系統(YodaOS)上的,所以一些基礎 Node.js 包是放在全局路徑(/usr/lib/node_modules),按照 Node.js Modules 的搜索算法,它是一個就近原則的算法,這樣導致了在加載系統模塊時,會消耗大量時間在搜索路徑,於是我們就引入了一個新的環境變量 NODE_PRIORITIZED_PATH,顧名思義,設置後會優先搜索該路徑下的模塊。

還有一個我們在 ShadowNode 中比較常用的優化手段是,當我們遇到一個第三方庫要用時,但同時這個庫體積很大,依賴多,這時我們通常會用 C 語言把底層重寫,然後做一層很薄的 JS API,讓它與社區庫保持一致,內置的 MQTT / WebSocket 都是按這個套路來完成的,效果都很顯著。

總結一下,在資源受限的情況下,我們往往做優化時,都是在內存與性能之間做權衡,實在無法權衡的情況,就選擇減少 JavaScript 的對象,往往都能湊效。所以我們在開發 ShadowNode 時,選擇了一種與 Node.js 完全不同的方式,我們只讓 JavaScript 承擔系統澆水的角色,大量的邏輯使用 C 來完成,越少的 JS 代碼就代表越好的性能以及越低的內存佔用,最後只要保證 API 一致就行了。

InfoQ:用 JS 編寫一個驅動智能音箱的 IoT 應用,大概流程是什麼樣的?

Yorkie:其實跟我們在桌面寫程序並沒有什麼不同,只是智能音箱多了一個事件,去告訴開發者“用戶說了什麼話,以及什麼意圖”,然後就是處理算法傳過來的 JSON,再按照你想做的去控制 IoT 設備就行。控制的話,也都是通過 http 或 websocket 等就能完成。

如果你想移植一些 C/C++ 庫的話,也很方便,只需要按照 N-API 在 PC 上調通,然後再放到對應的交叉編譯框架下完成編譯即可。

InfoQ:目前 JS in IoT 有哪些痛點?

Yorkie:目前的痛點主要還有3點,也可以說是 ShadowNode 需要持續做好的:

  • 語法的支持,雖然現在 ShadowNode 支持了箭頭函數、Class、Symbol 等,但仍然不支持 const/let、generator 和 async/await 等,這可能對於習慣了 Node.js 新特性的開發者來說,會是一段相對痛苦的經歷。
  • 調試方式相對簡陋,ShadowNode 並不支持 Inspector 和大部分 Chrome DevTools 的功能,僅支持了 Heap Profiler。
  • 生態的缺乏,雖然我們支持運行 NPM 格式的包,不過不幸的是,很少有包能在 ShadowNode 上運行起來,最主要的原因就是大部分的包都有大量的依賴。

除此之外,還有就是對於 RTOS 上,完整地使用 ShadowNode(Node.js)還是非常困難,仍然需要做大量的優化以及移植的工作。

InfoQ:您認爲 IoT 開發的前景如何,有哪些發展趨勢?

Yorkie:其實這裏我們一直缺少提到一個我們再熟悉不過的詞,就是——Web,印象中的 Web 好像不是基於瀏覽器,就是在 WebView 上開發,不過在我現在看來,Web 對我們來說,早就脫離了瀏覽器(甚至是 GUI)的範疇了,它代表了一系列的標準。

因此我堅持認爲 Web 仍然會在 IoT 時代大放異彩,Web 中的一些冷門的 API 也會慢慢進入開發者的視野,如 VoiceXML、SpeechSynthesis、Bluetooth 等。而且現在 Node.js 與 Deno 都在積極擁抱 Web API,所以對於前端開發者,或者 Node.js 開發者來說,保持關注標準,或者通過參與 Node.js, Deno 或者 ShadowNode 來加入實現標準的行列中來。

嘉賓簡介:

Yorkie,Rokid 研發工程師,開源愛好者,Node.js Collaborator、ShadowNode 作者,目前主攻:Node.js 在 AIoT 領域的應用, 並負責 YodaOS 的社區推廣工作。五年 JavaScript 開發經驗,曾就職於:SeedMail、Pixbi、阿里巴巴,目前就職於 Rokid 基礎平臺研發中心,主要工作方向爲基於 JavaScript 的物聯網操作系統。近年來參與並負責 YodaOS 項目,將 IoT 和 AI 能力開放給 Node.js 社區,並實現了 Node.js 在 IoT 場景的產品級落地。同時也是 Node.js Collaborator、ShadowNode 和 TensorFlow-Node.js 作者,開源發燒友,目前給60個開源項目貢獻過代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章