Node-Red是一个流行的基于Node的JavaScript工具库,可以使用图形化的方法快速进行JavaScript项目开发,用于网站、物联网项目等不同场景。对于习惯LabVIEW一类图形化编程语言的用户,或者并非软件专业的工程师与爱好者而言,是一个呗用于项目开发的非常方便的工具。Node-Red的开发需要依赖Node环境,因此,无论在Windows下还是Linux系统中,都需要安装Node作为基础。
Arduino是应用非常广泛的开源物联网开发平台之一, 在Node-red中可以通过几个不同的发行包来连接Arduino,直接以图形化的方式进行物联网项目开发。
1.Windows系统安装Node-Red的几种方法
1.1 使用Docker安装Node-red
目前大部分公开资料中关于Windows下安装Docker的说明都是过期的,旧版Docker的安装需要启用HyperV虚拟机,而新版的Docker对Windows的支持已经要友好许多,Windows 10专业版和企业版可以直接安装桌面版的Docker,家庭版的Windows则需要启用WSL2功能来进行安装。Windows10专业版和企业版安装Docker的步骤可参见,Windows家庭版安装步骤同样在Docker官网的 中可以看到。
一般来说,在国内由于网络环境的原因,需要配置Docker仓库镜像为国内镜像,以提高镜像下载速度。提供了基于Docker安装与使用Node-Red的方法。电脑中安装Docker后,可在终端运行以下命令来运行Node-Red。为了实现运行数据的持久化,在硬盘中新建文件夹(此处为D:dockerdataode_red_data)用于存储Docker数据。也可以使用docker create volume node_red_data在Docker默认的存储路径中创建卷node_red_data来存储数据。
docker run -it -p 1880:1880 -v D:dockerdataode_red_data:/data --name mynodered nodered/node-red
以上命令各参数含义如下:
docker run //新建并运行一个Docker容器-it //给容器附着一个终端,用以监视容器的运行状况-p 1880:1880 //将宿主机的1880端口(前一个)映射到容器内部的1880端口-v D:dockerdataode_red_data:/data //将外部存储数据卷映射为内部/data。以实现数据存储持久化--name mynodered //为容器命名nodered/node-red //用于建立容器的镜像(image) ,如果本地没有该镜像,则从Docker仓库下载一个--device=/dev/ttyS0 //将外部串口ttyS0映射给Docker镜像,该命令在Windows版Docker下不可用
在创建完容器后,以后可以用以下命令管理容器:
docker start mynodered //启动mynodered容器docker stop mynodered //停止mynodered容器docker attach mynodered //为mynodered容器附着一个终端docker rm mynodered //删除mynodered容器docker pull nodered/node-red //拉去一个node-red镜像。如果要升级容器镜像,可以执行本命令拉取并重新生成容器
nodered启动后,打开浏览器输入localhost:1880即可打开nodered编辑界面开始程序设计。
1.2 Windows系统中直接安装node-red
在windows下直接安装node-red,需要先安装nodejs。在windows下可以通过下载官网安装包或通过nvm-windows安装。安装完nodejs后,可以通过运行以下命令安装node-red:
npm install -g --unsafe-perm node-red
注意: 上述命令中的--unsafe-perm参数,是为了保证npm的运行权限。出于安全考虑,npm默认不支持以 root 用户(或windows管理员)运行,即使你用 root 用户身份运行了,npm 也会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp),就无法执行。为了避免这种情况,要么需要专门建一个用于运行 npm 的高权限用户;要么加 --unsafe-perm 参数,保证运行时的用户和npm用户一致,而不会切换到 nobody 上。
安装完成后,打开终端,运行node-red即可启动nodered。nodered启动后,打开浏览器输入localhost:1880即可打开nodered编辑界面开始程序设计。注意:如果node是使用nvm-windows进行安装的,可能在运行node-red时会由于缺少settings.js文件而无法启动的错误。这是由于系统未下载安装该文件造成的。需要下载settings.js文件,并复制到C:甥敳獲.node-red文件夹下。
1.3 在Windows 10的Linux子系统WSL中安装node-red
Windows10提供了功能非常强大的WSL功能,可以兼容各种主要发行版本的Linux,以Ubuntu18.04为例,在使用nvm安装了node之后,可以通过以下命令来安装并运行node-red。
npm install -g --unsafe-perm node-red node-red
nodered启动后,打开浏览器输入localhost:1880即可打开nodered编辑界面开始程序设计。
2.使用Node-Red通过串口连接Arduino
2.1 Node-Red安装附加包的方法
Windows版本的Docker不支持访问串口,这在Docker官方项目的Issue中以及Docker官方论坛多个主题下已经经过反复讨论,截止目前,Docker的Windows版本也暂时并没有支持串口和USB等外部设备的计划,因此,对于在Windows下通过Docker安装的Node-Red,目前是没有办法访问串口的。如果是Linux下运行Docker,则可能通过前节的--device参数将串口提供给Docker容器进行操作。
在Windows或者WSL(或者Ubuntu系统)下,要使用Node-Red通过串口连接Arduino,需要先安装相应的包,在Node-red下安装附加包,一种方式是通过编辑界面菜单选择节点管理,然后在安装界面搜索需要的包(如下图)。另外一种则是在在nodered的安装目录下运行安装命令npm install 来进行软件包安装。
连接Arduino常用的包有两个,一个是node-red-node-arduino,另一个是基于流行的johnny-five包的npm install node-red-contrib-gpio。在WSL或者Ubuntu等linux发行版中,按照上述两种方式中的任一种进行安装即可。
在windows下,需要先安装windows-build-tools,否则可能出现node-gyp rebuild error编译错误导致软件包安装无法完成。windows-build-toos的安装,需要在windows下以管理员权限运行PowerShell,并在PowerShell中输入以下命令:npm install --global --production windows-build-tools@4.0.0,等待系统下载并安装python,jvm等编译器即可。这里指定windows-build-tools版本为4.0.0是因为该版本是目前测试可用的,其他版本可能造成一些不稳定。
除了该命令外,github上也有手动进行编译环境搭建的方法(没有测试):
1.输入python --version检查系统路径中是否有安装python,以及python的版本2.下载并安装python2.7 并进行安装,将python2的路径添加的环境变量中3.检查并安装 .NET 4.5.1+ 4.下载并安装Visual C++ Build Tools 2015 ,安装Window 8.1或Windows 10 SDK。5. 配置npm 参数 msvs_version 为2015: npm config -g set msvs_version 2015
2.2 Arduino固件下载
要使用Node-red通过串口操作Arduino,首先需要通过Arduino官方IDE下载Firmate固件到Arduino中。在Arduino官方IDE中打开示例,Firmate中的StandardFirmate并上传到Arduino班子中。这样Arduino即具备了通过串口远程操作的条件。
2.3 Node-Red配置并使用串口
安装完node-red-node-arduino包后,可导入官方的节点示例文件:
[{"id":"d7663aaf.47194","type":"arduino-board","device":""},{"id":"dae8234f.2517e","type":"inject","name":"0.5s tick","topic":"","payload":"","payloadType":"date","repeat":"0.5","crontab":"","once":false,"x":150,"y":100,"z":"359a4b52.ca65b4","wires":[["56a6f8f2.a95908"]]},{"id":"2db61802.d249e8","type":"arduino out","name":"","pin":"13","state":"OUTPUT","arduino":"d7663aaf.47194","x":570.5,"y":100,"z":"359a4b52.ca65b4","wires":[]},{"id":"56a6f8f2.a95908","type":"function","name":"Toggle output on input","func":"// If it does exist make it the inverse of what it was or else initialise it to false// (context variables persist between calls to the function)context.level = !context.level || false;// set the payload to the level and returnmsg.payload = context.level;return msg;","outputs":1,"noerr":0,"x":358,"y":100,"z":"359a4b52.ca65b4","wires":[["2db61802.d249e8"]]}]
导入后节点示意如下图,双击Pin13节点打开编辑界面,编辑Arduino节点,配置串口为当前连接的串口。在Windows系统下,可以通过控制面板-设备管理器看到Arduino对应的串口编号,如果该串口为COM5,则需要将端口号相应配置为COM5,在Ubuntu等Linux子系统下,一般为类似/dev/ttyUSB1或者/dev/ttyS5的形式。注意:在Windows10内置的WSL子系统中,linux系统的串口号与Windows下一一对应,如果在Windows下看到Arduino的串口为COM5,则相应的在WSL中的地址为/dev/ttyS5。
。
2.4 Linux及WSL中串口操作权限的配置
在Linux或者WSL系统中,由于串口权限默认仅赋予dialout用户组,因此,需要将当前用户添加到dialout用户组中,才具备操作串口的权限。使用以下命令将当前用户添加到dialout用户组中。adduser $(whoami) dialout。
在WSL下,可能需要修改串口文件的操作权限,如果windows下串口为COM5,则相应地:sudo chmod 666 /dev/ttyS5。
修改完成后,即可通过终端命令操作串口,或者使用node-red等软件通过串口来操作Arduino了。
stty -F /dev/ttyS5 115200 //设置串口速率screen /dev/ttyUSB0 9600 //使用screen以9600速率打开串口,退出终端使用Ctrl+A k命令。