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.
6.4 KiB
6.4 KiB
VAA录音盒HTTP同步服务
📋 概述
基于合肥实现方案,通过HTTP API从VAA录音盒设备定时拉取录音数据并上传到OSS。
🔧 核心特性
- HTTP API通信 - 使用录音盒提供的RESTful API
- 定时同步 - 每2小时自动执行一次同步任务
- 增量同步 - 根据上次同步时间,只拉取新增录音
- 自动登录 - 每次同步前自动认证
- 通道状态更新 - 同步时更新设备通道状态
- OSS上传 - 录音文件自动上传到对象存储
- 完整日志 - 记录每次同步的结果
📊 数据流程
┌──────────────┐
│ 定时触发 │ (每2小时)
└──────┬───────┘
↓
┌──────────────┐
│ 查询设备列表 │ (YYDC_YYSB表)
└──────┬───────┘
↓
┌──────────────┐
│ HTTP登录认证 │ (/authorize)
└──────┬───────┘
↓
┌──────────────┐
│ 获取通道状态 │ (/service/running/channel)
└──────┬───────┘
↓
┌──────────────┐
│ 获取录音列表 │ (/service/record/~/time[开始,结束])
└──────┬───────┘
↓
┌──────────────┐
│ 下载录音文件 │ (HTTP下载)
└──────┬───────┘
↓
┌──────────────┐
│ 上传到OSS │ (FileUploadUtil)
└──────┬───────┘
↓
┌──────────────┐
│ 保存到数据库 │ (YYDC_YYTH表)
└──────┬───────┘
↓
┌──────────────┐
│ 记录同步日志 │ (YYDC_TBRZ表)
└──────────────┘
🗄️ 数据库表要求
YYDC_YYSB (语音设备表)
必需字段:
ID- 设备IDUUID- 设备UUIDORGAN_NAME- 机构名称ORGAN_ID- 机构IDIP- 设备IP地址PORT- 设备端口(默认80)SBYH- 设备用户名SBMM- 设备密码SFYX_ST- 是否有效('1':有效)
YYDC_SBTD (设备通道表)
必需字段:
ID- 通道IDUUID- 关联设备UUIDTDHM- 通道号码PHONE- 电话号码TDZT- 通道状态SFYX_ST- 是否有效
YYDC_YYTH (通话记录表)
必需字段:
ID- 通话ID(格式:设备ID_录音ID_开始时间戳)ORGAN_NAME,ORGAN_ID- 机构信息YYSB_ID- 语音设备IDSBTD_ID- 设备通道IDTHFX- 通话方向('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
# 本地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. 配置设备信息
在数据库中插入设备信息:
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. 配置通道信息
INSERT INTO YYDC_SBTD (ID, UUID, TDHM, PHONE, SFYX_ST)
VALUES ('channel-001', 'uuid-001', '1', '13800138000', '1');
3. 启动应用
mvn spring-boot:run
应用启动后,定时任务会自动执行。
4. 手动触发(可选)
可以通过注入 VaaSyncService 并调用 executeSync() 方法手动触发同步。
📝 VAA录音盒API说明
1. 登录认证
GET http://{IP}/authorize?username={用户}&password={密码}
2. 获取通道状态
GET http://{IP}/service/running/channel
返回示例:
[
{"ch": "1", "state": "1"},
{"ch": "2", "state": "0"}
]
3. 获取录音列表
GET http://{IP}/service/record/~/time[开始时间戳,结束时间戳]
返回示例:
[
{
"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录音盒同步任务完成 ==========
⚠️ 注意事项
- 网络连接 - 确保服务器能访问录音盒设备的IP和端口
- 存储空间 - 确保
/tmp/vaa-recordings有足够的空间 - 时间同步 - 确保服务器时间与录音盒时间一致
- 并发控制 - 每个设备独立执行,不会相互阻塞
- 错误处理 - 单个设备失败不影响其他设备
🔄 与FTP方式的对比
| 特性 | HTTP API方式 | FTP方式 |
|---|---|---|
| 连接方式 | HTTP RESTful API | FTP协议 |
| 认证方式 | URL参数认证 | 用户名密码 |
| 数据获取 | JSON API | 解析.txt索引文件 |
| 文件下载 | HTTP GET | FTP RETR |
| 实时性 | 更好(API直接查询) | 依赖文件生成 |
| 复杂度 | 较低 | 较高 |
📞 技术支持
如有问题,请检查:
- 设备IP、端口、用户名、密码是否正确
- 网络是否能访问设备
- 数据库表结构是否正确
- 日志中的错误信息