1. 程式人生 > >遊歷 JavaScript IoT 應用開發平臺

遊歷 JavaScript IoT 應用開發平臺

物聯網(Internet of Things,簡稱IoT)時代的腳步聲已經越來越響亮,每個程式設計師都希望跟上時代的步伐,不為時代浪潮所淘汰。面對IoT這個紛爭初起的領域,程式設計師們該何去何從?本文將帶領諸位進行一次IoT應用開發平臺的遊歷之旅,幫助大家瞭解該領域當今的發展狀態,尤其是基於JavaScript的IoT應用開發平臺,為各位搭車IoT奠定一些基礎。

開啟行程之前,我們先明確討論範圍,在行業裡,談到IoT開發平臺,有人說的是雲,如各大雲廠商;有人說的是硬體端,如各家硬體廠商;在這裡我們將討論是,硬體端的開發平臺,對於大多數軟體開發人員而言,這是一個更加陌生的領域。

IoT應用開發平臺簡介

在IoT應用開發領域中,大家熟知的開發平臺主要有如下幾類:

  • 嵌入式作業系統,包括VxWorks、FreeRTOS、LiteOS等;
  • 極客硬體平臺,包括樹莓派、Arduino等;
  • JavaScript IoT應用開發平臺,包括Ruff、Tessel、JerryScript、Johnny-Five等。

嵌入式作業系統,從功能的角度上來說,能夠滿足目前的絕大多數需求。但是:

  • 其入門門檻極高,開發者想要成為優秀的嵌入式開發工程師,需要學習大量軟硬體知識。相較於軟體行業,嵌入式領域的人才數量受到了限制。
  • 嵌入式領域在開發方法上已經大幅度落後於整個行業的發展。敏捷軟體開發方法以及精益創業的理念,受到工具所限,在嵌入式領域極少得到應用,所以該領域在工程方法上發展緩慢。
  • 這些作業系統的程式設計概念通常屬於專用領域,所以知識很難在行業中共享,開發者在行業中流動也相對困難,造成的結果是,嵌入式領域對於現代軟體開發理念的理解也整體上落後於軟體行業。

極客硬體平臺,其初衷是降低開發門檻,讓更多開發者得以進入到硬體開發領域中。但是:

  • 它只是在操作方面的入門難度上在努力,而開發真正困難的部分在程式設計概念。對於大多數軟體開發者而言,難點在於硬體中的程式設計概念。各種各樣的介面及引數,這是軟體開發者難於理解和掌握的。
  • 更關鍵的因素是,這些平臺只解決了原型開發的問題。開發者即便能夠通過它實現了一個產品原型,也很難將它用到真正的產品中。應用到產品中,往往要重新設計硬體,這些平臺的優勢就蕩然無存了。

二者最本質的複雜度在於其程式設計模型,對於軟體開發者來說,GPIO、I2C之類硬體介面完全是另一種語言,除了要了解介面的程式設計方法,還要針對每個硬體,閱讀其資料手冊,瞭解引數細節。

目前為止,諸位會想,IoT行業對軟體工程師簡直猶如另一個世界,一點都不友好。是的,很多人都是這麼想的,於是,有人想用更高階的語言改變這個世界,這其中最為活躍的便是JavaScript社群。

JavaScript IoT應用開發平臺

JavaScript IoT應用開發平臺,其建設初衷是讓開發者能夠用JavaScript開發IoT應用,一方面可以更好地構建抽象,另一方面,可以將比較現代的開發方式引入到硬體研發中。JavaScript IoT應用開發平臺目前主要分為幾大類:

  • 在硬體上執行JavaScript,如JerryScript、Espruino等;
  • 提供硬體抽象能力,比如Tessel、Johnny-Five、Cylon.js等;
  • 面向生產的能力,如Ruff。

在硬體上執行JavaScript的平臺

該類平臺主要解決的問題是讓硬體平臺具有執行JavaScript程式的能力,主要是在資源受限的硬體上,比如MCU(Microcontroller Unit,微控制器,又稱微控制器),你可以把MCU理解成記憶體很小的晶片,時至今日,談及微控制器,記憶體通常以K為單位。

Espruino

網站:https://www.espruino.com

Espruino是將JavaScript與硬體開發連線起來的先驅,其設計目標就是能夠在微控制器上執行 JavaScript。除了提供引擎之外,Espruino還提供了一些訪問底層裝置的程式庫,下面是一段程式碼示例:

function toggle() {
   on = !on;
   digitalWrite(LED1, on);
   digitalWrite(LED2, !on);
}

其中,digitalWrite是Espruino提供的方法。由於出現的比較早,其程式與今天行業裡的主流程式設計風格有一些差異,偏向於傳統的C程式碼風格。

從架構上說,Espruino做得也差強人意,它將直譯器、程式庫、底層系統混在了一起,移植起來有一定難度。

