15 Star 36 Fork 10

sudo / oneDevice

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
GPL-3.0

oneDevice.js

用NodeJS驱动硬件。

心塞塞的,device被占用了,只能叫onedevice了。这感觉。。。。。。🙄


这是什么?

这是一个旨在用NodeJS驱动硬件的驱动包。开箱即用、完善的文档、持续更新、友好的API。用树莓派打造自己的智能家居。

最近更新

v0.0.3 @ 2018-06-02 22:56

  • 使用RxJS,更抽象更简单易用的API

报告bug

后续主要更新

  • 增加更多型号硬件驱动
  • 更抽象的API,一句话完成条件监控、动作触发
  • 更容易阅读的文档

test文件夹下面有测试例子,这些都在我的Linux raspberrypi 4.4.34-v7+ Raspbian GNU/Linux 8.0 (jessie)下面测试通过。

必看

0. 树莓派需要先安装BCM2835
1. 该软件在树莓派3B (Raspbian GNU/Linux 8.0 jessie)上面开发、测试
2. 最新文档和代码请查看https://github.com/LanFly/Device
3. 在除树莓派之外的平台通过npm安装此软件包可能会安装失败
4. 该软件依赖很多第三方软件,并修改了其中的代码,感谢各位大佬的开源
5. 因个人时间有限,且硬件种类繁多,代码中可能有尚未测试到的bug,可以通过下面的联系方式反馈给我并寻求帮助
6. 我会持续集成其它种类的驱动,如有硬件没驱动的同学,可以反馈给我
7. i2c包的作者已经N年不更新了,里面有个bug,pull request也不处理。使用ssd1306的时候可能会有点问题,自己改一行代码就行了。

开始

可以引入所有的模块,也可以单独使用某一个模块。

  1. 引入所有模块
var Device = require('onedevice');
  1. 引入某一个模块
var XFS5152CE = require('onedevice/lib/device/xfs5152ce');

用法:

new Device(option);

option: Object

description: String

此设备的描述。默认值:String('this device has not description')

model: String

此设备的具体型号,如果配置了此选项,则根据型号返回对应的硬件驱动实例。如果device没有该型号的驱动,则返回null。

目前device集成的驱动型号有:

  • dht11、dht22、am2302: 温湿度传感器,支持这3个型号
  • xfs5152ce: 科大讯飞XFS5152CE文字转语音芯片
  • ssd1306: SSD1306为主控的OLED显示屏,最大分辨率支持 128*128
  • 更多型号后续会持续集成

interface: String

此通用设备的通信方式。该选项适用于创建一个自定义设备驱动,或者device没有集成的设备。例如STC89C52RC单片机使用串口跟树莓派通信,则你可以创建一个串口设备,让你能和单片机交换数据,然后自己扩展应用层的逻辑驱动。

对于大部分的传感器或模块,都使用了常见的通信协议,例如:i2c、uart、spi、one-wire。驱动这些设备相对来说简单,因为你无需关心这些协议的原理,只需要处理发送和接受数据。

device集成的科大讯飞驱动就是通过创建uart串口驱动,然后实现say,sleep,setVolume等函数的。

device目前集成的通信协议有:

  • i2c: 同步串行总线
  • serial: 串行数据总线,即常见的串口
  • udp: 通过网络使用udp协议交换数据的设备。例如常见的ESP8266 WiFi模块,可以通过WiFi无线传输数据。也可以使用有线。
  • 后续会持续集成1-wire、SPI等协议。

address: String || Int

此设备的物理接口地址或者I2C从机设备的逻辑地址。如果此设备是串口协议的设备,则此字段表示设备在主机上的物理接口地址。例如USB转串口设备,则它的地址可能是字符串/dev/ttyUSB0

如果此设备是使用I2C协议的设备,则它的值表示该I2C设备的逻辑地址。例如SSD1306模块,它的值可能是Int0x3C,一般用16进制表示,当然你喜欢也可以用10进制表示。

