把 IFU 接进现有系统
1. 集成方式总览
| 方式 | 传输 | 默认监听 | 特点 |
|---|---|---|---|
| HTTP REST | TCP | 0.0.0.0:9527 |
/api/* 全部能力:登录、设置读写、计时器 CRUD 与控制 |
| WebSocket | TCP | 同端口 /ws |
服务端单向推送:timers_changed、settings_changed 实时同步(只读,不接收指令) |
| 网页控制台 | — | 同端口 / |
内置 SPA(计时器 / 设置 / 手册三页),即开即用 |
服务随主程序启动;端口与开关在桌面端「设置 → Web 控制台」修改,保存后服务自动重启生效。不使用远程管理时可整体关闭。
2. 鉴权
| 项 | 说明 |
|---|---|
| 登录 | POST /api/auth/login,body {"password":"<控制密码>"};成功返回 {"token":" |
| 默认密码 | admin123(首次部署必须修改;桌面端设置面板或 PUT /api/settings 的 webPassword 字段修改) |
| 携带方式 | 其余全部 /api/* 请求需带请求头 Authorization: Bearer |
| 令牌有效期 | 24 小时;修改密码后旧令牌立即失效 |
| 失败响应 | 403 {"error":"未提供认证令牌|令牌无效|令牌已过期"};密码错误 401 {"error":"密码错误"} |
| 不鉴权的路径 | /api/auth/login、网页静态资源(/)、WebSocket(/ws,仅推送只读状态) |
令牌为简化 JWT(三段式):签名部分由控制密码派生,因此密码即密钥——不要在日志中泄露密码与令牌。
3. 接口清单
| 接口 | 方法 | 用途 |
|---|---|---|
/api/auth/login |
POST | 登录换取 token |
/api/settings |
GET | 读全部设置(不含 webPassword) |
/api/settings |
PUT | 局部更新设置(见第 4 节字段表) |
/api/settings/reset |
POST | 恢复默认设置并清除已持久化的设置与计时器数据;当前会话内已运行的计时器保留,重启后为默认队列 |
/api/timers |
GET | 计时器列表(含当前索引) |
/api/timers |
POST | 添加计时器 |
/api/timers |
DELETE | 清空全部计时器 |
/api/timers/ |
PUT | 修改计时器(label / mode / targetMs) |
/api/timers/ |
DELETE | 删除单个计时器 |
/api/timers/ |
POST | 开始 / 暂停切换 |
/api/timers/ |
POST | 重置计时器 |
/ws |
GET(WS) | 实时推送订阅 |
4. 设置字段(PUT /api/settings,全部可选,按需携带)
| 字段 | 类型 | 说明 |
|---|---|---|
| windowOpacity | number 0.3–1.0 | 窗体透明度(默认 0.95) |
| textOpacity | number 0.3–1.0 | 计时文字透明度 |
| textColorValue | int | null | 文字颜色 ARGB;null = 自动跟随主题 |
| hoverTransparent | bool | 鼠标移出时透明 |
| alwaysOnTop | bool | 窗口置顶 |
| themeMode | string | light / dark / system |
| fontFamily | string | monospace / Orbitron / Share Tech Mono / JetBrains Mono |
| alertMethod | int 0–3 | 结束提醒:0 无 / 1 弹窗 / 2 声音 / 3 弹窗+声音 |
| soundPreset | int 0–3 | 结束提示音:0–2 为 MP3-1~3,3 为 TTS |
| ttsVoice | string | null | TTS 播报人(null = 系统默认) |
| alertVolume | number 0.0–1.0 | 提示音音量 |
| countdownAlertMethod | int 0–3 | 倒计时语音提醒方式(同上 0–3,默认 0) |
| countdownSoundPreset | int 0–3 | 倒计时提示音:0–2 为 MP3-4~6,3 为 TTS |
| countdownAlertMinutes | int[] | 剩余分钟提醒点,如 [5,3,1] |
| countdownAlertText | string | 播报文本,{time} 占位符(默认「请注意,还剩下{time}分钟」) |
| countdownEndText | string | 结束 TTS 播报文本(默认「计时结束」) |
| webEnabled | bool | Web 服务开关 |
| webPort | int | 监听端口(修改后服务自动重启) |
| webPassword | string | 控制密码(修改后旧令牌全部失效) |
成功响应:{"success":true},并通过 WebSocket 广播 settings_changed(不含密码)。
5. 计时器对象与参数
5.1 计时器对象(GET /api/timers 返回)
{
"timers": [{
"id": "uuid",
"label": "15分0秒",
"mode": "countDown | countUp",
"state": "idle | running | paused | finished",
"displayMs": 899990,
"formatted": "15:00",
"targetMs": 900000,
"elapsedMs": 10,
"shortcutKey": "1",
"shortcutModifier": "Control"
}],
"currentIndex": 0
}
formatted:超过 1 小时显示HH:MM:SS,否则MM:SSdisplayMs:倒计时为剩余值,正计时为已计值
5.2 添加计时器(POST /api/timers)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| label | string | 否 | 名称,默认「计时器」 |
| mode | string | 否 | countdown(默认)/ countup |
| targetMs | int | 否 | 目标时长毫秒,默认 900000(15 分钟) |
返回:{"success":true,"id":"<新计时器id>"}
6. WebSocket 推送(/ws)
连接后由服务端单向推送,消息结构:
{"event": "timers_changed", "data": {"timers": [ ... 同 5.1 ... ], "currentIndex": 0}}
{"event": "settings_changed", "data": { ... 同 GET /api/settings ... }}
timers_changed:计时器增删改、状态与进度变化时推送(进度随计时持续刷新);settings_changed:任意设置变更时推送(本地、API、控制台改动同源);- 客户端向
/ws发送的消息服务端不处理;连接无鉴权,请依赖内网边界保护。
7. 错误码与响应约定
| HTTP | 含义 | 处理建议 |
|---|---|---|
| 200 | 成功 | 业务结果见 body |
| 400 | 请求格式错误 / 参数非法 | 核对 JSON 与字段类型 |
| 401 | 登录密码错误 | 核对控制密码 |
| 403 | 未携带 / 无效 / 过期令牌 | 重新登录换取 token |
| 404 | 计时器不存在 | 先 GET /api/timers 核对 id |
| 500 | 服务器内部错误 | 查看桌面端日志,联系技术支持 |
错误 body 统一为 {"error":"<中文说明>"}。
8. 调用示例
8.1 登录并添加计时器(curl)
# 登录
TOKEN=$(curl -s -X POST http://192.168.1.100:9527/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"password":"admin123"}' | sed 's/.*"token":"\([^"]*\)".*/\1/')
# 添加 10 分钟倒计时
curl -X POST http://192.168.1.100:9527/api/timers \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"label":"嘉宾发言","mode":"countdown","targetMs":600000}'
# 立即开始它(toggle)
curl -X POST http://192.168.1.100:9527/api/timers//toggle \
-H "Authorization: Bearer $TOKEN"
8.2 修改剩余提醒点与播报文本
curl -X PUT http://192.168.1.100:9527/api/settings \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"countdownAlertMinutes":[10,5,3,1],"countdownAlertText":"请注意,还剩下{time}分钟","countdownAlertMethod":3}'
8.3 实时订阅计时状态(Node.js)
const WebSocket = require('ws')
const ws = new WebSocket('ws://192.168.1.100:9527/ws')
ws.on('message', m => {
const msg = JSON.parse(m)
if (msg.event === 'timers_changed') {
const cur = msg.data.timers[msg.data.currentIndex]
console.log(cur.label, cur.state, cur.formatted)
}
})
9. 集成注意事项
- 单端口承载网页 + API + WebSocket;客户端并发无硬限制,控制台与集成方共存没有问题;
- REST 无幂等键:重复
toggle会来回切换状态,集成方建议以GET /api/timers的state为准再操作; settings/reset会恢复默认设置并清除持久化数据(当前会话正在运行的计时器不受影响,重启后回到默认队列);集成时避免在会中误调;- WebSocket 推送频率与计时节拍一致(约 500ms),第三方界面无需自行轮询;
- 所有设置类修改即时持久化,主程序重启后仍生效。