数据同步服务-语音
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
6.4 KiB

1 week ago
# VAA录音盒HTTP同步服务
## 📋 概述
基于合肥实现方案,通过HTTP API从VAA录音盒设备定时拉取录音数据并上传到OSS。
## 🔧 核心特性
1. **HTTP API通信** - 使用录音盒提供的RESTful API
2. **定时同步** - 每2小时自动执行一次同步任务
3. **增量同步** - 根据上次同步时间,只拉取新增录音
4. **自动登录** - 每次同步前自动认证
5. **通道状态更新** - 同步时更新设备通道状态
6. **OSS上传** - 录音文件自动上传到对象存储
7. **完整日志** - 记录每次同步的结果
## 📊 数据流程
```
┌──────────────┐
│ 定时触发 │ (每2小时)
└──────┬───────┘
┌──────────────┐
│ 查询设备列表 │ (YYDC_YYSB表)
└──────┬───────┘
┌──────────────┐
│ HTTP登录认证 │ (/authorize)
└──────┬───────┘
┌──────────────┐
│ 获取通道状态 │ (/service/running/channel)
└──────┬───────┘
┌──────────────┐
│ 获取录音列表 │ (/service/record/~/time[开始,结束])
└──────┬───────┘
┌──────────────┐
│ 下载录音文件 │ (HTTP下载)
└──────┬───────┘
┌──────────────┐
│ 上传到OSS │ (FileUploadUtil)
└──────┬───────┘
┌──────────────┐
│ 保存到数据库 │ (YYDC_YYTH表)
└──────┬───────┘
┌──────────────┐
│ 记录同步日志 │ (YYDC_TBRZ表)
└──────────────┘
```
## 🗄️ 数据库表要求
### YYDC_YYSB (语音设备表)
必需字段:
- `ID` - 设备ID
- `UUID` - 设备UUID
- `ORGAN_NAME` - 机构名称
- `ORGAN_ID` - 机构ID
- `IP` - 设备IP地址
- `PORT` - 设备端口(默认80)
- `SBYH` - 设备用户名
- `SBMM` - 设备密码
- `SFYX_ST` - 是否有效('1':有效)
### YYDC_SBTD (设备通道表)
必需字段:
- `ID` - 通道ID
- `UUID` - 关联设备UUID
- `TDHM` - 通道号码
- `PHONE` - 电话号码
- `TDZT` - 通道状态
- `SFYX_ST` - 是否有效
### YYDC_YYTH (通话记录表)
必需字段:
- `ID` - 通话ID(格式:设备ID_录音ID_开始时间戳)
- `ORGAN_NAME`, `ORGAN_ID` - 机构信息
- `YYSB_ID` - 语音设备ID
- `SBTD_ID` - 设备通道ID
- `THFX` - 通话方向('1':呼出, '0':呼入)
- `PHONE`, `ZJHM`, `BJHM` - 号码信息
- `THSC` - 通话时长(秒)
- `KSSJ`, `JSSJ` - 开始/结束时间
- `LYDZ` - 录音地址(OSS URL)
- `LYMC` - 录音文件名
### YYDC_TBRZ (同步日志表)
必需字段:
- `CODE` - 同步代码(格式:YYDC.AUDIO(设备ID))
- `KSSJ` - 开始时间
- `JSSJ` - 结束时间
- `GXSJ` - 更新时间
- `TBBZ` - 同步标志('1':成功, '0':失败)
- `TBSM` - 同步说明
## ⚙️ 配置说明
### application.yml
```yaml
# 本地IP(用于生成录音访问URL)
server:
local-ip: 127.0.0.1
# VAA同步配置
vaa-sync:
download-path: /tmp/vaa-recordings # 临时下载目录
sync-interval-cron: "0 0 0/2 * * ?" # 每2小时同步
```
## 🚀 使用方法
### 1. 配置设备信息
在数据库中插入设备信息:
```sql
INSERT INTO YYDC_YYSB (ID, UUID, ORGAN_NAME, ORGAN_ID, IP, PORT, SBYH, SBMM, SFYX_ST)
VALUES ('device-001', 'uuid-001', '黄山市局', 1001, '192.168.1.100', 80, 'admin', 'admin123', '1');
```
### 2. 配置通道信息
```sql
INSERT INTO YYDC_SBTD (ID, UUID, TDHM, PHONE, SFYX_ST)
VALUES ('channel-001', 'uuid-001', '1', '13800138000', '1');
```
### 3. 启动应用
```bash
mvn spring-boot:run
```
应用启动后,定时任务会自动执行。
### 4. 手动触发(可选)
可以通过注入 `VaaSyncService` 并调用 `executeSync()` 方法手动触发同步。
## 📝 VAA录音盒API说明
### 1. 登录认证
```
GET http://{IP}/authorize?username={用户}&password={密码}
```
### 2. 获取通道状态
```
GET http://{IP}/service/running/channel
```
返回示例:
```json
[
{"ch": "1", "state": "1"},
{"ch": "2", "state": "0"}
]
```
### 3. 获取录音列表
```
GET http://{IP}/service/record/~/time[开始时间戳,结束时间戳]
```
返回示例:
```json
[
{
"id": "12345",
"channel": "1",
"phone": "13800138000",
"file": "/recordings/20260520/xxx.wav",
"begtime": 1716192000,
"endtime": 1716192120,
"state": "1"
}
]
```
### 4. 下载录音文件
```
GET http://{IP}{文件路径}
```
## 🔍 日志说明
同步过程会输出详细日志:
```
========== 定时任务触发: VAA录音盒同步 ==========
开始同步设备: ID=device-001, 机构=黄山市局, IP=192.168.1.100:80
正在登录设备...
登录成功
获取录音列表: http://192.168.1.100/service/record/~/time[1716105600,1716192000]
获取到 5 条录音记录
开始下载录音: /recordings/20260520/xxx.wav
录音下载完成: /tmp/vaa-recordings/20260520/uuid-001/xxx.wav
录音上传OSS: https://oss.example.com/voice/黄山市局/20260520/xxx.wav
插入通话记录: device-001_12345_1716192000
设备同步完成: ID=device-001, 成功5条
========== VAA录音盒同步任务完成 ==========
```
## ⚠️ 注意事项
1. **网络连接** - 确保服务器能访问录音盒设备的IP和端口
2. **存储空间** - 确保 `/tmp/vaa-recordings` 有足够的空间
3. **时间同步** - 确保服务器时间与录音盒时间一致
4. **并发控制** - 每个设备独立执行,不会相互阻塞
5. **错误处理** - 单个设备失败不影响其他设备
## 🔄 与FTP方式的对比
| 特性 | HTTP API方式 | FTP方式 |
|------|-------------|---------|
| 连接方式 | HTTP RESTful API | FTP协议 |
| 认证方式 | URL参数认证 | 用户名密码 |
| 数据获取 | JSON API | 解析.txt索引文件 |
| 文件下载 | HTTP GET | FTP RETR |
| 实时性 | 更好(API直接查询) | 依赖文件生成 |
| 复杂度 | 较低 | 较高 |
## 📞 技术支持
如有问题,请检查:
1. 设备IP、端口、用户名、密码是否正确
2. 网络是否能访问设备
3. 数据库表结构是否正确
4. 日志中的错误信息