轻应用介绍 - 用JavaScript进行嵌入式开发
简介
轻应用:可运行在轻量级嵌入式设备上的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() | 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配置项中有
type
port等硬件描述概念,对于每一款硬件(通常是芯片/模组/开发板)该配置文件均可能不同。
语法描述格式定义如下:
{ "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" }
解释:
-
D1
I2C0
:定义对象,后面大括号里面则描述了该对象的类型。 定义后可以在 JS 中直接使用。 -
type
: 描述了该对象的类型,可以是IoT轻应用支持的硬件扩展类型,如 GPIO,I2C,ADC 等。 -
port
:描述了该对象的端口,这里需要根据实际硬件连接及芯片的PIN 脚映射关系来填写。 -
dir
pull
: 是 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开发板上进行实际开发操作了。谢谢大家
如需更多技术支持,可加入钉钉开发者群
- 如何在iOS和Android上选择一个JavaScript 引擎进行应用开发
- Qt Quick应用开发介绍 13 (JavaScript)
- phonegap 开发入门 PhoneGap官方网站上有详细的入门示例教程,这里,我针对使用PhoneGap进行Android移动应用的开发对其官网的Get Started进行一些介绍、补充。 Ste
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-类库介绍
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-类库介绍
- Qt Quick应用开发介绍 6-8(JavaScript_视觉化数据_组件和模块)
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- 基于嵌入式Linux进行Python应用开发
- 32位嵌入式处理器应用开发ABC
- CZTZ-JavaEE开源应用开发平台介绍
- 在Docker容器中进行Flask应用的开发
- CZTZ-JavaEE开源应用开发平台介绍之二(Webwork+spring+hbernate+acegi)
- android中的sqlit3数据库进行手机应用软件开发(自写的一个财务管理软件,这里主要讲收入录入模块)
- JavaScript 应用开发 #2:视图与模板
- android调用相应的应用市场进行评价功能开发
- FlexViewer开发应用相关介绍
- JavaScript使用DeviceOne开发实战(三)仿微信应用
- [置顶] Python + C/C++ 嵌入式编程(2):基于Code::Blocks进行环境配置和开发(入门版)
- 微型嵌入式GUI应用开发-Step1
- 如何用Delphi进行ArcObjects的应用开发