device: String

I2C设备在主机上的物理接口地址。I2C设备用2个地址来标识,第一个是物理接口地址,第二个是I2C从机的逻辑地址。为什么要2个地址?因为树莓派GPIO提供了2个I2C物理接口,device需要知道你的设备跟主机上的哪个接口相连。

它有下面2个可选值:

  1. String '/dev/i2c-0'
  2. String '/dev/i2c-1'

你可以使用i2cdetect工具来扫描接在总线上的所有I2C设备,并列出他们的逻辑地址。该工具需要先安装才能使用。

科大讯飞 XFS5152CE

xfs5152ce这款文字转语言芯片可以使用I2C、SPI、串口等方式通信,使用3.3V即可满足供电,我使用的是某宝上面的xfs5152ce模块,带3W功放,我使用5V电源比较稳定。

这里使用串口通信驱动模块,波特率一般为9600,波特率根据自己的情况设置。

var Device = require('onedevice');

var xfs5152ce = new Device({
    description: 'xfs5152ce module',
    model: 'xfs5152ce',
    baudRate: 9600,
    address: '/dev/ttyUSB0'
});

上面返回一个串口驱动的实例,address参数是串口的地址。为什么是串口驱动?因为我们用的是串口方式驱动芯片的。你需要等待串口打开成功才能使用芯片。

xfs5152ce.on('open', function(next){
    xfs5152ce.say('你好,科大讯飞!');
    next();
});

xfs5152ce.on('error', function(error, next){
    console.log(error);
    next();
});

最好在open回调事件中使用串口功能,在open事件触发后,你就可以发送任意长度的文本给芯片朗读。

say函数会自动维护朗读队列。如果当前的文本没有朗读完,再次调用say函数会放到队列中,朗读完后自动从队列中取出第一个朗读,直到队列中所有的都朗读完。

open,error,data事件都支持中间件,这跟express框架的洋葱模型是差不多的。next方法表示下一个中间件,它支持参数,表示更改传递给下一个中间件的数据,此更改只作用下一个中间件。请看下面例子。

// 假设串口返回的数据是 data === 1
xfs5152ce.on('data', function(data, next){
    console.log('md-1-start: ', data);
    next(data + 1);
    console.log('md-1-end: ', data);
}).on('data', function(data, next){
    console.log('md-2-start: ', data);
    next();
    console.log('md-2-end: ', data);
}).on('data', function(data, next){
    console.log('md-3-start: ', data);
    next();
    console.log('md-3-end: ', data);
});

上面的执行结果如下:

md-1-start: 1
md-2-start: 2
md-3-start: 1
md-3-end: 1
md-2-end: 2
md-1-end: 1

XFS5152CE驱动实例实现了以下函数:

function: say(text, imediately, callback)

@params {String} text: 必需。要朗读的文本。可以带上文本控制标记

@params {Boolean} imediately: 可选。是否立即朗读。如果为true,会中断当前正在朗读的指令。

@params {function} callback: 可选。发送朗读指令成功的回调。

尽快朗读文本。驱动实现了语音指令缓存,上位机可以连续的多次调用朗读函数,然后去处理其它任务。驱动会按照先后顺序,自动朗读完所有语音指令。如果imediately为true,则会停止正在朗读的所有文本,转而立即朗读text。

function: setVolume(volume)

@params {integer} volume: 设置朗读的音量。对正在朗读的文本无效。

设置朗读的音量。可选值为1到10之间的整数。包含1和10。1位最小音量,10为最大音量。默认音量为3。设置音量后仅对后面的语音指令有效,对正在朗读的文本不影响。后面优化成实时设置音量。

function: getVolume()

@return {integer}

返回朗读的音量。

function: sleep(callback)

@params {function} callback: 进入省电模式成功后的回调

让芯片进入省电模式。发送省电指令后,芯片立即停止当前所有指令,此时芯片的工作电流为5mA。

function: wakeup(callback)

@params {function} callback: 退出省电模式成功后的回调

