麒麟 V10 安装 Node-RED、IEC 104 协议插件及界面汉化
1. 文档说明
本文用于在麒麟 V10 服务器上安装并配置以下组件:
- Node.js 运行环境
- Node-RED
- Node-RED systemd 后台服务
- Node-RED 登录认证
- IEC 60870-5-104 客户端插件
- IEC 104 插件中文界面
版本说明
原部署环境使用
Node.js 20.10.0。如果是恢复现有项目,建议保持原 Node.js、Node-RED 和插件版本一致,避免出现兼容性问题。对于新部署环境,Node-RED 官方目前推荐使用 Node.js 24.x;Node-RED 5.x 最低要求 Node.js 22,Node-RED 4.x 最低要求 Node.js 18。但第三方 IEC 104 插件不一定兼容最新版本,因此升级前必须先进行测试。
2. 环境检查
2.1 查看系统架构
bash
uname -m
根据输出选择对应的 Node.js 安装包:
| 命令输出 | 系统架构 | Node.js 安装包标识 |
|---|---|---|
aarch64 |
ARM64 | linux-arm64 |
x86_64 |
x86 64 位 | linux-x64 |
不要在未确认架构的情况下直接下载 ARM64 安装包,否则可能出现"无法执行二进制文件"等错误。
2.2 查看系统版本
bash
cat /etc/os-release
2.3 检查常用工具
bash
tar --version
unzip -v
systemctl --version
如果缺少 unzip,可根据服务器软件源配置执行:
bash
sudo yum install -y unzip
3. 安装 Node.js
以下以原部署版本 Node.js 20.10.0 ARM64 为例。
3.1 准备安装包
在可以访问互联网的电脑上,从 Node.js 官方网站下载:
text
node-v20.10.0-linux-arm64.tar.xz
官方下载地址:
text
https://nodejs.org/download/release/v20.10.0/
如果服务器是 x86_64 架构,应下载:
text
node-v20.10.0-linux-x64.tar.xz
下载完成后,将安装包拷贝到麒麟 V10 服务器。
3.2 校验安装包
建议同时下载官方提供的 SHASUMS256.txt,然后执行:
bash
sha256sum node-v20.10.0-linux-arm64.tar.xz
将计算结果与 SHASUMS256.txt 中对应文件的哈希值进行比较,确认安装包未损坏、未被篡改。
3.3 解压并安装
ARM64 架构执行:
bash
tar -xJf node-v20.10.0-linux-arm64.tar.xz
sudo mv node-v20.10.0-linux-arm64 /usr/local/node-v20.10.0
sudo ln -sfn /usr/local/node-v20.10.0 /usr/local/node
如果使用的是 x86 64 位安装包,应执行:
bash
tar -xJf node-v20.10.0-linux-x64.tar.xz
sudo mv node-v20.10.0-linux-x64 /usr/local/node-v20.10.0
sudo ln -sfn /usr/local/node-v20.10.0 /usr/local/node
3.4 配置环境变量
创建环境变量配置文件:
bash
sudo vi /etc/profile.d/nodejs.sh
写入以下内容:
bash
export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$PATH
保存后执行:
bash
source /etc/profile.d/nodejs.sh
注意:环境变量必须写成
$NODE_HOME,不要写成$NODE_{H}OME。
3.5 验证 Node.js
bash
node -v
npm -v
which node
which npm
预期结果类似:
text
v20.10.0
10.x.x
/usr/local/node/bin/node
/usr/local/node/bin/npm
4. 安装 Node-RED
4.1 使用 npm 全局安装
bash
sudo env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm install -g node-red
新版本 npm 通常不再需要
--unsafe-perm参数。只有在旧版本依赖明确要求时才考虑使用。
4.2 验证安装
bash
node-red --version
which node-red
npm list -g --depth=0
正常情况下,Node-RED 命令路径为:
text
/usr/local/node/bin/node-red
4.3 首次测试启动
bash
node-red
如果启动正常,终端会显示 Node-RED、Node.js、配置目录和监听端口等信息。
默认访问地址:
text
http://服务器IP:1880
测试完成后按 Ctrl+C 停止运行。
5. 配置 Node-RED 后台服务
生产环境建议使用独立用户运行 Node-RED,不建议直接使用 root 用户。
5.1 创建运行用户
bash
sudo useradd \
--system \
--create-home \
--home-dir /var/lib/node-red \
--shell /sbin/nologin \
nodered
创建用户目录并设置权限:
bash
sudo mkdir -p /var/lib/node-red
sudo chown -R nodered:nodered /var/lib/node-red
5.2 创建 systemd 服务
bash
sudo vi /etc/systemd/system/nodered.service
写入以下内容:
ini
[Unit]
Description=Node-RED Runtime
Documentation=https://nodered.org/docs/
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=nodered
Group=nodered
WorkingDirectory=/var/lib/node-red
Environment="PATH=/usr/local/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin"
ExecStart=/usr/local/node/bin/node /usr/local/node/lib/node_modules/node-red/red.js --userDir /var/lib/node-red
Restart=on-failure
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=30
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
User、Group、WorkingDirectory和--userDir必须保持一致。不要出现服务使用普通用户运行、配置目录却指向/root/.node-red的情况。
5.3 启动并设置开机自启
bash
sudo systemctl daemon-reload
sudo systemctl enable --now nodered.service
查看服务状态:
bash
sudo systemctl status nodered.service
查看实时日志:
bash
sudo journalctl -u nodered.service -f
查看最近 100 条日志:
bash
sudo journalctl -u nodered.service -n 100 --no-pager
5.4 检查监听端口
bash
sudo ss -lntp | grep 1880
也可以在服务器本机测试:
bash
curl -I http://127.0.0.1:1880
6. 配置防火墙
6.1 检查 firewalld 状态
bash
sudo systemctl status firewalld
如果未启动:
bash
sudo systemctl enable --now firewalld
6.2 放行 Node-RED 端口
bash
sudo firewall-cmd \
--zone=public \
--add-port=1880/tcp \
--permanent
重新加载防火墙:
bash
sudo firewall-cmd --reload
验证配置:
bash
sudo firewall-cmd --list-ports | grep 1880
正常情况下应显示:
text
1880/tcp
建议仅允许可信内网访问 1880 端口,不要直接暴露到互联网。
Node-RED 作为 IEC 104 客户端时,通常是主动连接 RTU 或 IEC 104 服务端的
2404/TCP端口,因此一般不需要在 Node-RED 服务器上开放入站 2404 端口。
7. 配置 Node-RED 登录用户名和密码
Node-RED 编辑器默认没有登录认证。任何能够访问服务器 IP 和 1880 端口的人员都可能进入编辑器并修改、部署流程,因此生产环境必须启用认证。
7.1 生成密码哈希
执行:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/node-red admin hash-pw
根据提示输入密码,命令会输出一串 bcrypt 哈希值,例如:
text
$2b$08$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
复制该哈希值备用。
不要直接将明文密码写入
settings.js。
7.2 修改配置文件
首次启动后,配置文件通常位于:
text
/var/lib/node-red/settings.js
先备份:
bash
sudo cp /var/lib/node-red/settings.js \
/var/lib/node-red/settings.js.bak
编辑配置:
bash
sudo vi /var/lib/node-red/settings.js
在 module.exports = { ... } 内找到 adminAuth 配置,将其修改为:
javascript
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "替换为刚才生成的密码哈希",
permissions: "*"
}
]
},
其中:
username:登录用户名。password:通过node-red admin hash-pw生成的密码哈希。permissions: "*":拥有全部编辑和部署权限。permissions: "read":仅允许查看。
7.3 设置凭据加密密钥
建议同时在 settings.js 中配置:
javascript
credentialSecret: "替换为一段长度足够且不易猜测的随机字符串",
该配置用于加密流程中的账号、密码等凭据信息。
credentialSecret设置后必须妥善备份。后续如果随意修改或丢失,原有流程中的加密凭据可能无法恢复。
7.4 检查配置文件语法
bash
/usr/local/node/bin/node --check /var/lib/node-red/settings.js
如果没有输出,通常表示语法检查通过。
7.5 重启服务
bash
sudo systemctl restart nodered.service
sudo systemctl status nodered.service
重新访问:
text
http://服务器IP:1880
此时应显示登录页面。
8. 安装 IEC 104 协议插件
插件源码地址:
text
https://github.com/iecdriver/node-red-contrib-iec104
该插件属于第三方插件,并非 Node-RED 官方内置节点。安装前建议核对源码、依赖版本及安全性,并在测试环境完成 IEC 104 通信验证。
8.1 下载源码
在可以访问互联网的电脑上下载插件源码压缩包,然后拷贝到服务器。
压缩包名称可能类似:
text
node-red-contrib-iec104-main.zip
8.2 解压并统一目录名称
bash
sudo mkdir -p /opt/node-red-plugins
sudo unzip node-red-contrib-iec104-main.zip \
-d /opt/node-red-plugins
将解压目录统一重命名:
bash
sudo mv \
/opt/node-red-plugins/node-red-contrib-iec104-main \
/opt/node-red-plugins/node-red-contrib-iec104
设置权限:
bash
sudo chown -R nodered:nodered \
/opt/node-red-plugins/node-red-contrib-iec104
确认 package.json 存在:
bash
ls -l /opt/node-red-plugins/node-red-contrib-iec104/package.json
8.3 安装插件
如果 /var/lib/node-red/package.json 不存在,先初始化:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red init -y
安装本地插件:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red \
install /opt/node-red-plugins/node-red-contrib-iec104 \
--omit=dev \
--save
原文中的
npm install -save参数写法错误,正确参数为--save。如果服务器完全无法访问互联网,需要提前准备插件及其全部 npm 依赖。仅复制插件源码并不能保证离线安装成功。
8.4 检查插件
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red \
list --depth=0
重启 Node-RED:
bash
sudo systemctl restart nodered.service
查看启动日志:
bash
sudo journalctl -u nodered.service -n 100 --no-pager
进入 Node-RED 编辑器后,检查左侧节点栏中是否出现 IEC 104 客户端节点。
9. 汉化 IEC 104 插件
IEC 104 节点的配置界面、标签和帮助文本通常定义在:
text
src/iec104-client.html
建议先修改源码目录中的文件,再重新安装插件。
9.1 备份原文件
bash
sudo cp \
/opt/node-red-plugins/node-red-contrib-iec104/src/iec104-client.html \
/opt/node-red-plugins/node-red-contrib-iec104/src/iec104-client.html.bak
9.2 编辑文件
bash
sudo vi \
/opt/node-red-plugins/node-red-contrib-iec104/src/iec104-client.html
将内容调整为:
html
<script type="text/javascript">
RED.nodes.registerType("iec104-client", {
category: "network",
color: "#3498DB",
defaults: {
name: {
value: ""
},
host: {
value: "127.0.0.1",
required: true
},
port: {
value: 2404,
required: true,
validate: RED.validators.number()
},
commonAddress: {
value: 1,
required: true,
validate: RED.validators.number()
},
allowSpontaneous: {
value: true
},
enableGeneralInterrogation: {
value: true
},
pollingInterval: {
value: 60,
validate: function (value) {
return value === "" || !isNaN(value);
}
}
},
inputs: 0,
outputs: 1,
icon: "bridge.svg",
label: function () {
return this.name || "IEC 104 " + this.host + ":" + this.port;
}
});
</script>
<script type="text/html" data-template-name="iec104-client">
<div class="form-row">
<label for="node-input-host">
<i class="fa fa-server"></i>
服务器地址
</label>
<input
type="text"
id="node-input-host"
placeholder="127.0.0.1"
/>
</div>
<div class="form-row">
<label for="node-input-port">
<i class="fa fa-plug"></i>
端口
</label>
<input
type="number"
id="node-input-port"
placeholder="2404"
style="width: 120px;"
/>
</div>
<div class="form-row">
<label for="node-input-commonAddress">
<i class="fa fa-address-card-o"></i>
公共地址(CA)
</label>
<input
type="number"
id="node-input-commonAddress"
placeholder="1"
style="width: 120px;"
/>
</div>
<div class="form-row">
<label for="node-input-name">
<i class="fa fa-tag"></i>
名称
</label>
<input
type="text"
id="node-input-name"
placeholder="节点名称"
/>
</div>
<div class="form-row">
<label for="node-input-allowSpontaneous">
<i class="fa fa-bolt"></i>
接收自发数据
</label>
<input
type="checkbox"
id="node-input-allowSpontaneous"
style="display:inline-block; width:auto; vertical-align:top;"
/>
<p class="form-tips">
禁用后,自发上传的 ASDU 数据将被忽略,但仍会按协议进行确认。
</p>
</div>
<div class="form-row">
<label for="node-input-enableGeneralInterrogation">
<i class="fa fa-refresh"></i>
启用总召唤
</label>
<input
type="checkbox"
id="node-input-enableGeneralInterrogation"
style="display:inline-block; width:auto; vertical-align:top;"
/>
<p class="form-tips">
启用后,连接建立时自动发送总召唤命令(COT=20)。
</p>
</div>
<div class="form-row">
<label for="node-input-pollingInterval">
<i class="fa fa-clock-o"></i>
总召唤周期
</label>
<input
type="number"
id="node-input-pollingInterval"
min="0"
placeholder="60"
style="width: 120px;"
/>
<p class="form-tips">
单位为秒。设置为 0 时,仅在连接建立后执行一次总召唤。
</p>
</div>
</script>
<script type="text/html" data-help-name="iec104-client">
<p>
IEC 60870-5-104 主站(客户端)节点,用于连接 IEC 104
从站、RTU、PLC 或通信网关并接收数据。
</p>
<p>
连接建立后,节点可自动发送总召唤命令,并处理自发上传数据和
IEC 104 数据确认。
</p>
<h3>配置项说明</h3>
<dl class="message-properties">
<dt>
服务器地址
<span class="property-type">字符串</span>
</dt>
<dd>
IEC 104 服务端、RTU 或通信网关的 IP 地址或主机名。
</dd>
<dt>
端口
<span class="property-type">数字</span>
</dt>
<dd>
IEC 104 服务端 TCP 端口,默认值为 2404。
</dd>
<dt>
公共地址(CA)
<span class="property-type">数字</span>
</dt>
<dd>
ASDU 公共地址,默认值为 1,应与现场设备配置保持一致。
</dd>
<dt>
接收自发数据
<span class="property-type">布尔值</span>
</dt>
<dd>
启用后接收设备主动上送的数据;禁用后将忽略自发消息
(通常为 COT=3)。
</dd>
<dt>
启用总召唤
<span class="property-type">布尔值</span>
</dt>
<dd>
控制连接建立后是否发送总召唤请求。
</dd>
<dt>
总召唤周期
<span class="property-type">数字</span>
</dt>
<dd>
周期性总召唤的时间间隔,单位为秒。设置为 0 时,仅在连接
建立后执行一次。
</dd>
</dl>
<h3>输出消息示例</h3>
<pre>{
"typeId": 30,
"cot": 3,
"ca": 1,
"objects": [
{
"ioa": 1,
"value": "true",
"quality": "[QualityDescriptor: ...]"
}
]
}</pre>
</script>
只修改界面显示文字,不要修改
iec104-client、字段名称或配置属性名,否则可能导致节点无法加载或原有流程配置失效。
9.3 重新安装插件
修改源码后重新安装:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red \
install /opt/node-red-plugins/node-red-contrib-iec104 \
--omit=dev \
--save
重启服务:
bash
sudo systemctl restart nodered.service
浏览器执行强制刷新:
text
Ctrl + F5
如果汉化仍未生效,检查 Node-RED 实际加载的文件:
bash
sudo find /var/lib/node-red/node_modules \
-path "*/src/iec104-client.html" \
-print
确认修改的是实际安装目录中的文件,而不是未被加载的源码副本。
10. IEC 104 通信配置与测试
10.1 检查网络连通性
bash
ping -c 4 IEC104设备IP
10.2 检查 2404 端口
如果系统已安装 nc:
bash
nc -vz IEC104设备IP 2404
如果连接成功,通常会显示:
text
succeeded
如果连接失败,应检查:
- IEC 104 服务端是否启动。
- 服务器地址和端口是否正确。
- 本机、网络设备或对端防火墙是否拦截。
- 是否存在安全区、白名单或访问控制策略。
- RTU 是否限制客户端 IP。
- 对端是否只允许一个主站连接。
10.3 Node-RED 节点主要参数
| 参数 | 说明 |
|---|---|
| 服务器地址 | IEC 104 从站、RTU 或网关的 IP 地址 |
| 端口 | 通常为 2404 |
| 公共地址(CA) | 应与对端设备的 ASDU 公共地址一致 |
| 接收自发数据 | 是否接收设备主动上送的数据 |
| 启用总召唤 | 连接建立后是否自动发送总召唤 |
| 总召唤周期 | 周期性总召唤间隔,0 表示仅连接后执行一次 |
11. 常用管理命令
启动服务
bash
sudo systemctl start nodered.service
停止服务
bash
sudo systemctl stop nodered.service
重启服务
bash
sudo systemctl restart nodered.service
查看状态
bash
sudo systemctl status nodered.service
查看实时日志
bash
sudo journalctl -u nodered.service -f
查看最近日志
bash
sudo journalctl -u nodered.service -n 100 --no-pager
检查 1880 端口
bash
sudo ss -lntp | grep 1880
查看 Node.js 和 Node-RED 版本
bash
node -v
npm -v
node-red --version
12. 常见问题排查
12.1 找不到 node 或 npm 命令
检查环境变量:
bash
echo "$PATH"
ls -l /usr/local/node/bin/node
ls -l /usr/local/node/bin/npm
重新加载:
bash
source /etc/profile.d/nodejs.sh
systemd 服务不会自动读取 /etc/profile,因此必须在服务文件中配置:
ini
Environment="PATH=/usr/local/node/bin:/usr/bin:/bin"
12.2 Node-RED 服务启动失败
bash
sudo systemctl status nodered.service
sudo journalctl -u nodered.service -n 200 --no-pager
重点检查:
ExecStart路径是否正确。- Node.js 和 Node-RED 是否安装完整。
/var/lib/node-red是否属于nodered用户。settings.js是否存在语法错误。- 插件是否缺少依赖。
12.3 浏览器无法打开 Node-RED
依次检查:
bash
sudo systemctl status nodered.service
sudo ss -lntp | grep 1880
curl -I http://127.0.0.1:1880
sudo firewall-cmd --list-ports
如果本机可以访问、其他电脑无法访问,通常与防火墙、监听地址或网络策略有关。
12.4 安装后找不到 IEC 104 节点
检查插件:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red \
list --depth=0
检查日志:
bash
sudo journalctl -u nodered.service -n 200 --no-pager
常见原因包括:
- 插件目录名称不一致。
package.json不在插件根目录。- npm 依赖未安装完整。
- Node.js 版本与插件不兼容。
- Node-RED 实际使用的用户目录不是
/var/lib/node-red。 - 插件 HTML 或 JavaScript 文件存在语法错误。
12.5 汉化内容未生效
处理方法:
- 确认修改的是实际加载的插件文件。
- 重启 Node-RED 服务。
- 浏览器按
Ctrl+F5强制刷新。 - 清除浏览器缓存后重新访问。
- 查看 Node-RED 启动日志是否存在插件加载错误。
13. 备份与升级建议
升级 Node.js、Node-RED 或插件前,至少备份以下文件:
text
/var/lib/node-red/flows.json
/var/lib/node-red/flows_cred.json
/var/lib/node-red/settings.js
/var/lib/node-red/package.json
/var/lib/node-red/package-lock.json
执行备份:
bash
sudo tar -czf \
/var/backups/node-red-$(date +%Y%m%d-%H%M%S).tar.gz \
-C /var/lib node-red
升级 Node.js 后,部分包含二进制组件的插件可能需要重新编译:
bash
sudo -u nodered env PATH=/usr/local/node/bin:/usr/bin:/bin \
/usr/local/node/bin/npm \
--prefix /var/lib/node-red rebuild
不建议直接在生产服务器上跨大版本升级 Node.js 或 Node-RED。应先在测试环境验证 IEC 104 连接、总召唤、自发数据、遥测遥信解析及原有流程运行情况。
14. 安装验收清单
- 系统架构与 Node.js 安装包匹配。
-
node -v和npm -v输出正常。 - Node-RED 安装成功。
- Node-RED 使用独立用户运行。
- systemd 服务已设置开机自启。
-
nodered.service状态为active (running)。 - 1880 端口监听正常。
- 防火墙已按要求放行 1880 端口。
- Node-RED 编辑器已启用用户名和密码认证。
-
credentialSecret已设置并备份。 - IEC 104 插件加载正常。
- IEC 104 配置界面已完成汉化。
- Node-RED 服务器能够访问对端 2404 端口。
- 总召唤功能测试正常。
- 自发数据接收测试正常。
- CA、COT、IOA、类型标识及品质描述解析正常。
- Node-RED 流程及凭据文件已完成备份。
15. 参考资料
-
Node-RED 本地安装说明:
-
Node-RED 支持的 Node.js 版本:
-
Node-RED 编辑器安全配置:
https://nodered.org/docs/user-guide/runtime/securing-node-red
-
IEC 104 插件源码: