天天看點

輕應用介紹 - 用JavaScript進行嵌入式開發

來源 | HaaS技術社群

簡介

輕應用:可運作在輕量級嵌入式裝置上的JavaScript應用(左圖)

輕應用架構:封裝了JavaScript引擎和API接口,用于支援輕應用開發的軟體架構(右圖)

輕應用介紹 - 用JavaScript進行嵌入式開發

特點

  • 輕巧:基于事件驅動的JavaScript輕應用短小精悍,免編譯、免燒錄
  • 快速:結合阿裡雲物聯網平台,一鍵完成應用代碼熱更新
  • 簡單:JavaScript API 簡潔易懂,大幅降低IoT嵌入式裝置應用開發門檻
  • 相容:輕松移植JavaScript生态軟體包,與各類雲端業務渾然一體

運作原理

輕應用介紹 - 用JavaScript進行嵌入式開發

豐富的元件支援

基礎元件

  • 檔案系統 FS
  • 系統資訊 SYS
  • 鍵值對存儲 KV
  • 電源管理 LPM
  • 硬體I/O UART/GPIO/I2C/SPI
  • 模數/數模轉換 ADC/DAC
  • 脈寬調制 PWM
  • 定時器 TIMER
  • 實時時鐘 RTC
  • 看門狗 WDG
  • 網絡協定 UDP/TCP/HTTP/MQTT

進階元件

  • 物聯網平台 連接配接元件
  • 支付元件
  • 語音元件
  • 傳感器服務元件
  • 定位服務元件
  • 外設驅動庫
  • 編碼電機/步進電機/伺服電機/繼電器
  • 麥克風/語音錄放子產品/揚聲器
  • PS2搖杆/電容觸摸/按鍵
  • TFT彩屏/數位管/三色燈
  • 加速度計/陀螺儀/電子羅盤/氣壓計/磁力計
  • 溫濕度/顔色/光照強度
  • 更多

檔案結構

一個最精簡的輕應用包由最少兩個檔案組成,必須放在項目檔案夾的根目錄

app/
├── app.js        # 業務邏輯入口
└── app.json      # 全局配置           

開發流程

  1. 編寫輕應用代碼
  2. 一鍵 熱更新
輕應用介紹 - 用JavaScript進行嵌入式開發

輕應用 vs Native C/C++應用

輕應用介紹 - 用JavaScript進行嵌入式開發

app.js - 輕應用入口檔案

示例代碼

App({
  onLaunch: function() {
    // 第一次打開
    console.log('app onLaunch');
  },
  onError: function() {
    // 出現錯誤
    console.log('app onError');
  },
  onExit: function() {
    // 退出輕應用
    console.log('app onExit');
  }
});           

輕應用入口

App(Object options)

App() 用于注冊輕應用,接受一個 Object 作為屬性,用來配置輕應用的生命周期等。 App() 必須在 app.js 中調用,必須調用且隻能調用一次。

其中options屬性有:

輕應用介紹 - 用JavaScript進行嵌入式開發

生命周期

onLaunch()

輕應用啟動時的hook函數。

onError()

輕應用出現錯誤的hook函數。

onExit()

輕應用退出時的hook函數。

app.json - 全局配置檔案

app.json 用于對輕應用進行全局配置,設定頁面檔案的路徑、硬體I/O口的配置等。

以下是一個基本配置示例:

{
  "version": "0.0.1",
  "io": {
    "D1": {
      "type": "GPIO",
      "port": 31,
      "dir": "output",
      "pull": "pullup"
    },
    "D2": {
      "type": "GPIO",
      "port": 32,
      "dir": "output",
      "pull": "pullup"
    },
    "D3": {
      "type": "GPIO",
      "port": 33,
      "dir": "output",
      "pull": "pullup"
    }
  },
  "debugLevel": "DEBUG",
  "repl": "enable"
}           

完整配置如下:

輕應用介紹 - 用JavaScript進行嵌入式開發

在JS應用代碼中,通過 appConfig 可以擷取到 app.json 中的内容。

version 配置項

輕應用版本号。

io 配置項

不同的模組/晶片,各個端口和管腳的功能映射可能是不一樣的。

IoT輕應用的配置檔案 app.json 中,可将硬體(晶片)的實體端口映射成為統一的應用層邏輯端口。