JerryScript

網站:http://jerryscript.net

JerryScript是三星打造的一款JavaScript引擎,它可以執行在64K的MCU上,其相對比較年輕,對於JavaScript標準支援得比較好,能夠完整支援ECMAScript 5.1。JerryScript只是一個JavaScript引擎,而真正提供裝置訪問能力是IoT.js。

IoT.js

網站:http://iotjs.net/

IoT.js的本意是打造一個類似於Node.js的執行時,所以,它提供Buffer、net、timer等一些標準模組。當然,最主要的是它提供的裝置訪問能力,下面是一段示例程式碼:

var i2c = require('i2c');
var wire = new i2c(0x23, {device: '/dev/i2c-1'});

wire.scan(function(err, data) {
  ...
});

這段程式碼是一段訪問I2C介面的程式碼,如果你不瞭解硬體介面,這段程式碼理解起來還是有些難度的。但不難看出,其程式碼風格已經接近於今天行業裡的主流程式設計風格。

僅僅提供在硬體上執行的JavaScript能力是不夠的,嚴格來說,其暴露的依舊是底層的程式設計介面,面臨與傳統硬體開發所面對的問題一致,即程式設計模型無法讓軟體開發者很好的理解。所以,提供硬體抽象,成為了IoT應用開發平臺另一個重要的探索方向。

提供硬體抽象的JavaScript IoT應用開發平臺

該類平臺提供軟體抽象能力,讓更多的軟體開發人員使用他們熟悉的語言進入到在IoT領域。有了硬體抽象,軟體開發者面對不再是GPIO、I2C之類的底層介面,而變成了具有開關功能的LED、能夠監測按鍵按下鬆開的按鈕。這是一個極大的進步,硬體世界的大門對軟體開發人員打開了。

Tessel

網站:https://tessel.io

Tessel是一個穩定的IoT和機器人開發平臺,利用Node.js所有的程式庫建立有用的裝置。下面是一段示例程式碼,定期將聲級上報到一個地方。

var tessel = require('tessel');
var ambientlib = require('ambient-attx4');
var WebSocket = require('ws');

var ambient = ambientlib.use(tessel.port['A']);

var ws = new WebSocket('ws://awesome-app.com/ambient');
ws.on('open', function () {
  setInterval(function () {
    ambient.getSoundLevel(function(err, sdata) {
      if (err) throw err;
      sdata.pipe(ws);
    })
  }, 500);
});

Tessel自身除了出品軟體,也提供硬體開發板,不過,Tessel程式也只能運行於Tessel開發板上。

Johnny-Five

網站:http://johnny-five.io

Johnny-Five是一個JavaScript機器人和IoT平臺,由Bocoup公司於2012年釋出。下面這段示例程式碼,讓LED定期閃爍:

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var led = new five.Led(13);
  led.blink(500);
});

Johnny-Five不生產開發板,它的程式可以運行於多款開發板上,其預設支援的是Ardunio,如果需要其他開發板,可以在Board初始化的時候指定,比如下面這段程式碼就使用了Edison開發板。

var Edison = require("edison-io");
var board = new five.Board({
  io: new Edison()
});

Cylon.js

網站:https://cylonjs.com

Cylon.js是一個為機器人、物理計算以及IoT而設計的JavaScript框架,其目的是讓控制機器人和裝置變得容易。下面這段示例程式碼讓LED每秒閃爍一次:

var Cylon = require("cylon");

Cylon.robot({
  connections: {
    arduino: { adaptor: 'firmata', port: '/dev/ttyACM0' }
  },

  devices: {
    led: { driver: 'led', pin: 13 }
  },

  work: function(my) {
    every((1).second(), function() {
      my.led.toggle();
    });
  }
}).start();

與Johnny-Five類似,Cylon.js也是依賴於別人的開發板。

Tessel、Johnny-Five、Cylon.js三者有著類似的努力方向,即提供軟體抽象,這是很好的做法,也讓許多軟體開發人員看到了IoT的曙光。但是,其基礎上的一些問題,決定了他們只能是作為開發者的玩具:

  • 在硬體上執行的能力,這幾個平臺實際上都是在電腦上執行,然後傳送命令控制硬體,也就是用它們開發的應用,需要一個控制端。
  • 更重要的的是,其執行JavaScript的基礎是Node.js,這是一種用於電腦上的JavaScript執行時,它無法運行於一個資源受限的硬體上,而真實環境中,資源受限硬體才是行業主流。這意味著,這些框架即便未來希望做改造,難度也是很大的。
  • 這些平臺雖然在程式碼級別提供了抽象,但仍然有許多硬體配置的內容,比如pin、port之類,對於軟體開發人員而言,理解起來還是有門檻的。

