來源 | HaaS技術社群
簡介
輕應用:可運作在輕量級嵌入式裝置上的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 # 全局配置
開發流程
- 編寫輕應用代碼
- 一鍵 熱更新
輕應用 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()
輕應用啟動時的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"
}
完整配置如下:
在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
示例
{
"io": {
"D3": {
"type": "GPIO",
"port": 22,
"dir": "output",
"pull": "pullup"
},
"D4": {
"type": "GPIO",
"port": 23,
"dir": "irq",
"pull": "pullup",
"intMode": "rising"
}
},
"debugLevel": "DEBUG"
}
UART
{
"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
{
"io": {
"I2C0":{
"type":"I2C",
"port":0,
"mode":"master",
"addrWidth":7,
"devAddr":27,
"freq":100000
}
},
"debugLevel": "DEBUG"
}
SPI
{
"io": {
"SPI1":{
"type":"SPI",
"port":1,
"mode":"master",
"freq":3250000
}
},
"debugLevel": "DEBUG"
}
ADC
{
"io": {
"voltage": {
"type": "ADC",
"port": 1,
"sampling": 12000000
}
},
"debugLevel": "DEBUG"
}
DAC
{
"io": {
"DAC1": {
"type": "DAC",
"port": 1
}
},
"debugLevel": "DEBUG"
}
PWM
{
"io": {
"PWM1": {
"type": "PWM",
"port": 1
}
},
"debugLevel": "DEBUG"
}
TIMER
{
"io": {
"TIMER1": {
"type": "TIMER",
"port": 1
}
},
"debugLevel": "DEBUG"
}
debugLevel
配置調試日志等級,分為如下幾個等級,預設為ERROR
repl(互動式解析器)
配置互動式解析器開關,預設打開。
{
"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如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号
更多技術與解決方案介紹,請通路阿裡雲AIoT首頁
https://iot.aliyun.com/