這樣映射的好處是在替換不同的硬體或者晶片時,隻需要替換 app.json 而不用修改應用程式或裝置程式,進而便于應用的跨平台運作。

IO配置項中有 typeport 等硬體描述概念,對于每一款硬體(通常是晶片/模組/開發闆)該配置檔案均可能不同。

文法描述格式定義如下:

{
  "io": {
   "D1":{
      "type":"GPIO",
      "port":12,
      "dir":"output",
      "pull":"pullup"
    },
    "I2C0":{
      "type":"I2C",
      "port":0,
      "mode":"master",
      "addrWidth":7,
      "devAddr":270,
      "freq":100000
    }
  },
  "debugLevel": "DEBUG"
}           

解釋:

  • D1I2C0:定義對象,後面大括号裡面則描述了該對象的類型。 定義後可以在 JS 中直接使用。
  • type: 描述了該對象的類型,可以是IoT輕應用支援的硬體擴充類型,如 GPIO,I2C,ADC 等。
  • port:描述了該對象的端口,這裡需要根據實際硬體連接配接及晶片的PIN 腳映射關系來填寫。
  • dirpull: 是 GPIO 類型特有的,用于描述 GPIO 輸出輸出及上拉下拉,其他如 ADC 類型則有 sampling 采樣頻率這種類型描述。

外設 type 說明

io配置項的 type 用于描述該對象是什麼硬體端口類型,而每一種type也擁有不同的屬性字段,如 GPIO 與 ADC 的屬性字段是不一樣的。

GPIO

輕應用介紹 - 用JavaScript進行嵌入式開發

示例

{
  "io": {
    "D3": {
        "type": "GPIO", 
        "port": 22,
        "dir": "output",
        "pull": "pullup"
    },
    "D4": {
        "type": "GPIO",
        "port": 23,
        "dir": "irq",
        "pull": "pullup",
        "intMode": "rising"
    }
  },
  "debugLevel": "DEBUG"
}           

UART

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "UART1":{
      "type":"UART",
      "port":1,
      "dataWidth":3,
      "baudRate":9600,
      "stopBits":1,
      "flowControl":"disable",
      "parity":"none"
    },
    "UART2":{
      "type":"UART",
      "port":2,
      "dataWidth":3,
      "baudRate":115200,
      "stopBits":1,
      "flowControl":"disable",
      "parity":"none"
    }
  },
  "debugLevel": "DEBUG"
}           

I2C

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "I2C0":{
      "type":"I2C",
      "port":0,
      "mode":"master",
      "addrWidth":7,
      "devAddr":27,
      "freq":100000
    }
  },
  "debugLevel": "DEBUG"
}           

SPI

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "SPI1":{
      "type":"SPI",
      "port":1,
      "mode":"master",
      "freq":3250000
    }
  },
  "debugLevel": "DEBUG"
}           

ADC

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "voltage": {
        "type": "ADC",
      "port": 1,
      "sampling": 12000000
    }
  },
  "debugLevel": "DEBUG"
}           

DAC

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "DAC1": {
      "type": "DAC",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}           

PWM

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "PWM1": {
      "type": "PWM",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}           

TIMER

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "io": {
    "TIMER1": {
        "type": "TIMER",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}           

debugLevel

配置調試日志等級,分為如下幾個等級,預設為ERROR

輕應用介紹 - 用JavaScript進行嵌入式開發

repl(互動式解析器)

配置互動式解析器開關,預設打開。

輕應用介紹 - 用JavaScript進行嵌入式開發
{
  "version": "1.0.0",
  "io": {
    "D1": {
      "type": "GPIO",
      "port": 31,
      "dir": "output",
      "pull": "pullup"
    }
  },
  "debugLevel": "DEBUG",
  "repl": "disable"
}           

至此,輕應用概覽、運作周期,詳細配置與操作就介紹完了。各位開發者們可以在HaaS開發闆上進行實際開發操作了。謝謝大家。

更多輕應用的詳細使用文檔請參考:

https://help.aliyun.com/document_detail/174810.html

如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号

輕應用介紹 - 用JavaScript進行嵌入式開發

更多技術與解決方案介紹,請通路阿裡雲AIoT首頁

https://iot.aliyun.com/

繼續閱讀