智能拨号器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 | 初始版本,基于当前实现整理。 |


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

相关推荐
新时代牛马8 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
上海云盾-小余9 小时前
BGP 高防底层原理:TCP 异常流量识别与清洗机制
运维·网络·tcp/ip
captain3769 小时前
▲网络原理(2)-TCP
java·服务器·网络·tcp/ip·java-ee
同元软控10 小时前
从排队、碰撞到信号波形:基于Sysevents的网络—信号一体化仿真
网络
言乐610 小时前
Python加速器4跨境网络加速器
运维·服务器·开发语言·网络·python
疯狂打码的少年12 小时前
【计算机网络】IPv6基础(特点、表示法、与IPv4对比)
网络·笔记·计算机网络
门思科技12 小时前
LoRaWAN 网络容量估算:一个 SX1302 网关到底能带多少设备
开发语言·网络·php
今天AI了吗16 小时前
什么是 AI Agent?它与直接调用大模型 API 有何区别
java·网络·人工智能·架构·java-ee
小祺先生17 小时前
mt7921 debian系统 如何安装驱动
运维·网络·debian
qq_5085760917 小时前
机器人通讯协议
网络·机器人