- PM2 常用命令
- 编辑器用户管理
- JS 函数
- Exec 节点 含 密码输入
- Python 脚本
- exec 方式
- python-function 方式
- pythonshell 方式
- UDP 接收举例
# 重启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
- UI界面: 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"
}
]
},
如图所示
特别注意:
- 如果文件中存在语法错误,Node-RED 将无法启动。日志输出将指示错误的位置. 如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
参考:
- Securing Node-RED : Node-RED (nodered.org), 这里面还提到了启用 https 访问的方法等
节点: inject -> function -> debug:
- 流程1 里面拖入节点, 连线如图
- 点击部署
- 点击时间戳左边的方格, 这个输出的默认是 1970年1月1日以来的毫秒数, 调试里面打印的蓝色数字单击可以切换UTC+8, 十六进制等的显示, 还可以复制值和复制路径(对于参数很友好)等
其中 function 节点输入如下, 把数字转为字符串:
var date = new Date(msg.payload); msg.payload = date.toString(); return msg;
时间戳如果想1s触发一次可以这么配置:
对于没用过 js 的, 可简要参考:
- JavaScript 教程 (w3school.com.cn)
输入输出的解释
详细解释:
默认情况下,使用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] abcdefgPython 脚本
不熟悉JS没关系, 相信很多人都熟悉Python, 方法不少, 下面一一介绍.
exec 方式这个路子就比较野了, 直接拿 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输入密码
python-function 方式如前所述, 由于 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方式更加灵活了
参考:
- node-red-contrib-python-function (node) - Node-RED (nodered.org)
- node-red-contrib-python3-function (node) - Node-RED (nodered.org)
如前所述, 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)
参考:
- node-red-contrib-pythonshell (node) - Node-RED (nodered.org)
如图所示:
- 时间戳作为参数输入py脚本
- 转为int后, UDP 按小端字节序发出到本机的 5005 端口
其中, 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 节点配置
欢迎扫描二维码关注微信公众号, 及时获取最新文章:



