本文档用于指导现场实施人员部署已经打包完成的 JH2028 新协议 TCP 网关服务。
本项目部署后承担以下职责:
55 AA 新协议报文。说明:
EE 55 协议。dist 目录下已经打包好的可执行文件,不需要在现场安装 Node.js 或执行 npm install。当前项目已经生成 Windows 和 Linux 两类部署包:
dist/
win-x64/
jh2028-service.exe
配置说明.md
runtime/
config.json
alModel.json
dashboard/
logs/
linux-x64/
jh2028-service
配置说明.md
runtime/
config.json
alModel.json
dashboard/
logs/
目录说明:
| 路径 | 说明 |
|---|---|
jh2028-service.exe |
Windows 服务程序 |
jh2028-service |
Linux 服务程序 |
runtime/config.json |
主配置文件,现场主要修改此文件 |
runtime/alModel.json |
阿里云物模型字段文件,一般不修改 |
runtime/dashboard/ |
大屏静态页面文件 |
logs/ |
日志目录 |
配置说明.md |
配置字段说明 |
部署前请确认以下信息:
| 项目 | 说明 |
|---|---|
| 服务器系统 | Windows x64 或 Linux x64 |
| 服务器固定 IP | 设备数据盒子需要连接该 IP |
| TCP 服务端口 | 默认 9000,设备数据盒子连接此端口 |
| 大屏访问端口 | 默认 9100,浏览器访问此端口 |
| 设备数据盒子 IP | 每台设备数据盒子的来源 IP 需要写入配置 |
| MQTT 地址 | 如启用 MQTT,需要确认地址、端口、账号、密码、Topic 前缀 |
| 阿里云三元组接口 | 如启用阿里云,需要确认接口域名和路径 |
| 防火墙策略 | 服务器需要放通 TCP 服务端口和大屏端口 |
建议现场网络关系:
设备数据盒子 ---> 服务器IP:9000 ---> JH2028 TCP 网关服务
浏览器 ---> 服务器IP:9100 ---> 设备中央监测大屏
网关服务 ---> MQTT / 阿里云平台
将 dist/win-x64 整个目录上传到服务器,例如:
D:\jh2028-service\win-x64
不要只复制 jh2028-service.exe,必须同时保留 runtime 目录。
编辑:
D:\jh2028-service\win-x64\runtime\config.json
现场通常需要修改:
tcp.port
dashboard.port
devices
mqtt.host
mqtt.port
mqtt.username
mqtt.password
mqtt.defaultTopicPrefix
aliyun.tupleApiBaseUrl
aliyun.tupleApiPath
设备配置示例:
{
"devices": [
{
"deviceId": "JH-001",
"ip": "192.168.1.10",
"name": "1号透析机"
},
{
"deviceId": "JH-002",
"ip": "192.168.1.11",
"name": "2号透析机"
}
]
}
注意:
ip 是设备数据盒子的来源 IP,不是服务器 IP。打开 PowerShell,执行:
cd D:\jh2028-service\win-x64
.\jh2028-service.exe --config .\runtime\config.json
看到类似日志表示启动成功:
[APP] 配置加载完成 TCP=0.0.0.0:9000
[TCP] 已开始监听 0.0.0.0:9000
[DASHBOARD] 已开始监听 0.0.0.0:9100
推荐使用 NSSM 或 Windows 任务计划程序托管进程。
安装服务:
nssm install jh2028-service
在弹窗中填写:
Path: D:\jh2028-service\win-x64\jh2028-service.exe
Startup directory: D:\jh2028-service\win-x64
Arguments: --config .\runtime\config.json
启动服务:
nssm start jh2028-service
停止服务:
nssm stop jh2028-service
删除服务:
nssm remove jh2028-service confirm
可创建一个“计算机启动时”触发的任务:
程序: D:\jh2028-service\win-x64\jh2028-service.exe
参数: --config .\runtime\config.json
起始于: D:\jh2028-service\win-x64
以管理员 PowerShell 执行:
New-NetFirewallRule -DisplayName "JH2028 TCP 9000" -Direction Inbound -Protocol TCP -LocalPort 9000 -Action Allow
New-NetFirewallRule -DisplayName "JH2028 Dashboard 9100" -Direction Inbound -Protocol TCP -LocalPort 9100 -Action Allow
如现场修改了端口,请替换为实际端口。
将 dist/linux-x64 整个目录上传到服务器,例如:
/opt/jh2028-service/linux-x64
不要只复制 jh2028-service,必须同时保留 runtime 目录。
编辑:
vi /opt/jh2028-service/linux-x64/runtime/config.json
配置内容与 Windows 相同,重点确认:
tcp.portdashboard.portdevicesmqttaliyunsend.channels执行:
cd /opt/jh2028-service/linux-x64
chmod +x ./jh2028-service
./jh2028-service --config ./runtime/config.json
看到类似日志表示启动成功:
[APP] 配置加载完成 TCP=0.0.0.0:9000
[TCP] 已开始监听 0.0.0.0:9000
[DASHBOARD] 已开始监听 0.0.0.0:9100
创建服务文件:
sudo vi /etc/systemd/system/jh2028-service.service
写入:
[Unit]
Description=JH2028 TCP Gateway Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/opt/jh2028-service/linux-x64
ExecStart=/opt/jh2028-service/linux-x64/jh2028-service --config ./runtime/config.json
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
加载并启动:
sudo systemctl daemon-reload
sudo systemctl enable jh2028-service
sudo systemctl start jh2028-service
查看状态:
sudo systemctl status jh2028-service
查看实时日志:
journalctl -u jh2028-service -f
停止服务:
sudo systemctl stop jh2028-service
重启服务:
sudo systemctl restart jh2028-service
如使用 firewalld:
sudo firewall-cmd --add-port=9000/tcp --permanent
sudo firewall-cmd --add-port=9100/tcp --permanent
sudo firewall-cmd --reload
如使用 ufw:
sudo ufw allow 9000/tcp
sudo ufw allow 9100/tcp
如现场修改了端口,请替换为实际端口。
{
"tcp": {
"host": "0.0.0.0",
"port": 9000
}
}
建议:
host 保持 0.0.0.0,表示监听服务器所有网卡。port 与设备数据盒子连接端口保持一致。{
"dashboard": {
"enabled": true,
"host": "0.0.0.0",
"port": 9100
}
}
浏览器访问:
本机访问:http://127.0.0.1:9100
局域网访问:http://服务器真实IP:9100
不要在浏览器打开:
http://0.0.0.0:9100
0.0.0.0 只表示服务监听地址,不是浏览器访问地址。
{
"send": {
"channels": ["mqtt", "aliyun"]
}
}
可选值:
["mqtt"] 只上报 MQTT
["aliyun"] 只上报阿里云
["mqtt","aliyun"] 同时上报 MQTT 和阿里云
注意:上传失败只记录日志,不做补发。
{
"logging": {
"dir": "./logs",
"level": "info",
"logRawHex": false
}
}
说明:
jh2028-service-20260519.log。--config ./runtime/config.json 时,./logs 会按 runtime 目录计算。logRawHex 改为 true,排查完成后建议改回 false。Windows:
Get-Process | Where-Object { $_.ProcessName -like "*jh2028*" }
Linux:
ps -ef | grep jh2028-service
Windows:
netstat -ano | findstr ":9000"
netstat -ano | findstr ":9100"
Linux:
ss -lntp | grep -E "9000|9100"
浏览器打开:
http://服务器真实IP:9100
验证点:
设备数据盒子连接服务器后,日志应出现:
[TCP] 设备已连接 设备=JH-001 IP=192.168.1.10
[TCP] 收到原始数据 设备=JH-001 字节数=...
[TCP] 解析到指标 设备=JH-001 类型=...
如果出现以下日志,说明设备 IP 未配置或配置不一致:
[TCP] 未配置设备接入 IP=...
MQTT 上报成功时,日志中会出现 MQTT 发布相关记录。
阿里云上报失败时,日志中会出现:
[APP] 阿里云上报失败 设备=...
MQTT 上报失败时,日志中会出现:
[APP] MQTT 上报失败 设备=...
现象:
未找到配置文件: ...
处理:
--config 路径正确。win-x64 目录下执行启动命令。WorkingDirectory。现象:
EADDRINUSE
处理:
9000 或 9100 是否已被其他程序占用。runtime/config.json 中的端口。处理顺序:
tcp.port。devices[].ip 是设备数据盒子的来源 IP。处理顺序:
dashboard.enabled 为 true。dashboard.port 未被占用。http://服务器真实IP:9100 访问,不要使用 http://0.0.0.0:9100。处理顺序:
send.channels 已启用对应通道。logging.logRawHex=true。升级前建议备份:
runtime/config.json
runtime/alModel.json
logs/
升级步骤:
win-x64 或 linux-x64 部署包。runtime/config.json 中的现场配置迁移到新版本。runtime/alModel.json。注意:
runtime 目录,避免覆盖现场配置。config.json 为准,将现场值迁移进去。如升级后现场异常,可按以下步骤回滚:
建议每次升级保留至少一个可用旧版本目录,例如:
D:\jh2028-service\backup\win-x64-20260519
/opt/jh2028-service/backup/linux-x64-20260519
| 检查项 | 结果 |
|---|---|
部署包完整,包含可执行文件、runtime、logs |
|
runtime/config.json 已按现场设备和平台信息修改 |
|
| TCP 端口已放通 | |
| 大屏端口已放通 | |
| 服务已配置开机自启 | |
| 服务进程运行正常 | |
| TCP 端口监听正常 | |
| 大屏可以通过服务器真实 IP 访问 | |
| 设备连接日志正常 | |
| 数据解析日志正常 | |
| MQTT 或阿里云上报验证正常 | |
| 已备份最终配置文件 |