wIoT - 轻松物联wIoT - Easy IoT
基于NodeJS搭建的物联网系统,配合D1 MINI单片机,帮助你灰常快速实现物联~
The Internet of Things system based on NodeJS, combined with D1 MINI microcontroller, helps you quickly realize the Internet of Things~
正式开发文档见这里
wIoT for NodeJS
适用于NodeJS的wIoT服务器控制组件,轻松物联
项目简介
立项初衷
本项目旨在帮助不熟悉固件编程的网络开发者实现出自己的物联网应用。您仅需要一台网络内部的服务器(比如树莓派),以及若干个支持可联网(通过串口,WiFi,LoRa,蓝牙,Zigbee等)的单片机,即可轻松创建并管理属于您自己的物联网集群。
支持功能
- ota (隔空自动更新固件)
- 自动扫描网络内单片机
- 通过wifi连接设置
- 使用socket/HTTP通信
todo List
- 支持python界面
- 开发web面板,图像化管理
- 支持更多单片机,比如esp8266等
- 开发nodeJS wiot-cli 命令行程序
- 支持nodeJS自动烧写固件,并自动配置(很重要)
使用方法
先觉条件
- 拥有烧录好wIoT固件的D1 MINI单片机
- 一台或多台无线WiFi路由器2.4G/5G
- 局域网内拥有一台装有NodeJS的服务器或电脑 (NodeJS装法非常简单, 请自行Google或百度)
- 配置好npm
快速开始
单片机接入
- 使用MicroUSB, 5V, 或3V pin脚给单片机供电
- 用一根导线连接D0脚与3V3脚,持续一秒以上拔出,以重置单片机
- 用手机或电脑搜索它的WiFi热点,名称格式
wiot-xx:xx:xx:xx:xx:xx
- 连接上此热点,密码为
1234567890
- 用浏览器打开网址
http://192.168.0.1
,记录网页中的MAC地址,这将用于识别此单片机 - 配置你无线路由器的ssid(即wifi名称,注意不能有非ASCII字符,比如汉字)和密码
- 配置完成后热点将自动断开,单片机将连接到你的无线路由器
依赖安装
在你的项目文件夹下打开命令行,输入以下指令安装wiot:
1 | npm install wiot |
使用方法
在你的项目文件夹中新建一个app.js文件,输入以下内容:
1 | var wiot = require('wiot'); //引入wiot依赖包 |
开始执行
在项目文件夹中打开命令行,输入以下指令:
1 | node app.js |
预期结果
如果一切顺利,你现在应该会发现你的板载led在闪烁了
社区支持
也许你会觉得上述代码难以理解,这是正常的,由于delay功能在JS中难以实现。但是不用担心,这些问题将会由社区中的其它开发者帮你解决。
wIoT在实现基本的单片机控制同时,也提供了丰富的扩展功能。更神奇的是,任何人都可以在wIoT中编写自己的扩展并与全世界共享它们。在这里我们可以使用wIoT官方提供的led扩展轻松实现上例功能!
1 | var wiot = require('wiot'); //引入wiot依赖包 |
进阶设置
wiot.client
参数说明
名称 | 默认值 | 描述 |
---|---|---|
MAC | “” | 单片机的MAC地址 |
pin | {D1: 0, D2: 0, D3: 0, D4: 0, D5: 0, D6: 0, D7: 0, D8: 0} | pin脚的模式, 0为INPUT, 1为OUTPUT, 2为INPUT_PULLUP |
hint | true | 是否显示状态提示 |
debug | false | 是否开启debug模式 |
ip | “default” | 指定单片机IP, 请在长时间搜索不到IP时尝试此选项 |
port | 8848 | Client的TCP Socket通信端口,默认8848 |
ip_range | “192.168.0” | IP搜索字段,请在长时间搜索不到IP时尝试此选项 |
localIP | “127.0.0.1” | 本机IP |
OnlyHTTP | false | 是否仅使用HTTP模式连接单片机 |
errDelayTime | 2000 | 遇到网络错误时重试间隔时间(毫秒) |
okDelayTime | 30 | 收到网络请求后延时等待时间(毫秒) |
resetDelayTime | 4500 | 向单片机发送重置指令后多久不再发送新消息(毫秒) |
noTryMaxTime | 15000 | 经过此时间单片机仍未响应则重新发送消息(毫秒) |
IntervalTime | 2000 | 监听行为心跳间隔 |
MaxToReScanTime | 180000 | 经过此事件单片机无响应则从新扫描IP地址(毫秒) |
MinResearchTime | 5000 | 搜索IP经过一此轮询后间隔时间(毫秒) |
IpScanTimeout | 1 | IP扫描时的Ping检测超时时间(秒) |
pingTimeout | 2 | 心跳Ping检测的超时时间(秒) |
MaxTraceBackTimes | 8 | 判断连接状态所向前追溯的历史心跳个数 |
例如:
1 | var MyMCU = new wiot.client({ |
方法列表
.write(pin: wiot.pin/number, state: iot.state/number)
: 向指定pin口输出状态指令,状态可以是wiot.HIGH/wiot.LOW或PWM调制(0-255数字)wiot.read(pin: wiot.pin/number)
: 读取指定pin口状态,数字pin返回wiot.HIGH/wiot.LOW,模拟pin返回0-1024数值
事件绑定
.on(event, handler)
client事件列表
begin
开始于单片机正常交互disConnected
与单片机断开连接reConnected
与单片机恢复连接
1 | var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"}); |
.pinOn(pin, event, handler)
pin事件列表
on
pin口电位从低到高off
pin口电位从高到低change
pin口电位变化
1 | var MCU = new wiot.client({"MAC": "xx:xx:xx:xx:xx:xx"}); |
API
wiot.begin()
: 单片机准备完成后开始执行
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}}); |
wiot.loop()
: 循环执行的指令,适合于条件控制语句
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}}); |
注册表
wiot.register.set(status1, status2, function)
: 向注册表中添加一条规则, status可以是值或函数,当status1==status2时会触发function。
注册表的设计是为了方便协调各扩展模块的使用,详见下文扩展模块。wiot.register.set(status, function)
: 你也可以传入两个函数,其中status的返回值是bool型,变为true时触发function
1 | var myLED = wiot.led(MyMCU, wiot.D4); |
传感器扩展模块
LED
wiot.led(MCU, pin)
: 声明一个led模块wiot.led.getStatus()
: 获取led状态wiot.led.set(status, time = 0, isSmooth = false)
: 设置led状态,起始状态,中间状态,最终状态,周期wiot.led.breath(period)
: 设置一个呼吸灯wiot.led.clear()
: 重置led
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx", pin: {D4: wiot.OUTPUT}}); |
PIR 红外人体传感器
wiot.pir(MCU, pin)
: 声明一个PIR模块wiot.pir.getStatus()
: 获取PIR状态,返回值wiot.HIGH(有人),wiot.LOW(无人)
事件触发器
wiot.pir.on(event, handler)
事件列表
detected
探测到人undetected
人体移动出探测范围change
状态改变,包括有人到无人和无人到有人
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"}); |
IR 红外循迹/障碍传感器
wiot.ir(MCU, pin)
: 声明一个IR模块,pin可以是模拟或数字端口wiot.ir.getStatus()
: 获取IR状态,返回值wiot.HIGH(有障碍),wiot.LOW(无障碍),或者0-1024数值(限模拟端口)
事件触发器
wiot.ir.on(event, handler)
事件列表
detected
探测到障碍undetected
障碍消失change
状态改变
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"}); |
lightSensor 光敏传感器
wiot.lightSensor(MCU, pin)
: 声明一个lightSensor模块, pin可以是模拟或数字端口wiot.lightSensor.getStatus()
: 获取lightSensor状态,返回值wiot.HIGH(有光),wiot.LOW(无光),或者0-1024数值(限模拟端口)
事件触发器
wiot.light.on(event, handler)
事件列表
light
由暗到明dark
由明到暗change
状态改变
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"}); |
网络扩展模块
mail 邮件模块
使用本模块向指定邮箱发送邮件。自豪地引用Yimian API构建!
wiot.mail(to, from = "wIoT")
: 声明一个mail模块,参数收件地址,发件人名称wiot.mail.send(subject, body)
: 发送邮件,需传入主题,邮件内容
1 | var mail = wiot.mail("i@iotcat.me", "wIoT Test"); |
guguji 咕咕机模块
使用本模块向指定咕咕机发送消息。咕咕机是一款便携式私人打印机,详见官网。使用本模块需要在官网提前申请好自己的开发者ak, 详见这里。自豪地引用Yimian API构建!
wiot.guguji(ak, userID, memobirdID)
: 声明一个guguji模块,参数: 开发者ak, 用户id, 咕咕机idwiot.guguji.send(msg)
: 发送消息,需传入待发送的消息
1 | var gugu = wiot.guguji("9e55121803474371bfa25d20e554b31f", "832598", "b3ee06a8bd9b49e1"); |
Quick Start
Current Support devices
- D1 MINI
Node.js Install Node.js
Node.js is a widely used programming language for web developers. To make use of wIoT, you should first install Node.js to your computer.
For windows user, you can follow the instruction in this website
Install wIoT package
After install Node.js and configure npm successfully, you should then use npm to download wIoT package by enter following command in your command window.
1 | npm install wiot |
Windows user can use cmd or powershell.It should be notice that this may report error for some users. The solution is to open your cmd window as administrator. You can right click on cmd and choose run as an administrator. You can also press windows+R and input cmd then press Ctrl+Shift+Enter to open it as administrator.
Burn firmware
Connect your device to D1 MINI
- After burning the firmware, you should try to connect your device to D1 MINI
Follow the steps below, I’m sure it would not be a problem for such a smart person like you
1. Reset your D1 MINI
- Find pin D0 on your D1 MINI, it should be in the middle of A0 and D5.
- Use a wire to connect 3V3 to D0. If your MINI works normally, you would see its BUILT-IN LED blink.
- You don’t have to wait until it stops blink, just stay for 2s, then you can pull out the wire and your MINI would reset.
2.Find your D1 MINI on your device
- After you finish step 1, your MINI would work in AP mode, which means you can search it with your smart phone or personal computer by scanning the Wi-Fi around
- If your MINI was reset successfully, you would find a Wi-Fi with SSID in the form of wiot-xx:xx:xx:xx:xx:xx.
Example:
“xx:xx:xx:xx:xx:xx” is the MAC address of this MINI, please try to remember the address for you may use it later
The default password for D1 MINI is 1234567890, enter the password and you should be able to connect to your MINI.
Connect D1 MINI to your Wi-Fi
Congratulations, you have successfully connect your device to D1 MINI
However, this is not the end, you should now try to connect D1 MINI to your Wi-Fi
Use the device which had just been connected to D1 MINI and follow the steps below
1. Visit the control page of D1 MINI
Visit http://192.168.0.1 with the browser on your device
Normally, you would see a webpage like this:
In this page, you can see the MAC Address and wIoT version of your MINI
Again, please remember the MAC Address
2.Submit SSID and password to your MINI
From the page, you can see two blanks that ask the SSID and password of your Wi-Fi
Input information of the Wi-FI which you would like to connect your MINI, click Submit
If you have input the right SSID and password, you will see a page showing the message: Set Successfully!! Rebooting!!
Then, after a minute, you will see the SSID of D1 MINI has vanished
If you submitted the wrong message, do not try to directly reconnect to D1 MINI. Restart the whole procedure from the reset part of the last section
Execute Example Code
If you have successfully connect D1 MINI to your Wi-Fi, you can execute the example code below to realize a simple function of wIoT
Before executing the code, you should first connect a LED to D1 MINI with positive pole connect to pin D4 and negative pole connect to GND
1 | var wiot = require('wiot'); //Import wiot package from npm |
The LED is expected to blink after you execute the code
Advanced development
Parameters
Name | Default Value | Declaration |
---|---|---|
MAC | “” | MAC Address of MCU |
pin | {D1: 0, D2: 0, D3: 0, D4: 0, D5: 0, D6: 0, D7: 0, D8: 0} | Mode of each pin, 0 is INPUT, 1 is OUTPUT, 2is INPUT_PULLUP |
hint | true | Whether print the status prompt |
debug | false | Whether open the debug mode |
ip | “default” | Specify MCU IP, please try this option when you cannot find IP for a long time |
port | 8848 | TCP Socket communication port for Client, default 8848 |
ip_range | “192.168.0” | IP search field, try this option if you cannot find IP for a long time |
localIP | “127.0.0.1” | local IP |
errDelayTime | 2000 | Retry interval when network error is encountered (milliseconds) |
okDelayTime | 30 | Waiting time after receiving the network request (milliseconds) |
resetDelayTime | 4500 | Waiting time for stop sending new messages after sending reset instructions to MCU (milliseconds) |
noTryMaxTime | 15000 | If the MCU fails to respond after this time, the message will be sent again (milliseconds). |
IntervalTime | 2000 | Interval between monitoring (heartbeat) |
MaxToReScanTime | 180000 | After this time, if the MCU has no response, it will scan the IP address again (in milliseconds). |
MinResearchTime | 5000 | Interval between each polling |
IpScanTimeout | 1 | Ping detection timeout for IP scanning (seconds) |
pingTimeout | 2 | Timeout of Heartbeat Ping detection (seconds) |
MaxTraceBackTimes | 8 | Determine the number of historical heartbeats traced back to the connection state |
Parameters Declaration Example
General Example
1 | var MyMCU = new wiot.client({ |
Event Binding
Client
.on(event, handler)
Event List of client
begin
It begins when MCU starts to interact normallydisConnected
Disconnect from MCUreConnected
Connection with MCU restored
1 | js |
Pin
.pinOn(pin, event, handler)
Event List of pin
on
Change output of pin from LOW to HIGHoff
Change output of pin from HIGH to LOWchange
Change the output of pin
1 |
|
API
wiot.begin()
: Execute when MCU is ready
1 |
|
+
wiot.loop()
: A loop command,Suitable for conditional control statements
1 |
|
Register
wiot.register.set(status1, status2, function)
: Add a rule to register that status can be either value or function,
function would trigger if status1 == status2
The registry is designed to facilitate the use of various extension modules, See [extension module] below (# Sensor Extension Module).wiot.register.set(status, function)
: You can also pass in two functions, where the return value of status is of type bool, it would trigger the function if it changes to true
1 |
|
Sensor extension module
LED
wiot.led(MCU, pin)
: Declare a LED modulewiot.led.getStatus()
: Get status of LEDwiot.led.set(status, time = 0, isSmooth = false)
: Set led state, initial state, intermediate state, final state, periodwiot.led.breath(period)
: Set a breathing LEDwiot.led.clear()
: Reset LED
1 | var wiot = require('wiot'); //Import wiot package from npm |
PIR (Passive Infrared Sensor)
wiot.pir(MCU, pin)
: Declare a PIR modulewiot.pir.getStatus()
: Gets the PIR state, returns the value wiot.high (have people), wiot.low (no people)
Event Trigger
wiot.pir.on(event, handler)
Events List
detected
Person detectedundetected
People out of the detective fieldchange
State change, includes from detected to undetected and from undetected to detected
1 | var wiot = require('wiot'); //Import wiot package from npm |
IR Infrared Sensor
wiot.ir(MCU, pin)
: Declare an IR module, pin can be analog or digital portwiot.ir.getStatus()
: Get IR state, return value wiot.high (with a barrier), wiot.low (with no barrier), or a value of 0-1024 (only for analog port)
Event Trigger
wiot.ir.on(event, handler)
Event List
detected
Barrier detectedundetected
Barrier vanishedchange
Change state
1 | MCU0 = new wiot.client({MAC: "xx:xx:xx:xx:xx:xx"}); |
lightSensor
wiot.lightSensor(MCU, pin)
: Declare a lightSensor module, pin can be analog or digital portwiot.lightSensor.getStatus()
: Get lightSensor state, return value wiot.HIGH(light), wiot.LOW(dark), or a value of 0-1024 (limited to analog port)
Event Trigger
wiot.light.on(event, handler)
Event List
light
From dark to lightdark
From light to darkchange
Change state
1 |
|
Internet Extension Module
Mail module
Use this module to send messages to the specified mailbox. Proudly built with reference to Yimian API!
wiot.mail(to, from = "wIoT")
: Declare an mail module with sender’s name and reveiver’s addresswiot.mail.send(subject, body)
: Send email with a subject and content
1 | var mail = wiot.mail("i@iotcat.me", "wIoT Test"); |
guguji
Use this module to send messages to the specified cooing machine.Goo goo is a portable private printer, see official website.
To use this module, you need to apply for your own developer ak in advance on the official website. See here. Proudly reference Yimian API!
wiot.guguji(ak, userID, memobirdID)
: Declare a goo goo chicken module, parameter: developer’s ak, user id, cooing machine idwiot.guguji.send(msg)
: Send message, need to pass in the message to be sent
1 | var gugu = wiot.guguji("9e55121803474371bfa25d20e554b31f", "832598", "b3ee06a8bd9b49e1"); |