# 重启node-red
pm2 restart node-red
# 监控node-red的CPU和内存使用率
pm2 monit
# 如果是 pm2 monitor 会跳转到一个网页
# 打印所有的环境变量
pm2 env 0
# 查看node-red的信息
pm2 info node-red
# 查看日志 --lines 1000
pm2 logs node-red
特别是这个查看日志的命令很有用, 瞎试 Node-RED 编辑器的时候, 经常部署后出现致命错误, 界面打不开了, 就可以 pm2 logs node-red
看一下为什么出错, 然后到 ~/.node-red/flows.json
里面删掉或改正导致崩溃的 flow 或 node 代码, 再重启 pm2 restart node-red
(当然, 因为PM2会自动重启Node-RED, 所以改完后应该页面会提示的, 合并即可)
下面的这个错误是 python_function 引起的(由于 Ubuntu20 默认只有 Python3, 而Python是不能运行的, 可以整一个软链接 sudo ln -s /usr/bin/python3 /usr/bin/python
来解决, 或者像下面那样直接删掉)
默认的两个界面:
ip:1880
ip:1880/ui
任何可以访问其 IP 地址的人都可以访问编辑器并部署更改. UI界面本来就是用来展示的, 加不加密先放一边, 这里看下编辑器的 基于用户名/密码的身份验证.
编辑设置文件 ~/.node-red/settings.js
, 找到 adminAuth
字样, 在下面照猫画虎加入两个用户:
admin
, 密码password
, 拥有全部权限user
, 密码 123
, 拥有只读权限# 生成 password 的哈希值
$ node-red admin hash-pw
Password:
$2b$08$hxiN2/sBDt4mEepiQILqGutfeiKjP.9hDoZd1rolC8mYvWqZdTvu.
# 生成 123 的哈希值
$ node-red admin hash-pw
Password:
$2b$08$pn84f4Dr9frbsZM.JHI.cORgcQYf8XsXwBiV2pzt3Q8yuYPcm13Fy
# 给 Node-RED 加两个用户
$ vi ~/.node-red/settings.js
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2b$08$hxiN2/sBDt4mEepiQILqGutfeiKjP.9hDoZd1rolC8mYvWqZdTvu.",
permissions: "*"
},
{
username: "user",
password: "$2b$08$pn84f4Dr9frbsZM.JHI.cORgcQYf8XsXwBiV2pzt3Q8yuYPcm13Fy",
permissions: "read"
}
]
},
如图所示
特别注意:
settings.js
少输入一个逗号, 那么Node-RED将无法启动重启 node-red
生效: pm2 restart node-red
, 再次打开 1880 编辑器界面, 就需要输入刚才设置的用户名和密码才能进去了:
切换用户可以在编辑器右上角
如果是想 admin 有全部权限, 其它默认只读权限, 可以改为
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2b$08$hxiN2/sBDt4mEepiQILqGutfeiKjP.9hDoZd1rolC8mYvWqZdTvu.",
permissions: "*"
},
],
default: {
permissions: "read"
}
},
如图
这样 1880 编辑器网页默认打开的就是只读页面, 部署会提示
需要编辑的话, 需要右上角切换登录到admin
参考:
节点: inject -> function -> debug
:
其中 function 节点输入如下, 把数字转为字符串:
var date = new Date(msg.payload);
msg.payload = date.toString();
return msg;
时间戳如果想1s触发一次可以这么配置:
对于没用过 js 的, 可简要参考:
输入输出的解释
详细解释:
默认情况下,使用
exec
系统调用来调用命令,等待命令完成,然后返回输出。例如,成功的命令的返回码应为{code:0}
。(可选)可以选择使用
spawn
代替,它会在命令运行时从stdout和stderr返回输出,通常一次一行。完成后,它将在第三个端口上返回一个对象。例如,成功的命令应返回{code:0}
。错误可能会在第三个端口
msg.payload
上返回额外的信息,例如message
字符串,signal
字符串。运行的命令是在节点内定义的,带有附加
msg.payload
的选项和另外一组参数。带空格的命令或参数应该用引号引起来:
“这是一个参数”
返回的
有效荷载
通常是字符串类型,除非检测到非UTF8字符,在这种情况下,它会是buffer类型。节点处于活动状态时,该节点的状态图标和PID将可见。对此更改可以通过
Status
节点读取。杀死进程
发送
msg.kill
将杀死一个活动进程。msg.kill
应该是包含要发送的信号类型的字符串,例如SIGINT
,SIGQUIT
或SIGHUP
。如果设置为空字符串,则默认为SIGTERM
。如果节点有多个进程在运行,则还必须设置
msg.pid
并设置要杀死的PID的值。如果
超时
字段提供了一个值,则如果在指定的秒数过去后进程尚未完成,则该进程将自动终止。提示:如果运行Python应用程序,则可能需要使用
-u
参数来停止对输出进行缓存。
如果命令运行一次就完事了, 用exec模式
如果命令一直运行, 就用spwn的方式
如果要输入密码, 实现如下
# 发现sudo的 -S 参数可以读取标准输入作为密码
$ sudo --help
...
-S, --stdin read password from standard input
...
# z 是密码, 先清dmesg, 然后往dmesg写入 abcdefg
echo 'z' | sudo -S dmesg -C; sudo -S sh -c "echo 'abcdefg' > /dev/kmsg"
部署如图所示
查看一下 dmesg 的信息, 符合预期:
$ dmesg
[ 6800.603329] abcdefg
不熟悉JS没关系, 相信很多人都熟悉Python, 方法不少, 下面一一介绍.
这个路子就比较野了, 直接拿 exec 节点来实现:
exec节点配置, 直接命令行运行 py 脚本python3 /home/$USER/.node-red/py/test.py
, 追加输入参数 msg.payload
~/.node.red/py/test.py
文件填入
#!/usr/bin/python3
import sys
print("Got arguments: ", sys.argv)
print(123)
部署运行, sys.argv
有两个参数, 文件名和输入的时间戳, 所有print
打印的结果合成一个string作为输出:
对于结果的处理可以搭配 function节点 或 switch节点 等做进一步的动作.
牵涉到硬件(串口等)一般需要sudo, 参考上面的exec
输入密码
如前所述, 由于 Ubuntu20 默认只有 Python3, 而Python是不能运行的, 可以整一个软链接来解决:
sudo ln -s /usr/bin/python3 /usr/bin/python
装一个 python-function
或者 python3-function
的节点:
或者使用命令行
cd ~/.node-red
npm install node-red-contrib-python-function
pm2 restart node-red
使用参考, 主要是以字典的方式返回
即
msg['payload'] = {'x':1, 'y':2}
return msg
看编辑界面这个不像Exec那么灵活, 可以把输入当 sys.argv 填进去, 不知道有没有其它方法
不一定非要用msg关键字, 也不一定只有一个return, 改成
a = 1
b = 2
return a,b
添加一个输出
这种可以多输出的方式相比Exec方式更加灵活了
参考:
如前所述, Ubuntu20 默认只有 Python3, 而Python是不能运行的, 整一个软链接来解决 sudo ln -s /usr/bin/python3 /usr/bin/python
有人更喜欢写Python, 装一个 node-red-contrib-pythonshell
或者命令行安装
cd ~/.node-red
npm install node-red-contrib-pythonshell
pm2 restart node-red
面板里会多一个 pythonshell in
的节点
测试一下
pythonshell in
节点输入的是文件路径 /home/z/.node-red/py/test2.py
:
test2.py
文件内容
import sys
print("input arguments is: ", sys.argv)
参考:
如图所示:
其中, test.py
脚本如下
#!/usr/bin/python3
import sys, socket
print(sys.argv[1])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(int(sys.argv[1]).to_bytes(8, byteorder='little', signed=False), \
("127.0.0.1", 5005))
Exec 节点 配置
UDP in 节点配置