郑晔@Ruff
端上IoT平台,非云上IoT平台
一、IoT平台简介
1. 平台
分类 | 项目 |
---|---|
嵌入式操作系统 | VxWorks、FreeRTOS、LiteOS、mbed |
极客硬件平台 | 树莓派、Arduino |
JavaScript IoT 开发平台 | Ruff、Tessel、JerryScript、Johnny-Five |
2. 嵌入式操作系统的困境
- 入门门槛 门槛极高,开发者需要学习大量软硬件相关的知识,因此,嵌入式领域的人才数量受到了限制
- 工程方法 大幅度落后于行业水平,敏捷软件开发方法以及精益创业的理念,在嵌入式领域极少得到应用,该领域在工程方法上发展缓慢
- 知识共享 编程概念属于专用领域,知识很难在行业中共享,开发者在行业中流动也相对困难,嵌入式领域对于现代软件开发理念的理解也整体上落后于软件行业
原型机投入生产比较困难
二、JavaScript IoT应用开发平台
分类 | 项目 |
---|---|
在硬件上运行 JavaScript | JerryScript、Espruino 等 |
面向应用的硬件抽象 | Tessel、Johnny-Five、Cylon.js 等 |
提供生产支持 | Ruff |
1. 在硬件上运行JavaScript
espruino
- 网站 https://www.espruino.com/
- 目标 在单片机上运行 JavaScript
- 代码风格 类似于 C
- 其它 解释器、操作系统、程序库混为一谈
示例:灯不断亮灭
function toggle() {
on = !on;
digitalWrite(LED1, on);
digitalWrite(LED2, !on);
}
espruino本身不支持的硬件很难移植上去。
jerryscript(三星)
- JerryScript 是三星打造的一款 JavaScript 引擎,它可以运行在 64K 的 MCU 上
- 对于 JavaScript 标准支持得比较好
- 完整支持 ECMAScript 5.1
- 只是一个独立的JavaScript解释器
- -
IoT.js
- 网站 http://iotjs.net/
- 目标 基于JerryScript 的 Node.js
- 代码风格 符合今天主流的代码风格
- 模块 支持 Buffer、net、timer 等标准模块
一段IoT.js示例
var i2c = require('i2c');
var wire = new i2c(0x23, {device: '/dev/i2c-1'});
wire.scan(function(err, data) {
...
});
2. 面向应用的抽象
名称 | 项目网站 | 开发板 | JS 引擎 | 使用领域 |
---|---|---|---|---|
Tessel | https://tessel.io/ | 自己的开发板 | Node.js | IoT、机器人 |
Jonny-Five | http://johnny-five.io/ | 适配多种开发板 | Node.js | IoT、机器人 |
Cylon.js | https://cylonjs.com/ | 适配多种开发板 | Node.js | IoT、机器人、物理计算 |
在PC上运行Nodejs引擎。
Tessel
示例:
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);
});
通过getSoundLevel屏蔽了底层接口。
Jonny-Five
var five = require("johnny-five");
var board = new five.Board();
board.on("ready", function() {
var led = new five.Led(13);
led.blink(500);
});
Cylon.js
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();
3. Ruff
'use strict';
$.ready(function(error){
if(error){
console.log(error);
return;
}
$('#led-r').turnOn();
});
$.end(function(){
$('#led-r').turnOff();
});