让芯片恢复到待合成模式。进入待合成模式时,驱动会自动朗读当前未朗读的文本。

function: voiceLength()

@return {integer}

返回当前未朗读的语音合成指令数。每调用一次say函数,就会增加一个语音合成指令数量。

function: isBusy()

@return {boolean}

返回芯片是否正在朗读文本。

function: on(type, callback)

@params {string} type: 监听的事件类型,可以是data、open、error

@params {function} callback: 当事件触发时需要执行的函数

注册指定事件的回调,当事件发生时会执行回调函数。可以链式调用。采用和express相似的洋葱模型。

事件类型不同,callback回调的参数也不同:

data: function(data, next) data是接收到的数据。也可能是上一个中间件中调用next(data)传递过来的data

open: function(next)

error: function(error, next) error是发生错误时的信息。


DHT11、DHT22、AM2302系列设备

这些设备比较简单,使用单总线的方式,只需要一根数据线和树莓派相连。剩下2根是电源线,分别连接正极和负极。也可以不使用电源线,只使用一根数据线完成数据的读取、发送,并且从数据线上获取设备所需要的电源。具体请另行查阅单总线的寄生电路。

var dht11 = new Device({
    model: 'dht11',
    description: 'dht11 sensor',
    address: 4
});

address是传感器的数据线连接在树莓派GPIO的编号。采用BCM GPIO编号。

dht11.fetch(function(error, temperature, humidity){
    if (error) {
        console.log(error.message);
    }else{
        console.log('温度: ' + temperature + ' 湿度: ' + humidity);
    }
});

读取传感器数据比较简单。注意:DHT11采样周期是1s,建议连续读取数值至少间隔1s以上,否则可能会引起错误。DHT22采样周期2s,建议连续读取数值至少间隔2s以上。

dht系列传感器现在增加RxJS。使用observe可返回观察者对象。

// 观察dht11传感器的数值,间隔2秒观察一次
var observable = dht11.observe(2000);

observable是可订阅的,使用then订阅,订阅后返回subscription,表示进行中的执行。

var subscription = observable.then(function(value){
    // 读取传感器数值成功的订阅函数
    console.log(value);
    // 每隔2秒这个订阅函数会执行一次,因为在observe中我们指定了2秒
    // subscription可以使用dispose停止订阅,停止订阅后,这个订阅函数将不会再执行
    subscription.dispose();
}, function(error){
    // 读取传感器数值失败的订阅函数
    console.log(error);
    // 读取失败后会自动停止订阅
});

使用RxJS,我们可以轻松的组合各种条件操作符,这可以让我们的逻辑更直观。

// observe可以指定观察数据类型,t 表示温度,h 表示湿度,如果不传,则温度和湿度都观察

var subscription = dht11.observe(2000, 't').max(28).then(function(value){
    console.log('好热啊!当前温度是: ', value);
});

var subscription1 = dht11.observe(2000, 'h').min(20).then(function(value){
    console.log('好干燥啊!当前湿度是: ', value);
});

max、min 就是操作符。操作符可链式组合,并且有先后顺序,他们就像一节一节管道一样被依次连接。

max 表示大于(value > max),上面的结果就是当温度大于28的时候,将会执行订阅函数。

min 表示小于(value < min),结果是当湿度小于20的时候,将会执行订阅函数。

除此之外,还有其它的操作符。如 等于 when(condi)区间 between(left, right)。此外,observable还包含RxJS的所有可用操作符。


SSD1306 OLED显示屏

适合市面上常见的以SSD1306为主控的小型OLED显示屏,分辨率在128128以内。大于128128分辨率的未测试,底层驱动使用的是oled-ssd1306-i2cnpm包,它能驱动的都可以驱动。

var ssd1306 = new Device({
    description: 'ssd1306',
    width: 128,
    height: 64,
    address: 0x3c,
    device: '/dev/i2c-1'
});

