基于Freeswitch的 呼叫中心中间件开发

  最近开发一个 呼叫中心中间件,也可以让用户不懂呼叫系统完成复杂的呼叫业务。

  

模块里面我集成了 WebSocket RESTFul API 服务器端

ws://192.168.0.250:8092/appid=xxxx&appkey=xxxxx&timestamp=时间戳&sign=xxxxxxxxxx

签名规则 sign=md5(appid+appkey+timestamp+"callback") 不含"+"

心跳规则:

客户端发送 {"Request": {type":"HEART_BEAT", "timestamp": "时间戳" } }

服务器返回 {"Response": {type":"HEART_BEAT","timestamp": "时间戳" } }

 

回拨呼叫
dispcaller 呼叫主叫显示的号码
dispcallee 呼叫被叫显示的号码
caller 主叫号码
callee 被叫号码
callid 呼叫ID 必须唯一 32位或64位
record 是否录音 true|false
timelong 通话时长
userdata 自定义数据

{ "Request": { "dial": {"dispcaller":"9001","dispcallee":"9000", "caller": "9000", "callee": "9001", "callid": "12345657586960", "record": "true", "timelong":"1000" ,"userdata":"test"} } }


#话单返回
callid 呼叫提交的ID
caller_id_number 主叫
dispcaller 呼叫主叫显示的号码
dispcallee 呼叫被叫显示的号码
destination_number 被叫号码
start_stamp 呼叫开始
answer_stamp 呼叫应答
end_stamp 呼叫结束
recordfile 录音文件路径
duration 通话时长
billsec 计费时长
hangup_cause 挂机原因

完整返回:

{"Response": {"appid": "111111","cdr": { "context":"callbak", "caller_id_number":"9001","dispcaller":"9001",,"dispcallee":"9000","destination_number":"9000","start_stamp":"2019-06-11 17:52:07", "answer_stamp":"2019-06-11 17:52:10","end_stamp":"2019-06-11 17:52:19","channel_name":"sofia/internal/9000@192.168.0.137:5060","bridge_channel":"sofia/internal/9001@192.168.0.137:5060","duration":"12","billsec":"9","hangup_cause":"NORMAL_CLEARING","callid":"12345657586960","recordfile":"","userdata":"test"}}}

 


#呼叫状态异步返回
{"Response": {"appid": "12345678","callstate": {"callbacka_active":"主叫是否接通",state":"EARLY|DIALING|RING_WAIT|ACTIVE","callid": "呼叫ID","timestamp":"时间戳","uuid" : "服务端通话ID" }}}

{"Response": {"appid": "111111","callstate": {"callbacka_active":"false","state":"RINGING","callid": "12345657586960","timestamp":"1560246727","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}

{"Response": {"appid": "111111","callstate": {"callbacka_active":"false","state":"ACTIVE","callid": "12345657586960","timestamp":"1560246730","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}

{"Response": {"appid": "111111","callstate": {"callbacka_active":"true","state":"RING_WAIT","callid": "12345657586960","timestamp":"1560246730","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}

{"Response": {"appid": "111111","callstate": {"callbacka_active":"true","state":"ACTIVE","callid": "12345657586960","timestamp":"1560246732","uuid":"1defac04-8727-49b2-b19d-86b60fca7e0d" }}}


#呼叫控制
uuid cti呼叫状态返回主叫的 通话UUID


1、挂断当前通话
{ "Request": { "hangup": { "uuid": "cc70b4b6-b041-49bf-adc5-ffd51e0ef780"} } }

2、监听某个通话
{ "Request": { "monitor": { "uuid": "ad6ac4ea-0f33-4108-85e2-1586a71a939d","caller":"显示的主叫号码","callee":"监听者的号码"} } }

3、通话转接
{ "Request": { "transfer": { "uuid": "903aee0b-1bc1-45a3-92b0-2c615c21aaa9","caller":"显示的主叫号码","callee":"要转移号码"} } }

4、被叫通话保持
state true 开启 false 关闭

{ "Request": { "hold": { "uuid": "55e27e6d-88ab-4b3e-93f7-d049dd6eba21","state":"true"} } }

 


http api 中继管理
提交方式:POST
提交数据 Body raw 类型字段
签名规则 sign=md5(appid+appkey+timestamp+"api") 不含"+"

RESTFul API

ip:8092/api/v1/gatewayAdd 增加中继

appid
appkey
timestamp
sign
name 中继名称必须唯一
enable 是否启用
ip 对方IP 地址
port 对方端口
bypass_media 媒体绕过服务器 默认false 否则不能录音
register IP对接:false SIP注册:true goip注册:in 呼叫本地SIP:local
username SIP注册用户名
auth-username IMS认证用户名
userpwd SIP注册用户密码
prefix 拨号前缀
prefix_replace 拨号替换规则
limit_caller 强制主叫号码
from-domain IMS 对接域地址
limit_count 并发限制


ip:8092/api/v1/gatewayDel 删除中继
appid
appkey
timestamp
sign
name 中继名称必须唯一

ip:8092/api/v1/gatewayGet 获取中继
appid
appkey
timestamp
sign
limit 返回的行数
offset 开始的行数

 


http api SIP用户管理
提交方式:POST
提交数据 Body raw 类型字段

http://192.168.0.250:8092/api/v1/sipuserAdd 增加SIP用户
appid
appkey
timestamp
sign
accountcode SIP账号
secret SIP密码
calltyp 呼叫类别 in:呼入 out:呼出 all:呼入呼出
record 是否录音

http://192.168.0.250:8092/api/v1/sipuserDel 删除SIP用户
appid
appkey
timestamp
sign
accountcode SIP账号

http://192.168.0.250:8092/api/v1/sipuserGet 获取SIP用户
appid
appkey
timestamp
sign
limit 返回的行数
offset 开始的行数

 

posted on 2019-06-18 17:22  QQ10053660  阅读(2880)  评论(2编辑  收藏  举报