由此可見,這些平臺的現狀只是解決了程式設計介面的抽象,並沒有真正的實現軟硬體的隔離。所以,有平臺開始了進一步的探索,提供面向生產的能力。

面向生產的JavaScript IoT應用開發平臺

該類平臺可以理解成將前面兩種型別的能力綜合在一起,並進一步改進:既能在資源受限的硬體上執行,又提供在硬體抽象,將硬體相關內容進一步抽象,將軟硬體進一步分離。

Ruff

網站:https://ruff.io

Ruff是一個支援JavaScript應用開發的物聯網作業系統,其目標是打造一個IoT版本的Android。下面是一段Ruff示例程式碼,按下按鍵,點亮LED,鬆開之後,燈熄滅。

'use strict';

$.ready(function(error) {
    if (error) {
        console.log(error);
        return;
    }

    $('#button').on('push', function () {
        $('#led-r').turnOn();
    });

    $('#button').on('release', function () {
        $('#led-r').turnOff();
    });
});

$.end(function() {
    $('#led-r').turnOff();
});

這段程式碼已經沒有任何與硬體配置相關的程式碼,完全是應用的邏輯。即只要提供不同的硬體配置,程式碼就可以執行在不同的硬體上。

事實上,Ruff也確實做到了這點,它既可以支援像樹莓派這樣能夠執行Linux系統的硬體上,也支援像TM4C1924這樣的MCU。做到跨硬體,需要從架構設計上有很好的支援,這也是Ruff的一大優勢。

從Ruff提供的特性上看,其企圖不止於將引入抽象,更試圖將現代軟體開發理念帶入到IoT應用研發之中:

  • 徹底地分離硬體、系統與應用,使三者可以用不同的節奏釋出,讓IoT應用的迭代開發成為可能;
  • 設計測試框架,讓開發者可以在開發機上測試應用邏輯,無需部署到真實硬體,大幅度節省了開發除錯的時間,從而降低了開發成本;
  • 採用軟體包的方式管理各種模組,尤其是驅動,使得模組得以在共享,知識得以流動;
  • 採用命令列的方式進行對相關內容進行管理,比如,板卡、外設驅動、系統升級等等,便於與第三方工具整合。

Ruff正試圖建立一個全新的IoT應用開發平臺,所以,它支援的硬體數量相對前期發展時間比較長的平臺來說,還是相當有限的。但其架構展現的擴充套件性是足夠的,對於開發者而言入門門檻也足夠低,如果有更多開發者進入,其未來發展是值得期待的。

衡量IoT應用開發平臺

從前面一系列介紹,我們已經瞭解了許多IoT應用開發平臺,尤其是基於JavaScript的IoT應用開發平臺,作為開發者,我們該如何選擇呢?我們不妨梳理出一個IoT應用平臺的衡量標準,然後,根據實際場景自行選擇。

採用JavaScript語言

傳統嵌入式開發採用C/C++作為主流的程式設計語言,對於現代軟體開發而言,這種做法存在一些問題:

  • 缺少自動化記憶體管理能力,普通程式設計師經常會犯一些低階錯誤,造成程式崩潰;
  • 缺少標準庫,開發者浪費了大量的時間,在構建基礎設施;
  • 缺少可移植標準,每次面對不同的硬體,都需要花費大量時間,讓程式碼在新平臺上執行起來;
  • 缺少包管理能力,不同的程式設計師會反覆構建類似的程式碼,造成行業的浪費;
  • 對於測試缺少內建的支援,測試的編譯執行會隨著程式碼規模而不斷增長,沒有小步開發的基礎。

JavaScript作為行業裡唯一一門全棧式開發語言,擁有著廣泛的開發人員基礎,隨著Node.js的興起,配套的基礎設施也得到長足的進步,完全可以稱之為一門合格的現代開發語言:

  • 支援GC,開發者無需顧忌記憶體;
  • 支援面向物件和函數語言程式設計等多種現代程式設計正規化,開發者可以根據需要自行選擇;
  • 程式可移植,底層差異由執行時遮蔽;
  • NPM軟體倉庫,幾十萬個軟體模組,開發者按需取用,無需重複造輪子;
  • 有多種測試框架,開發者可以很容易在開發環節中進行測試。

作為其他高階語言的開發者,你或許會有疑問,其他語言這些特性似乎也可以支援。還有如下幾點讓JavaScript脫穎而出:

  • 執行時,如Python、Java之類的語言,很少有能對MCU進行支援的執行時,這使得它們頂多能做到原型級別開發,而無法深入。
  • 流行程度,類似於Lua這種本身執行時很小的語言在嵌入式環境中也有應用,也確實有一些專案做到了,比如NodeMCU,但Lua目前屬小眾語言,其前景取決於行業發展狀況。

設計硬體抽象

傳統的嵌入式開發平臺存在極高的門檻,一個非常重要的原因在於,其系統及應用是一體的,任何一個開發者都需要學習很多的知識,才能成為一個合格的嵌入式開發者。

