Node-RED探索 -- PM2 用户管理 JS Exec密码 Python UDP

PM2 常用命令

# 重启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

参考:

JS 函数

节点: inject -> function -> debug:

  • 流程1 里面拖入节点, 连线如图
  • 点击部署
  • 点击时间戳左边的方格, 这个输出的默认是 1970年1月1日以来的毫秒数, 调试里面打印的蓝色数字单击可以切换UTC+8, 十六进制等的显示, 还可以复制值和复制路径(对于参数很友好)等

在这里插入图片描述

其中 function 节点输入如下, 把数字转为字符串:

var date = new Date(msg.payload);
msg.payload = date.toString();
return msg;

时间戳如果想1s触发一次可以这么配置:

在这里插入图片描述

对于没用过 js 的, 可简要参考:

Exec 节点 含 密码输入

输入输出的解释

在这里插入图片描述

详细解释:

默认情况下,使用exec系统调用来调用命令,等待命令完成,然后返回输出。例如,成功的命令的返回码应为{code:0}

(可选)可以选择使用spawn代替,它会在命令运行时从stdout和stderr返回输出,通常一次一行。完成后,它将在第三个端口上返回一个对象。例如,成功的命令应返回{code:0}

错误可能会在第三个端口msg.payload上返回额外的信息,例如message字符串,signal字符串。

运行的命令是在节点内定义的,带有附加msg.payload的选项和另外一组参数。

带空格的命令或参数应该用引号引起来:“这是一个参数”

返回的有效荷载通常是字符串类型,除非检测到非UTF8字符,在这种情况下,它会是buffer类型。

节点处于活动状态时,该节点的状态图标和PID将可见。对此更改可以通过Status节点读取。

杀死进程

发送msg.kill将杀死一个活动进程。msg.kill应该是包含要发送的信号类型的字符串,例如SIGINTSIGQUITSIGHUP。如果设置为空字符串,则默认为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

Python 脚本

不熟悉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方式更加灵活了

参考:

pythonshell 方式

如前所述, 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)

参考:

UDP 接收举例

如图所示:

  • 时间戳作为参数输入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 节点配置

在这里插入图片描述
欢迎扫描二维码关注微信公众号, 及时获取最新文章:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值