width、height分别表示分辨率的宽和高。address是i2c的从机地址,这个因硬件设备有所不同,大家自己了解清楚。device是i2c设备接在树莓派上的接口地址,这个也是因人而异。对于SPI接口的OLED,目前还没有集成驱动,后续会加上。

现在,我要如何控制屏幕显示的内容?

1. 让显示屏显示内容,有3种方法,最简单的一种是直接显示一张PNG图片。
ssd1306.drawPNG('path/to/image.png', false, function(error){
    if (error) {
        console.log(error);
    }else{
        console.log('显示PNG图片完成');
    }
});

注意,只能为PNG图片。为达到最理想的显示效果,PNG图片的分辨率最好和OLED屏幕的分辨率一致。OLED是只有单色的,不支持彩色,所以显示的时候图片会自动转换为单色图片,然后再显示。有色值的像素点在屏幕上会被点亮,透明的像素点会被熄灭。

2. 图片是静态的,我想要由程序实时绘制屏幕该怎么办呢?这个也很简单,使用canvas就好了。
var Canvas = require('canvas');

var canvas = new Canvas(128, 64);
var ctx = canvas.getContext('2d');

ctx.fillStyle = '#FFF';
ctx.fillText("Hello world", 0, 0);
// 上面5行代码应该不需要解释吧。都是canvas操作
// 结果就是在canvas上会在左上角显示一行白色的'hello world'文字

// 然后把canvas的内容显示到屏幕上
ssd1306.drawCanvas(canvas);

这时你应该能在屏幕上看到'hello world'文字了。drawCanvas函数会把canvas上的像素点一一对应到屏幕上绘制(当然也支持只绘制指定部分的canvas)。所以,你的canvas显示什么,屏幕就会显示什么。通过程序不断的更新canvas,然后在合适的时机调用drawCanvas函数刷新屏幕,你就可以控制屏幕了。

使用canvas的好处不需要我解释了,学习成本低,完善的API文档,大量的教程,和各种强大的canvas库。

需要注意的是,为了达到最理想的显示效果,canvas的分辨率最好和屏幕的分辨率一致,并且使用单色绘制canvas,建议用#FFF。因为无论如何,你的OLED都是单色的屏幕,无法显示彩色。虽然有彩色的OLED,但目前还没集成驱动。后续会集成更大尺寸的彩色LCD、TFT屏幕驱动。这是个巨大的工程,希望有懂这方面的软硬件工程师协助我。

在node中使用canvas需要先安装。API和在浏览器HTML5中的canvas稍微有点区别。请自行查阅资料安装并使用。

3. 我不想安装node-canvas,同时又要程序实时绘制屏幕怎么办?也简单,使用内置的简易图形API绘制。

前面说了,这是基于oled-ssd1306-i2c封装的。它自身已经提供了一套简易的图形API用于操作屏幕。比如常见的绘制像素,直线,矩形,圆,文字等。使用这个的好处是不需要安装node-canvas,没有依赖。轻便、简单。怎么用?

它的所有API都挂载在驱动实例的oled属性上。例如:

ssd1306.oled.drawLine(1, 1, 128, 64, 1);

上面使用自带的API绘制一条从(1, 1) 到 (128, 64) 的直线。oled属性就是oled-ssd1306-i2c的实例。更多API请自行查阅它的文档。

目前node驱动SSD1306屏幕有个缺点,就是刷新率太低,在我的树莓派3B上最高也就10帧。使用Python能达到30帧流畅。如果使用C++,则可以很容易达到60帧。我正在努力尝试提高它的刷新率。

SSD1306 API:

function: drawCanvas(canvas, config)

@params {Canvas} canvas: 要绘制的node-canvas。

@params {Object} config: 可选。配置要绘制的canvas的区域。默认从左上角开始绘制和屏幕一样大的区域。它有下列几个属性:

{
    sx: 开始绘制的点的横坐标
    sy: 开始绘制的点的纵坐标
    sw: 要绘制的矩形的宽度
    sh: 要绘制的矩形的高度
}