引入硬體抽象,將實現系統與應用的分離,應用開發者會像使用普通的程式庫一樣操作硬體,而無需關注底層實現細節,這樣可以更好地把注意力放在應用上。

硬體抽象也分為不同的級別:

  • 程式設計介面,讓開發者使用軟體抽象,遮蔽底層硬體介面,這是很多提供硬體抽象的平臺幾乎都能做到的。
  • 硬體配置,將硬體配置進行隔離,讓開發者不必關注配置細節,面對做不到這點的平臺,開發者還是要了解很多細節。

總的來說,硬體抽象也大幅度降低了門檻,軟體開發者可以從應用的角度理解IoT應用,無需學習底層細節,從而讓更多開發者得以進入到IoT研發領域中。從人數上說,軟體開發者的數量遠大於專攻硬體研發的開發者。降低門檻,將軟體開發者引入到一個全新領域所帶來的變化,我們已經在移動開發領域看過了一遍。有了好的IoT應用開發平臺,相信同樣的戲碼會在IoT領域重演。

面向生產

如果只是構建一個原型,其難度與構建一個真實的應用不可同日而語。軟體開發者理解這一點並不困難。在IoT領域,問題是一樣的。真實的IoT應用,會面對功耗、價格、效能等諸多問題,這也是在今天,計算資源極大豐富的情況下,在IoT領域依然對資源斤斤計較的原因,資源受限的硬體才會大行其道。無論如何,能夠執行在資源受限的硬體上,是成為一個真正的IoT應用開發平臺的前提。

在傳統的嵌入式開發中,應用與硬體是緊密耦合在一起的,如果能夠實現應用與硬體配置相分離,將帶來極大的改變:

  • 應用開發者無需關注硬體如何配置,可以將更多的將注意力放在應用邏輯本身;
  • 硬體具體的配置方式可以在具體的部署時實施。

這樣做還會帶來一些額外的好處:

  • 應用與硬體配置分離,讓應用的移植成為可能。應用在開發時可以不知道具體實施的硬體,只要在具體交付時,將應用部署在硬體上即可;
  • 二者的分離實現了研發與生產相分離,雙方可以各自獨立發展,由此可以實現更好地分工;
  • 分離讓研發和生產可以採用不同的硬體,這會對研發流程帶來一些改變,在研發期採用既有硬體進行測試,在完成需求驗證之後,再根據情況生產實際的硬體;
  • 硬體、系統與應用將成為三個獨立的概念,可以用不同的節奏釋出,迭代開發成為可能。

總結

現如今,IoT行業主流的開發方式依舊是採用傳統的C/C++進行嵌入式開發。但從行業發展的狀況不難看出,這種方式已經阻礙了更多人才的進入,更進一步阻礙IoT的普及,工具的升級已經迫在眉睫。新近的JavaScript IoT應用開發平臺已經逐漸展現出其未來的發展前景,但是,所有的JavaScript IoT應用開發平臺都面臨著一個問題:缺乏成熟的行業解決方案。從時間上來說,它們都處於早期,被行業選擇和接收需要一個過程。但IoT要發展,工具要升級,JavaScript IoT應用平臺是目前最有力的競爭者。

基於此,我們共同遊歷了當今的IoT應用開發平臺,尤其是基於JavaScript的IoT應用開發平臺。並瞭解了IoT應用平臺的衡量標準,希望這些內容在大家進入IoT領域時,會有所幫助。

讓我們共同迎接這曙光乍現的IoT時代吧!

當移動紅利時代結束,人才需求接近飽和的同時,感測技術、雲端計算、大資料、人工智慧的日益成熟,並與智慧家居、智慧城市相融合,將我們帶入了真正智慧化的物聯網時代。那麼,作為開發者的我們,又該如何順勢而為?為此,CSDN 從易於上手、高效的“物聯網全棧開發”著手,集結一線專家,幫助開發者快速掌握物聯網全棧開發之道。其中鄭曄老師從 IoT 平臺的演化開始,對比常見的 IoT 應用開發平臺,並結合例項進行實踐檢驗。

視訊直播回顧:http://edu.csdn.net/huiyiCourse/detail/407

PPT 下載:http://download.csdn.net/meeting/speech_preview/449


作者:鄭曄,Ruff CTO,Oracle Duke 選擇獎獲獎作品 Moco 創始人,目前投身於硬體開發領域,致力於簡化硬體應用的開發方式。對敏捷軟體開發、軟體設計、領域特定語言等方面有著深刻理解。
責編:屠敏,歡迎技術投稿、約稿、給文章糾錯,請傳送郵件至[email protected]
宣告:本文為《程式設計師》原創文章,未經允許不得轉載,更多精彩文章請訂閱2017 年《程式設計師》