Files
UPC-Resent/README.md
2026-03-23 15:20:46 +08:00

328 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UPC Resent - 自动化控制设备指令转发系统
基于配置驱动的代码生成系统,支持 TCP 和 UDP 协议,监听端口接收外部指令,转换为 Modbus TCP/UDP 协议发送到控制设备(继电器/PLC等
## 项目结构
```
upc_resent/
├── config/
│ └── devices.json # 设备配置文件(唯一需要修改的文件)
├── templates/ # 代码模板目录
│ ├── listener_tcp.py.tpl # TCP监听服务模板
│ ├── listener_udp.py.tpl # UDP监听服务模板
│ ├── crond_tcp.py.tpl # TCP保活检查模板
│ ├── crond_udp.py.tpl # UDP保活检查模板
│ ├── sender_tcp.py.tpl # TCP发送模块模板
│ ├── sender_udp.py.tpl # UDP发送模块模板
│ └── control.sh.tpl # 控制脚本模板
├── scripts/
│ └── generate.py # 代码生成器
├── bin/ # 生成的监听服务文件(自动生成)
│ ├── sender_tcp.py # TCP发送模块
│ ├── sender_udp.py # UDP发送模块
│ └── {device_id}.py # 各设备监听服务
├── crond/ # 生成的保活检查文件(自动生成)
├── log/ # 日志目录
├── control.sh # 服务控制脚本(自动生成)
├── crontab.txt # 定时任务配置(自动生成)
└── cutlog.sh # 日志清理脚本
```
## 快速开始
### 1. 配置设备
编辑 `config/devices.json`
```json
{
"global": {
"tms_server_ip": "192.168.8.9",
"python_path": "/usr/bin/python3",
"base_dir": "/opt/upc_resent"
},
"devices": [
{
"id": "dev1",
"name": "设备1-TCP",
"protocol": "tcp", // 协议类型: tcp 或 udp
"upc_ip": "192.168.8.73",
"upc_port": 502,
"listen_port": 10079,
"enabled": true
},
{
"id": "dev2",
"name": "设备2-UDP",
"protocol": "udp", // 使用UDP协议
"upc_ip": "192.168.8.200",
"upc_port": 502,
"listen_port": 10080,
"enabled": true
}
]
}
```
### 2. 生成代码
```bash
# 检查配置是否正确
python3 scripts/generate.py --check
# 生成代码
python3 scripts/generate.py
```
### 3. 部署与启动
```bash
# 查看服务状态
./control.sh status
# 启动所有服务
./control.sh start
# 停止所有服务
./control.sh stop
# 重启所有服务
./control.sh restart
# 配置定时任务(保活)
crontab crontab.txt
```
## 配置文件详解
### `config/devices.json`
#### 全局配置 (global)
| 参数 | 说明 | 示例 |
|-----|------|-----|
| `tms_server_ip` | 本机监听IP接收外部指令 | `"192.168.8.9"` |
| `python_path` | Python3 解释器路径 | `"/usr/bin/python3"` |
| `base_dir` | 项目部署路径 | `"/opt/upc_resent"` |
#### 设备配置 (devices)
| 参数 | 说明 | 示例 |
|-----|------|-----|
| `id` | 设备唯一标识(用于文件名) | `"dev1"` |
| `name` | 设备名称(用于日志显示) | `"设备1-TCP"` |
| `protocol` | 协议类型:`tcp``udp` | `"tcp"` / `"udp"` |
| `upc_ip` | 控制设备的IP地址 | `"192.168.8.73"` |
| `upc_port` | 控制设备的端口Modbus默认502 | `502` |
| `listen_port` | 本机监听端口(每个设备需不同) | `10079` |
| `enabled` | 是否启用该设备 | `true` / `false` |
#### 指令定义 (commands)
```json
{
"commands": {
"open1": "000100000008010F006400010001",
"close1": "000100000008010F006400010000",
"openall4": "000100000008010F00640004000F",
"closeall4": "000100000008010F006400040000"
}
}
```
格式:指令名 -> 16进制字符串
#### 指令映射 (mappings)
```json
{
"mappings": {
"open": "openall4",
"close": "closeall4",
"guanggao-guan": "closeall4"
}
}
```
## TCP vs UDP 差异
| 特性 | TCP | UDP |
|-----|-----|-----|
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 尽力传输 |
| 响应 | 有确认响应 | 可选响应(可能超时) |
| 适用场景 | 可靠性要求高 | 实时性要求高 |
| 保活检查 | 端口连通性检查 | 进程状态检查 |
## 如何适配自己的设备
### 场景1添加 TCP 设备
```json
{
"devices": [
{
"id": "dev_tcp",
"name": "TCP设备",
"protocol": "tcp",
"upc_ip": "192.168.1.100",
"upc_port": 502,
"listen_port": 10081,
"enabled": true
}
]
}
```
### 场景2添加 UDP 设备
```json
{
"devices": [
{
"id": "dev_udp",
"name": "UDP设备",
"protocol": "udp",
"upc_ip": "192.168.1.200",
"upc_port": 502,
"listen_port": 10082,
"enabled": true
}
]
}
```
### 场景3添加新的控制指令
```json
{
"commands": {
"open9": "000100000008010F006C00010001",
"close9": "000100000008010F006C00010000"
}
}
```
### 场景4禁用某个设备
```json
{
"devices": [
{
"id": "dev2",
"enabled": false
}
]
}
```
## 测试指令发送
### TCP 设备测试
```bash
# 向TCP设备发送开灯指令
echo "open1" | nc 192.168.8.9 10079
# 向TCP设备发送全关指令
echo "close" | nc 192.168.8.9 10079
```
### UDP 设备测试
```bash
# 向UDP设备发送开灯指令
echo "open1" | nc -u 192.168.8.9 10080
# 向UDP设备发送全关指令
echo "close" | nc -u 192.168.8.9 10080
# 使用 socat 测试 UDP
echo "open1" | socat - UDP:192.168.8.9:10080
```
## 支持的指令列表
| 外部指令 | 内部指令 | 功能 |
|---------|---------|------|
| `open` | `openall4` | 1-4路全开 |
| `close` | `closeall4` | 1-4路全关 |
| `open1`~`open8` | `open1`~`open8` | 第N路开 |
| `close1`~`close8` | `close1`~`close8` | 第N路关 |
| `guanggao-guan` | `closeall4` | 广告关闭(全关) |
## Modbus 指令格式
本项目支持 Modbus TCP/UDP 协议指令为16进制字符串
```
示例000100000008010F006400010001
│ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ └── 数据值 (01=开, 00=关)
│ │ │ │ │ │ │ │ │ └──── 寄存器数量
│ │ │ │ │ │ │ │ └─────── 起始地址 (64=100)
│ │ │ │ │ │ │ └────────── 功能码 (0F=写多个线圈)
│ │ │ │ │ │ └──────────── 单元标识
│ │ │ │ └───────────────── 协议标识
│ │ │ └─────────────────── 长度
│ └─────────────────────── 事务标识
└────────────────────────── 事务标识
```
## 代码生成器用法
```bash
# 检查配置是否正确
python3 scripts/generate.py --check
# 生成代码
python3 scripts/generate.py
# 查看帮助
python3 scripts/generate.py --help
```
## 服务控制脚本
`control.sh` 提供以下命令:
| 命令 | 说明 |
|-----|------|
| `start` | 启动所有服务 |
| `stop` | 停止所有服务 |
| `restart` | 重启所有服务 |
| `status` | 查看服务运行状态 |
示例:
```bash
./control.sh status
./control.sh start
./control.sh stop
./control.sh restart
```
## 日志文件
| 文件 | 说明 |
|-----|------|
| `log/{device_id}.log` | 设备监听服务的日志 |
| `log/crond-{device_id}.log` | 保活检查的日志 |
日志自动轮转每天清理7天前的日志。
## 注意事项
1. **不要直接修改** `bin/``crond/``control.sh`,这些文件是自动生成的,重新生成时会覆盖。
2. **修改配置后必须重新运行** `python3 scripts/generate.py` 才能生效。
3. 确保每个设备的 `listen_port` 不冲突,无论 TCP 还是 UDP端口都不能重复。
4. UDP 是无连接协议,设备可能不会返回响应,这是正常现象。
5. 部署到生产环境前,请将 `base_dir` 修改为实际的部署路径(如 `/opt/upc_resent`)。
6. 控制脚本使用 `pgrep` 来查找进程,确保系统中没有同名脚本冲突。