复制canvas的像素,一一对应到屏幕上并显示。通过ctx.getImageData函数获取canvas的像素信息。绘制前,会处理掉canvas的彩色像素。建议使用#FFF颜色进行绘制。有颜色的像素会被点亮,其余会被关闭。

function: drawPNG(filename, dither, callback)

@params {string} filename: 要绘制的PNG图片路径

@params {boolean} dither: 可选。是否启用抖动算法处理图片像素,默认为false。

@params {function} callback: 绘制图片完成时的回调。如果绘制错误,回调函数通过参数传递error。成功时为null。

在屏幕上绘制PNG图片。为达到最理想的显示效果,PNG图片最好是单色的,背景透明。通过pngparsenpm包处理图片的像素信息。抖动算法使用的是floyd-steinbergnpm包。

function: showSystemInfo(second)

@params {Number} second: 刷新屏幕的间隔时间,单位秒。如果不传,或传0,则只显示一次。否则会自动每隔几秒刷新一次。

显示系统信息,在屏幕上显示CPU、内存的统计信息,以及IP地址、时间。如果指定了一个时间,则会自动每隔几秒刷新。

function: stopSystemInfo()

停止刷新系统信息


通用性设备API


UART串口设备

串口使用非常普遍,也非常简单。创建一个串口设备很容易。在树莓派上面使用串口最简单的方式就是某宝买一个USB转串口,例如常见的使用ch340芯片的STC下载器,只需要10块钱包邮,免驱,还自带3.3V和5V电源接口,非常方便。

var stc89c52rc = new Device({
    description: 'stc89c52rc',
    interface: 'serial',
    address: '/dev/ttyUSB0',
    baudRate: 9600
});

上面是使用USB转串口和单片机的串口引脚相连,单片机设置好波特率,树莓派和单片机之间就可以互相传输数据。串口是基于serialport这个非常受欢迎的npm包封装的。串口设备的serial属性是serialport的实例,该属性下面有所有它的方法和属性。可自行查阅它的文档。

串口驱动实例有下面这些方法:

function: on(type, callback)

请参考XFS5152CE部分API文档

function: write(data, callback)

@params {buffer || array} data: 要发送的数据。可以是buffer或者是array,当然也可以是字符串,以二进制流发送。

@params {function} callback: 发送数据成功后的回调。如果发送错误,则通过参数传递error。

向串口设备发送数据。发送时以二进制流发送。

function: driver(name, driver)

@params {string} name: 驱动的名字

@params {function} driver: 实现驱动的方法

未通用设备注册自定义驱动。实际就是向实例中添加一个属性名为name的driver函数。这样实例便可以直接调用这个函数。只不过driver函数的运行时this指向该实例。例如xfs5152ce就是通过创建通用串口设备,然后注册驱动函数实现的。

