智能拨号器APP-外部WebSocket话单推送系统接口文档

序言

前面有读者反馈说,智能拨号器APP有没有办法在SIP协议之外,能让CRM后台远程推送号码过来进行打电话操作,以及话单录音在通话后推送到CRM的接口。

原先的做法是让用户的CRM连接到智能拨号器配套的阿里云服务器,然后它使用稳定的TCP连接将号码下发到智能拨号器APP。很明显,引入了中间环节,增加了服务器负担。并且从数据安全边界的角度而言也不合适。

由此,智能拨号器APP在电话语音拦截的基础之上,于APP设置中增加了配置外部第三方WebSocket稳定连接的能力,供第三方CRM直接跟手机APP进行数据交互。

体验和下载地址:

智能拨号器App: http://120.78.211.195:8060/Dialer.apk

智能拨号器APP

外部WebSocket话单推送系统接口文档

1. 概述

本系统用于实现服务端(C#/Java/Node.js 等)与 Android 客户端之间的实时话单推送、通话控制及录音文件上传功能。

WebSocket 负责实时双向消息传递(命令下发、状态上报、话单推送)。

HTTP 负责录音文件及 ASR 文本文件的上传。

服务端需要同时提供:

1)WebSocket 服务(维持长连接,用于下发号码进行外呼,以及话单返回)

2)HTTP 文件上传服务(用于录音和ASR通话内容文本的推送)

基础 URL:

WebSocket:示例ws://120.78.211.195:8070/json

HTTP 上传:http://120.78.211.195:8071/upload/


2. 交互流程概览

3. WebSocket 接口列表

3.1 客户端 → 服务端

|----------|-----|-----------|---------------------------------------|
| 命令 (cmd) | 方向 | 说明 | 必填字段 |
| REGISTER | C→S | 客户端注册身份 | userName, deviceId, timestamp |
| STATUS | C→S | 上报通话忙碌状态 | isBusy (bool) |
| CALL_END | C→S | 挂断并上报话单 | sessionId, phone, duration, recordUrl |
| ping | C→S | 心跳请求(纯文本) | 无 |

3.2 服务端 → 客户端

|---------------|-----|-----------|----------------------------|
| 命令 (cmd) | 方向 | 说明 | 字段 |
| REGISTER_RESP | S→C | 注册响应 | status, message, uploadUrl |
| CALL | S→C | 主动下发呼叫指令 | phone, sessionId, sim(可选) |
| STATUS_RESP | S→C | 状态上报响应 | status |
| CALL_END_RESP | S→C | 话单上报响应 | status |
| ERROR | S→C | 错误响应 | message |
| pong | S→C | 心跳响应(纯文本) | 无 |


4. JSON 消息格式(平铺,无 data 封装)

4.1 REGISTER(客户端→服务端)

json

{ "cmd": "REGISTER", "userName": "张三", "deviceId": "device_123456", "timestamp": 1700000000000}

4.2 REGISTER_RESP(服务端→客户端)

json

{ "cmd": "REGISTER_RESP", "status": "ok", "message": "注册成功", "uploadUrl": "http://192.168.31.240:8071/upload/"}

uploadUrl 后续用于 HTTP 文件上传。

4.3 STATUS(客户端→服务端)

json

{ "cmd": "STATUS", "isBusy": true}

通话开始时发 true,挂断后发 false。

4.4 STATUS_RESP(服务端→客户端)

json

{ "cmd": "STATUS_RESP", "status": "ok"}

4.5 CALL(服务端→客户端)

json

