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

HaaS技術社群發表於2020-11-26

簡介

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

輕應用框架:封裝了JavaScript引擎和API介面,用於支援輕應用開發的軟體框架(右圖)

輕應用框架

特點

  • 輕巧:基於事件驅動的JavaScript輕應用短小精悍,免編譯、免燒錄

  • 快速:結合阿里雲物聯網平臺,一鍵完成應用程式碼熱更新

  • 簡單:JavaScript API 簡潔易懂,大幅降低IoT嵌入式裝置應用開發門檻

  • 相容:輕鬆移植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. 一鍵熱更新

開發流程

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

對比

 

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屬性有:

屬性型別描述觸發時機
onLaunch()Function生命週期回撥:監聽輕應用初始化當輕應用初始化後觸發,全域性只觸發一次
onError()Function監聽輕應用錯誤當輕應用發生js錯誤時觸發
onExit()Function生命週期回撥:監聽輕應用退出當輕應用退出後觸發,全域性只觸發一次

 

生命週期

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"
}

完整配置如下:

配置項

型別

是否必填

描述

version

String

IoT輕應用版本號

io

Object

硬體介面配置

debugLevel

String

設定日誌等級,預設為ERROR

repl

String

設定repl開關,預設開啟設定為enable,關閉設定為disable

在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

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,埠值跟硬體介面有一一對應關係

dir

String

output

配置引腳方向,設定為輸出模式(預設)

input

配置引腳方向,設定為輸入模式

irq

配置引腳方向,設定為為中斷模式

analog

配置引腳方向,設定為模擬 IO 模式

pull

String

pulldown

配置引腳電阻,設定為上拉模式(預設)

pullup

配置引腳電阻,設定為下拉模式

opendrain

配置引腳電阻,設定為開漏模式

intMode

String

rising

配置引腳中斷模式,設定為上升沿觸發

falling

配置引腳中斷模式,設定為下降沿觸發

both

配置引腳中斷模式,設定為邊沿觸發(預設)

 

示例

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

UART

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

 

Number

1

配置埠值,這裡跟晶片 datasheet上 的埠對應

dataWidth

Number

5/6/7/8

串列埠資料寬度值,預設為 8(bits)

baudRate

Number

9600、115200等

串列埠波特率,預設為 115200

stopBits

Number

1/2

串列埠停止位,預設為 1

flowControl

String

disable

流控設定,預設 disable

cts

rts

rtscts

parity

String

none

奇偶校驗設定,預設 none

odd

even

 

示例

{
  "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

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

addrWidth

Number

7 或 10

配置 I2C 匯流排地址寬度,預設 7

freq

Number

100000、400000等

配置 I2C 匯流排頻率,預設 300000

mode

String

master 或 slave

配置 I2C 匯流排主從模式,預設 master

devAddr

Number

224等

 

配置 I2C 從裝置地址,預設 224

 

示例

{
  "io": {
    "I2C0":{
      "type":"I2C",
      "port":0,
      "mode":"master",
      "addrWidth":7,
      "devAddr":27,
      "freq":100000
    }
  },
  "debugLevel": "DEBUG"
}

SPI

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

 

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

mode

String

master 或 slave

配置 SPI 匯流排模式,預設 master

freq

Number

3250000、6500000等

配置 SPI 匯流排頻率

 

示例

{
  "io": {
    "SPI1":{
      "type":"SPI",
      "port":1,
      "mode":"master",
      "freq":3250000
    }
  },
  "debugLevel": "DEBUG"
}

ADC

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

sampling

Number

12000000

配置 ADC 取樣率

 

示例

{
  "io": {
    "voltage": {
        "type": "ADC",
      "port": 1,
      "sampling": 12000000
    }
  },
  "debugLevel": "DEBUG"
}

DAC

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

 

示例

{
  "io": {
    "DAC1": {
      "type": "DAC",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}

PWM

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

 

示例

{
  "io": {
    "PWM1": {
      "type": "PWM",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}

TIMER

屬性欄位

資料型別

屬性值

是否必須

欄位說明

port

Number

1

配置埠值,這裡跟晶片 datasheet 上的埠對應

 

示例

{
  "io": {
    "TIMER1": {
        "type": "TIMER",
      "port": 1
    }
  },
  "debugLevel": "DEBUG"
}

debugLevel

配置除錯日誌等級,分為如下幾個等級,預設為ERROR

 

等級

說明

DEBUG

顯示debug級別的日誌

INFO

顯示info級別的日誌

WARN

顯示warning級別的日誌

ERROR

顯示error級別的日誌

FATAL

顯示fatal級別的日誌

 

repl(互動式解析器)

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

說明

enable

開啟repl功能

disable

關閉repl功能

 

示例

{
  "version": "1.0.0",
  "io": {
    "D1": {
      "type": "GPIO",
      "port": 31,
      "dir": "output",
      "pull": "pullup"
    }
  },
  "debugLevel": "DEBUG",
  "repl": "disable"
}

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

相關文章