FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898
一幅图说明FSGUI
控制接口:http://www.6fok.com/topics/13
会议接口:http://www.6fok.com/topics/14
python 事件通知示例:http://www.6fok.com/topics/15
java调用控制接口示例: http://www.6fok.com/topics/70
python控制接口示例: https://github.com/nwaycn/FSGui/tree/master/CallInterface
来电、接通、挂机等通知的websocket接口参考:http://www.6fok.com/topics/88
http://www.nway.com.cn/uploads/2017/02/150823273563.pdf 作为参考,下载以本文中最新版为准
V2.3.2.0 : http://www.nway.com.cn/uploads/2017/03/231338123289.pdf
V2.3.1.3使用手册 : http://www.nway.com.cn/uploads/2017/02/242218125744.pdf
FSGui是由上海宁卫信息技术有限公司自主研发的新一代的呼叫平台,它将云呼叫、VOIP、PSTN、IMS、DID、IVR等集成在一起,实现将IP网络和传统通信通过语音完美结合在一起。并为第三方呼叫及事件查询提供RESTful接口。
FSGui 优势是什么?
1. 处理能力更强,内存数据库+PG+ GOLang天生的高性能。
2. 数据更安全,只要硬件到位,那我们的数据就可以进行实时热备,以及更多的如读写分离等,且数据库是PostgreSQL的,它是开源的。
3. 对接设备更丰富,从思科到avaya到华为到其它厂商均可支持。
4. 业务流与通信流分离,通信流保证最稳定的媒体能力,业务流来控制媒体内容。
5. 扩展更丰富,可以方便的引申出更多通信领域的增值服务。
6. 使用更简便,我们可以做到由GUI配置而减少初级工程师或客户人员的工作量。
7. 服务更到位,专业的人可以做专业的事。
针对FreeSWITCH开发的GUI及更底层的PBX功能扩展,小并发免费二进制
WEBServer nway_pbx_web 用于处理所有的web访问,但不包括restful接口
AUTHServer nway_pbx_auth 用于处理FreeSwitch的Register消息
PBXServer nway_pbx 业务主应用,用于处理路由,网关,IVR等呼叫业务层
FreeSwitch
Postgresql
Redis
rings/common 用于报工号等通用的一些语音彩铃
GUI测试登录: http://139.196.40.50:8080/index ,admin 123456
注:FSGui是基于FreeSwitch进行的二次封装,在特大并发时,我们采用各种优秀的其它商业套件或,Opensips、Kamailio作前置,可参考 http://www.6fok.com/topics/2
```
1. 路由管理
2. 录音管理
3. 分机管理
4. 分机组管理
5. 网关管理
6. 网关组管理
7. 区域策略管理
8. 时间策略管理
9. 报工号
10. 按键IVR
11. 自动语音智能IVR
12. 语音信箱
13. 报表管理
14. 黑名单管理
15. 彩铃管理
16. 电话会议管理
17. 控制接口,发起呼叫,记录通话过程中的各种状态,并与第三方应用进行交互
18. 会议控制接口 ,可与第三方应用进行交互
19. 与第三方CRM等对接接口,支持restful或socket,支持python php java c++ c ruby golang等开发语言
20. 转码服务(G711,G723,G722,G729,ILBC,OPUS,ARMNB,GSM...)
21. IMS接入
22. 超级ACD排队机
23. WEBRTC音频模式,SIP终端,S口设备注册
24. FIFO排队,来电队列,座席队列
25. 去电回铃检测
26. 。。。。。。
```
http://freeswitch.net.cn/100.html
来去电,摘机,挂机,响铃等消息,使用代码
https://github.com/nwaycn/FSGui/blob/master/EventOrCDR.py
Restful接口调用示例:
https://github.com/nwaycn/FSGui/tree/master/CallInterface
V2.3.5.1 beta ISO: https://pan.baidu.com/s/1jIQeV9G
V2.3.3.0 alpha RPM包: http://pan.baidu.com/s/1ge37vO3
V2.3.3.0 alpha ISO包: http://pan.baidu.com/s/1c2kqSt6
V2.3.1.3 下载 https://pan.baidu.com/s/1pL0MEmv
V2.3.1.2下载 https://pan.baidu.com/s/1gePiQY3
V2.2.1 下载 https://pan.baidu.com/s/1slctYYL
使用光盘刻录机或ultraiso等工具把iso镜像写入u盘,由光盘或u盘引导后启动,进行自动安装。
用户: root, 密码: Nway123
FSGUI主路径: /opt/fsgui
Postgresql 路径: /usr/pgsql-9.6/
Postgresql data 路径 : /db/pgsql/data
Postgresql 的超级用户 postgres的密码: Nway2017
如果修改了postgres的相关信息,则需要配置两项:
/usr/local/FSGUI/conf/app.conf 文件中为web配置
/usr/local/FSGUI/Nway.conf 文件为后台和认证服务应用的配置
这里的配置,主要是网络ip的配置
```
DEVICE="eth0"
BOOTPROTO="static" 改为static
HWADDR="08:00:27:28:44:81"
IPV6INIT="no"
NM_CONTROLLED="yes"
ONBOOT="yes" 改为yes
TYPE="Ethernet"
UUID="7d03dad6-2c06-402a-8e6b-8224764e91d3"
IPADDR=192.168.1.205 改为自己的ip
GATEWAY=192.168.1.1 实际的路由网关
NETMASK=255.255.255.0 子网掩码
```
接着,就可以重启了,就可以用了
Web管理界面为 : http://ip:8080/index admin 123456
管理控制接口地址 : http://ip:8085 认证用户在Nway.conf中:
restuser=admin
restpassword=admin
ip:8083为针对 FreeSwitch的OutBound服务
ip:3000为针对 FreeSwitch的认证服务
web访问地址:
localhost:8080 默认用户名 admin,123456
正常应会有nway_pbx_web.exe, nway_pbx_auth.exe, nway_pbx.exe三个启动,FreeSwitch和redis及Postgresql已作为服务运行
Virtual Box虚拟机安装:
下载: http://pan.baidu.com/s/1eSolxJ0
需要下载: https://www.virtualbox.org/
系统为debian 8,64位,所以一定要支持64位虚拟化
用户: root, 密码: Nway123
FSGUI主路径: /usr/local/FSGUI
Postgresql 路径: /usr/local/pgsql
Postgresql data 路径 : /db/pgsql/data
Postgresql 的超级用户 postgres的密码: Nway2017
如果修改了postgres的相关信息,则需要配置两项:
/usr/local/FSGUI/conf/app.conf 文件中为web配置
/usr/local/FSGUI/Nway.conf 文件为后台和认证服务应用的配置
从virtual box中使用这个包:
点击: 管理->导入虚拟电脑
1.
2
3.
4.
5.
6.
7.
然后就可以导入后使用啦
注意: 网络默认地址: 192.168.1.203 ,可以自行修改
Web管理界面为 : http://ip:8080/index admin 123456
管理控制接口地址 : http://ip:8085 认证用户在Nway.conf中:
restuser=admin restpassword=admin
ip:8083为针对 FreeSwitch的OutBound服务
ip:3000为针对 FreeSwitch的认证服务
暂时需要自行安装 FreeSwitch,Redis,Postgresql 编译好的基于debian 8 64位的FreeSwitch二进制包可以下载: http://pan.baidu.com/s/1hrMvI0s
或者,freeswitch,redis,nwaypbx等的二进制包,下载地址:http://pan.baidu.com/s/1o77qz8Y 需要预先安装一些第三方包,如下:
wget -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -
echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
apt-get update && apt-get install -y freeswitch-meta-all
如果是FSGui-Debian8-20161217.zip,则要如下操作:
解压压缩包到/usr/local下,保证 /usr/local/freeswitch/bin/freeswitch路径、/usr/local/nwaypbx/nway_pbx 、 /usr/local/redis/src/redis-server 是有效的
+---db
+---freeswitch
+---nwaypbx
| +---assets
| | +---avatars
| | +---bootstrap-datepicker-1.6.4-dist
| | | +---css
| | | +---js
| | | \---locales
| | +---css
| | | +---images
| | | \---img
| | +---examples
| | +---font-awesome
| | | +---4.1.0
| | | | +---css
| | | | \---fonts
| | | \---4.2.0
| | | +---css
| | | \---fonts
| | +---fonts
| | +---img
| | +---js
| | \---locales
| +---conf
| +---controllers
| +---entity
| +---libs
| +---models
| +---routers
| +---service
| +---static
| | +---css
| | +---img
| | \---js
| +---tests
| \---views
| +---agent
| +---baseconfig
| +---cdr
| +---conference
| +---dialplan
| +---dialplandetail
| +---error
| +---extension
| +---fifo
| +---gateway
| +---gatewaygroup
| +---ivr
| +---ivrdetail
| +---layout
| | \---sections
| +---log
| +---main
| +---report
| +---ring
| +---system
| +---timeplan
| \---user
\---redis
+---deps
| +---geohash-int
| +---hiredis
| | +---adapters
| | \---examples
| +---jemalloc
| | +---bin
| | +---doc
| | +---include
| | | +---jemalloc
| | | | \---internal
| | | \---msvc_compat
| | | \---C99
| | +---lib
| | +---src
| | \---test
| | +---include
| | | \---test
| | +---integration
| | +---src
| | +---stress
| | \---unit
| +---linenoise
| \---lua
| +---doc
| +---etc
| +---src
| \---test
+---src
+---tests
| +---assets
| +---cluster
| | +---tests
| | | +---helpers
| | | \---includes
| | \---tmp
| +---helpers
| +---integration
| +---sentinel
| | +---tests
| | | \---includes
| | \---tmp
| +---support
| +---tmp
| \---unit
| \---type
\---utils
+---create-cluster
+---hashtable
+---hyperloglog
+---lru
\---releasetools
按 http://freeswitch.net.cn/27.html 安装postgresql
使用pg_dump导入解压包中db/nwaycc161216.backup 确保postgresql已启动
chmod +x /usr/local/freeswitch/bin/*
chmod +x /usr/local/nwaypbx/nway_pbx*
chmod +x /usr/local/redis/src/redis-*
启动freeswitch # /usr/local/freeswitch/bin/freeswitch -nc
启动redis # /usr/local/redis/redis-server
启动nway_pbx相关的 #cd /usr/local/nwaypbx/
nohup ./nway_pbx & && nohup ./nway_pbx_web & && nohup ./nway_pbx_auth &
Changelog:
2017-5-31: V2.3.5.0 beta
修改一些bug
增加一个内置接口,记忆呼转
增加一个内置接口,export
2016-8-31 14:30
增加批量生成网关或IMS对接的gateway页面及接口, 操作步骤: 网关管理 ->网关列表-> 批量创建
然后下载模板按实际数据编辑excel表格后上传,并提交即可。
可以试着用 http://nssm.cc/commands 这个工具注册exe为windows服务
程序下载,可以从github.com上拉下对应的系统包进行运行
https://github.com/nwaycn/FSGui
对于系统运行所需的一些路径参数进行配置
进行彩铃配置前,先上传一个彩铃后,把路由配置和ivr配置中的相关彩铃先删除后,再删现有彩铃
新添加的分机,在nway_pbx_auth启动后,则ip话机或其它voip方式应用就可以注册到系统中。
7.列出分机组
这里的路由是整个系统的路由,不管是内呼内,内呼外,外呼内等,还是呼队列,ivr,分机直转都需要走这个地方的路由。
列出路由中具体路的明细,一个路由有多条明细
IVR可以嵌套,即第一层ivr下再转给第二层ivr,第二层ivr再转给第三层ivr
当前免费版不提供批量导入网关配置功能,收费版可提供
21 队列列表
23. 话单管理
用于进行了路由,ivr等变更时,需要通知后台底层应用重新加载数据,否则还是跑旧数据应用
全部为restful的接口,可以为php,c#,java,golang,ruby等开发语言提供管理控制接口,暂时分机状态需要由另一端语言去查询和操作,下个版本会全部由restful接口实现
由restful接口进行处理,即由平台发起一个conference,而不提供由平台等待外部呼叫呼入conference
更新说明:
2017-4-14:
增加呼出放音后再转呼给其他分机或外线的接口:
呼叫两个通道且放音,originate_playring
这个接口可以替代原上一个接口originage,即我们不指定播放的ring_id即可
Job_uuid 源主叫uuid get_uuid获得
Callername sip里的name
Callernum aleg 号码
Calleenum bleg 号码
A_gatewayname 如果a是外线,则要指定a的出局网关
B_gatewayname 如果b是外线,则要指定b的出局网关
A_effective_caller_id_num a到b显示的号码
B_effective_caller_id_num b到a在a上显示的号码
A_external false,true,标记a是不是外线
B_external false,true,标记b是不是外线
Ring_id , 上传后的彩铃id,在这里以字符串发送
先呼内线再呼外线
curl -H "Content-Type:application/json" -d '{"Job_uuid":"1234","Callername":"1001","Callernum":"1001","Calleenum":"018621575908","A_gatewayname":"nwaycall","B_gatewayname":"nwaycall","A_effective_caller_id_num":"18621575908","B_effective_caller_id_num":"13671947488","A_external":"false","B_external":"true","Ring_id":"35"}' -H"Authorization:Nway token" http://127.0.0.1:8085/api/originate_playring
先呼外线再呼内线
curl -H "Content-Type:application/json" -d '{"Job_uuid":"1234","Callername":"18621575908","Callernum":"018621575908","Calleenum":"1001","A_gatewayname":"nwaycall","B_gatewayname":"nwaycall",
"A_effective_caller_id_num":"18621575908",
"B_effective_caller_id_num":"13671947488","A_external":"true","B_external":"false","Ring_id":"35"}' -H "Authorization:Nway token"http://127.0.0.1:8085/api/originate_playring
两线均为外线
curl -H "Content-Type:application/json" -d '{"Job_uuid":"1234","Callername":"18621575908","Callernum":"018621575908","Calleenum":"013671947488","A_gatewayname":"nwaycall","B_gatewayname":"nwaycall","A_effective_caller_id_num":"18621575908","B_effective_caller_id_num":"13671947488","A_external":"true","B_external":"true","Ring_id":"35"}' -H "Authorization:Nway token"http://127.0.0.1:8085/api/originate_playring
增加路由和IVR过程中由外部的URL来控制业务流程:
增加接口操作类型:external_execute_uri
在IVR明细或路由明细中配置,且配置了相关的url后,则按以下业务逻辑处理
//定义
SRCNUMBER = "SrcNumber"
INGATEWAY = "InGateway"
OUTGATEWAY = "OutGateway"
DESTNUMBER = "DestNumber"
DOAMIN = "Domain"
STATUS = "Status"
STATUS_SUCCESS = "Success"
STATUS_FAILED = "Failed"
UUID = "Uuid"
RESSTRING = "restring"
//返回的控制消息指令
CTRL_RINGFILE = "RingFile"
CTRL_DTMF = "Dtmf"
CTRL_DATA = "Data"
CTRL_DIGIT_LEN = "DigitLen"
CTRL_SHORTRING = "ShortRing"
CTRL_VALIDRING = "ValidRing"
CTRL_MAX_TIMEOUT = "MaxTimeout"
CTRL_INNER_TIMEOUT = "InnerTimeout"
//OPERATE,从远程接收的命令
COMMAND = "Cmd"
BRIDGE = "bridge"
DTMF = "dtmf"
PLAYRING = "playring"
BRIDGEGROUP = "bridgeGroup"//转给座席组
TTS = "tts" //由远程返回tts数据,通过配好的tts后播放
CONFERENCE = "conference"
HANGUP = "hangup"
//处理由远程返回的http值
if C[COMMAND] == BRIDGE {
//Cmd=bridge,Data=8888
...
} else if C[COMMAND] == BRIDGEGROUP {
//Cmd=bridgeGroup,Data=9000
...
} else if C[COMMAND] == DTMF {
//Cmd=dtmf,RingFile=/tmp/longfile.wav,ShortRing=/tmp/shortfile.wav,ValidRing=/tmp/validfile.wav,DigitLen=18,MaxTimeout=360,InnerTimeout=60
var digitlen int = 1
var maxtimeout int = 360
var innertimeout int = 20
var err2 error
....
dtmf, resErr := PlayGetDigits(c,C[CTRL_RINGFILE], C[CTRL_VALIDRING], "#", digitlen,maxtimeout, innertimeout, 3)
...
}else if C[COMMAND] == PLAYRING {
//Cmd=playring,Data=/tmp/av.mpt
...
} else if C[COMMAND] == TTS {
//Cmd=tts,Data="你好,你的订单号是12345678" //暂不实现
} else if C[COMMAND] == CONFERENCE {
//Cmd=conference,Data=6000
...
} else if C[COMMAND] == HANGUP {
//Cmd=hangup
...
}