{ "cmd": "CALL", "phone": "10086", "sessionId": "uuid-xxxx", "sim": "sim1" // 可选 }

4.6 CALL_END(客户端→服务端)

json

{ "cmd": "CALL_END", "sessionId": "uuid-xxxx", "phone": "10086", "duration": 120, "recordUrl": "http://192.168.31.240:8070/recordings/10086_20260822015445.mp3", "aiLevelId": 3, // 可选 "aiLevelName": "优秀" // 可选 }

4.7 CALL_END_RESP(服务端→客户端)

json

{ "cmd": "CALL_END_RESP", "status": "ok"}

4.8 ERROR(服务端→客户端)

json

{ "cmd": "ERROR", "message": "注册失败: 用户名已存在"}


5. HTTP 文件上传接口

URL :POST {uploadUrl}(例如 http://192.168.31.240:8071/upload/)

Content-Type :multipart/form-data

字段说明

|--------------|--------|----|----------------------------------------|
| 字段名 | 类型 | 必填 | 说明 |
| baseFileName | string | 是 | 录音文件名,如 10086_20260822015445.mp3 |
| sessionId | string | 是 | 关联会话ID(可与baseFileName一致) |
| audioFile | file | 是 | 录音文件(.mp3/.wav等) |
| farTextFile | file | 否 | 麦克风注入的ASR文本文件,命名为 {baseFileName}.0.txt |
| nearTextFile | file | 否 | 对方说话的ASR文本文件,命名为 {baseFileName}.1.txt |

响应 (成功,HTTP 200):

json

{ "url": "http://192.168.31.240:8070/recordings/10086_20260822015445.mp3"}

此 URL 即为客户端在 CALL_END 中需填入的 recordUrl。

响应 (失败,HTTP 4xx/5xx):

返回纯文本错误信息(如 "No audio file uploaded")或 JSON 格式错误(根据服务端实现)。


6. 心跳机制

客户端每隔 30 秒 发送一次纯文本 "ping"。

服务端收到后必须回复纯文本 "pong"。

若服务端超时未收到 ping,可主动关闭连接;若客户端未收到 pong,应触发重连逻辑。


7. 错误处理与重连

注册超时 :服务端应在客户端连接后 10 秒内收到 REGISTER,否则主动关闭连接(防攻击)。

消息频率限制 :服务端可限制每分钟最多 60 条消息,超出回复 ERROR 并断开。

客户端重连 :当 WebSocket 异常断开时,客户端应自动重连(指数退避,初始 5 秒,最大 30 秒)。

重连后需重新发送 REGISTER,服务端应重新下发 uploadUrl。


8. 服务端实现注意事项

WebSocket 服务路径 :务必保持长连接,否则手机智能拨号器APP无法接收到下发的外呼电话号码。

HTTP 上传服务路径 :http和https均可以,用于接收电话通话的录音文件,以及智能拨号器APP对通话双方做的ASR通话文字内容文件。

文件存储目录 :建议自行将话单和录音做持久化存储,符合各方面的等保要求,确保写权限。

录音文件访问 URL :返回的 url 应提供 HTTP 静态文件服务(如使用 Nginx 或内置静态服务器)。

安全性

内网环境可忽略证书,公网建议使用 wss:// 和 https://。

可增加 Token 校验(如注册时携带密钥)。

并发 :服务端需支持多个客户端同时连接,每个客户端对应一个手机中智能拨号器应用APP。


9. 示例交互(正常流程)

客户端 → ws://ip:8070/call

客户端 → {"cmd":"REGISTER","userName":"admin","deviceId":"abc","timestamp":...}

服务端 → {"cmd":"REGISTER_RESP","status":"ok","message":"注册成功","uploadUrl":"http://ip:8071/upload/"}

每 30 秒 ping ↔ pong

服务端 → {"cmd":"CALL","phone":"10086","sessionId":"sess-001"}

客户端 → {"cmd":"STATUS","isBusy":true}

通话结束,客户端上传 audioFile、farTextFile、nearTextFile 到 http://ip:8071/upload/

HTTP 服务端 → {"url":"http://ip:8070/recordings/10086_20260822015445.mp3"}

客户端 → {"cmd":"CALL_END","sessionId":"sess-001","phone":"10086","duration":30,

"recordUrl":"http://ip:8070/recordings/10086_20260822015445.mp3"}

服务端 → {"cmd":"CALL_END_RESP","status":"ok"}

客户端 → {"cmd":"STATUS","isBusy":false}


10. 版本历史

|------|------------|----------------|
| 版本 | 日期 | 修改内容 |
| v1.0 | 2026-07-23 | 初始版本,基于当前实现整理。 |


文档结束。 如有疑问,请联系开发团队。

相关推荐
南京码讯光电技术有限公司1 小时前
油气井场防爆5G路由器如何选型
网络·5g·智能路由器
见山是山-见水是水1 小时前
围绕HTTP 网络请求实战构建原生体验:设计取舍、实现与排错
网络·网络协议·http·华为·harmonyos
火云牌神1 小时前
长连接与流式推送:规范 SSE / WebSocket 实现,替换无效轮询
websocket·网络协议·架构·ai编程·流式推送
BioRunYiXue2 小时前
RACE技术全攻略:从全长克隆到靶基因验证
java·javascript·网络·人工智能·科技·算法·eclipse
脉动数据行情2 小时前
Python WebSocket 实现融通金实时行情监听
开发语言·python·websocket
幻步智能网络云专线2 小时前
幻步智能:企业跨境网络与全球组网解决方案
网络
liukuang1103 小时前
董宇辉带走流量,东方甄选留下印钞机
大数据·网络·人工智能
飞翔的火箭弹3 小时前
企业网络资产管理用什么系统工具
开发语言·网络·php
Brilliantwxx3 小时前
【Linux】 进程(5) 僵尸进程与内存泄漏扩展
linux·运维·服务器·网络·c++