serial.driver('say', function(text, imed, cb){
    ......
}

I2C总线设备

I2C设备稍复杂点,因为它是一对多的。数据的读取和发送都是通过主机控制。树莓派自带I2C接口,所以不需要其它硬件就可以使用。很多模块也是使用i2c协议的,例如常见的AT24C02 CMOS EEPROM存储器就是使用I2C的典型。单片机教程中经常使用该例子进行I2C操作的学习。

var i2c = new Device({
    description: 'test i2c',
    interface: 'i2c',
    address: 0x3c,
    device: '/dev/i2c-1'
});

注意i2c通用设备的address地址不是指i2c的物理接口地址,而是指的从机的逻辑地址。device才是指接口的物理接口地址。i2c驱动是基于i2c这个非常受欢迎的npm包封装的。实例的i2c属性就是i2c的实例,它拥有所有的方法和属性,可以自行查阅i2c的文档。SSD1306就是通过创建通用i2c设备,然后通过寄存器操作驱动屏幕。

i2c实例有以下方法:

function: driver(name, driver)

参考上面的driver文档。

因为i2c方法太多,这里就没有进行封装了,可以通过i2c属性访问各函数。


UDP网络设备

有些更高级的模块使用网络进行数据传输。例如ESP 8266 WiFi模块,可以将串口的数据通过WiFi以UDP或TCP协议发送出去。这个就好玩了,通过将8266和单片机串口相连,可以很容易的让单片机实现网络连接。让单片机去采集数据,通过网络发送给树莓派,或者树莓派发送控制命令,远程遥控单片机。8266模块使用UDP是最简单的方法。

var esp = new Device({
    description: 'stc89c52rc-wifi',
    interface: 'udp',
    type: 'udp4',
    address: '127.0.0.1',
    port: 8266,
    remoteAddress: '192.168.1.80',
    remotePort: 8266,
    reuseAddr: false
});

使用udp需要配置在本地监听服务器的地址和端口,同时也要指定对方的IP地址和端口。一般给8266模块配置固定IP。

UDP驱动实例有以下方法:

function: on(type, callback)

@params {string} type: 事件类型。可以取值为: listening、close、error、message。

@params {function} callback: 事件发生时的回调。不同的事件类型有不同的参数。具体如下:

@type: listening 当本地监听服务器启动后发生
    没有参数

@type: close 当本地监听服务器关闭后发生
    没有参数

@type: error 当监听服务器发生错误时发生
    callback(error)

@type: message 当服务器接受到数据时发生
    callback(data, remote, next)
    
    data是接收到的数据。buffer类型。
    remote是node dgram的内置对象。请参考node文档。
    next请参考上面xfs5152ce驱动的文档。
function: write(data, callback)

@params {buffer} data: 要发送的数据。

@params {function} callback(error): 发送数据成功或失败后的回调。

function: driver(name, driver)

参考上面的driver文档。


还有很多不完善的地方,无论是API设计到代码组织,都需要好好思考。后续会增加更多驱动和完善通用性驱动的功能。大部分驱动都是以通用性设备作为基础,然后按照硬件要求的数据格式进行传输,达到让硬件工作的方式。所以有必要完善好通用性驱动的功能。

更友好的API文档也是后续要做的事。

总之,这只是开始。

大家用的开心就好,反正也是给我自己用的。


change log

v0.0.3 @ 2018-06-02 22:56

  • 使用RxJS,更抽象更简单易用的API

v0.0.2 @ 2018-04-22 17:19

  • SSD1306新增showSystemInfo函数,用于监控系统信息。
  • 直接调用showSystemInfo即可在屏幕上面显示内存、CPU统计信息、IP、时间。
  • stopSystemInfo函数用于停止刷新系统监控信息。
  • 增加GPIO引脚参考图,用于查阅树莓派引脚编号和功能。

v0.0.1 @ 2018-01-01 23:27

  • 增加讯飞XFS5152CE文字转语音芯片的驱动
  • 增加SSD1306 OLED屏幕的驱动。
  • 支持在SSD1306屏幕上直接绘制canvas,更友好的图形API(我正在尽量提高刷新率)
  • 包含UART串口、I2C、UDP驱动
  • 包含DHT-11、DHT-22温度湿度传感器驱动
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

简介

oneDevice.js - 用NodeJS驱动硬件。 这是什么? 这是一个旨在用NodeJS驱动硬件的驱动包。开箱即用、完善的文档、持续更新、友好的API。用树莓派打造自己的智能家居。 我对智能家居非常感兴趣,并一直想要自己定制化diy,用智能化设备控制家里的一切设备。所以有了这个,是我一直在用的,我会持续的集成更多型号的硬件驱动和传感器,和更多抽象的接口。 DIY,个性化,定制化,完全可控是oneDevice的核心。 展开 收起
NodeJS
GPL-3.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
NodeJS
1
https://gitee.com/onedevice/oneDevice.git
git@gitee.com:onedevice/oneDevice.git
onedevice
oneDevice
oneDevice
master

搜索帮助

14c37bed 8189591 565d56ea 8189591