PRI是实际物理线路, sip trunk是ip虚拟连接
ACD(Automatic Call Distributor) 自动呼叫分配,也叫智能选择座席. ACD掌握坐席状态,是否分配呼叫 若acd未拦截,则sip终端代理(话机)能判别当前状态、指示用户放音、回复响应
IVR(Interactive Voice Response) 交互式语音响应、电话语音菜单 freeswitch/conf/autoload_configs/ivr.conf.xml
CTI(computer telephony integration) 计算机电话集成 呼叫中心中间件 acd属于cti功能一部分
FS呼叫流程控制:xml dialplan ,嵌入式脚本
重新加载模块module_exists mod_da2; reload mod_da2
新增模块:modules.conf增加模块/去掉注释; 全部重新编译make && make install/指定重新编译在src/mod/的模块make && make install; 重启fs
freeswitch/conf 配置文件目录 配合find查找
vars.xml #全局变量配置文件 X-PRE-PROCESS标签 呼叫port
freeswitch.xml #将所有配置文件粘贴到一起 X-PRE-PROCESS预处理指令,做简单替换。不能注释,只能破坏。XPRE-PROCESS(见手册88)
autoload_configs/switch.conf.xml #freeswitch配置文件,快捷键文件 autoload_configs 在启动时装入配置文件 rtp监听port
autoload_configs/modules.conf.xml #配置启动时加载哪些模块
autoload_configs/event_socket.conf.xml #记录fs端口密码 fs的port
autoload_configs/acl.conf.xml #ACL鉴权配置
autoload_configs/ivr.conf.xml #引入所有IVR语音菜单配置
autoload_configs/callcenter.conf.xml #呼叫中心排队策略配置
autoload_configs/conference.conf.xml #会议配置文件 DTMF按键控制功能,profile项
autoload_configs/cdr_csv.conf.xml #CSV话单配置文件
autoload_configs/lua.conf.xml #LUA配置文件 如 自启动lua脚本,lua环境变量路径,lua绑定回调提供动态xml dialplan
autoload_configs/local_stream.conf.xml #sream流声音配置(music on hold, local_stream://moh)
静音流 silence_stream://2000[,1400] 舒适噪音2s,噪音数值1400(越小声音越大)
铃音流 tone_stream://%(1000,4000,450);loop=3 1s通,4s断,450hz信号,循环3次
lang/*/*.xml #phrase短语框架的语音 宏定义
dialplan/ #拨号计划, 对进来的电话进行路由,出局路由、入局路由。 相当于路由表
出局用default路由,匹配号码会加前缀,如0,但在送出时会吃掉0,端口用5080(5080不用鉴权,呼叫本地注册用户用5060);出局的对端用户(入局端)路由用public
来话注册在本服务用default路由,不在本服务用public路由
bgapi originate sofia/external/6000@192.17.19.2 &echo #呼叫别的系统用户
directory/default/ #配置本地用户信息 params公共参数,variables公共变量,当重复出现在xml时,标签优先级为user>group>domain user_context指定拨号计划
sip_profiles/ #sip网关配置,如rtp、sip ip,编解码,媒体音 查询指定profile配置 sofia status profile internal
freeswitch/log/freeswitch.log #日志
freeswitch/log/freeswitch.xml.fsxml #内部所有xml文件的内存镜像 解析freeswitch.xml生成
X-PRE-PROCESS 预处理指令常用app命令:
include 包含文件,用于freeswitch.xml
set 设定全局变量, vars.xml(88页) 全局变量$$ (通道变量)临时变量$ 在控制台可查询全局变量值, 如:global_getvar base_dir
通道变量 与呼叫有关,影响呼叫流程且可以被动态改变,仅在channel生命周期有效; 全局变量 仅在预处理阶段被求值;
常用app命令:
log 打印日志
set 设定通道变量($),只对当前腿leg生效 +变量赋值 data="export_var=var1,var2..."等价于export同步变量到b-leg
unset 取消变量定义 等价set data="var=_undef_"
info 打印全部通道变量
export 设定变量,对所有腿leg生效. data="nolocal..."不对本地腿生效(channel),设置b-leg
hash 保存数据到hash表
bind_meta_app 在该channel上绑定DTMF(按键)
bridge 桥接另一条腿 +对象 bridge先判断对端用户是否注册;bridge成功会一直阻塞,一直等到有人挂机或错误挂机
bridge场景:A呼B:A到fs建立a-leg,fs桥接到B建立b-leg。
A主叫挂机; a-leg,b-leg释放,拨号计划dialplan停止
B被叫挂机; b-leg释放,a-leg保留,继续dialplan的action。控制后续action的变量有:
Hangup_after_bridge B接通正常挂机
Continue_on_fail B未接通,拒接,在忙,久叫不应
注意:!!! 只有(answer)应答后,才建立真正的流媒体 !!!
answer 应答 fs做被叫时,若要给主叫放音,必须先应答answer
playback 放音 +放音文件 必须先answer 仅针对单个channel声道
endless_playback 无限循环
loop_playback 指定次数循环
say 统一放音接口,支持多语言 <action application="say" data="en NUMBER ITERATED 1234"/>
record 单腿录音(阻塞式) 必须先answer 单腿录音可由playback播放验证(双腿播放会先进行混音)
record_session 录音(非阻塞,单双腿均可) 对应API uuid_record <channel-uid> start/stop <record-path>""
echo、park、hold #回声;挂起;保持
conference 会议 隐含answer
transfer 转接,重新转接到routing阶段,在dialplan路由
sleep 等待(ms) +时间
ring_ready 在sip中给对方回180 振铃
pre—-answer 在sip中给对方回183 回铃音(早期媒体)
read 放音并等待接收DTMF按键(拨号按键,常用于自助服务)
<minlen> <maxlen> <soundfile> <var name> <timeout> <terminators> #如请输入您的身份证号码,按#号键结束
play_and_get_digits 与read类似,但更高级(手册154页)
ivr 电话语音菜单
speak 文字语音合成 ('engine|speaker|text')
拨号计划 目录:freeswitch/conf/dialplan/ 路由收到的呼叫:对端号码需在fs注册,在拨号计划有extension路由
核心三要素: Dialplan Context Extension
结构:
Context
Extension #扩展;电话分机
Condition #测试条件判断,满足则执行action 号码destination_number 时间wday hour
Action #动作,满足最近Condition执行。 一般是先hunting所有,再execut;加上内联参数inline="true"立马执行,不用在execut阶段
anti-action #反动作, 不满足最近Condition执行
在日志里的标识: mod_dialplan_xml.c:637 Processing 1018 <1018>->1019 in context msxf
通道变量(临时变量):
查看该通道所有变量: 在拨号计划加入 application="info"。 #因为通道变量与呼叫有关,没有呼叫时无法查询。
测试条件 condition :
配合 break 形成逻辑判断。 默认on-false(失败停止); on-true(成功停止); alway(都停止); never(都继续)
Action 调用app语句: 一般是先hunting所有action操作,再execut;但 加上内联参数inline="true"立马执行,不用在execut阶段。 --inline,app必须很快执行
在拨号计划dailplan中使用API: ${API(parms)}
${sofia_contact(user/1001)} ${status()} 类似于函数调用,有参数的需放在括号内
<action application="bridge" data="${sofia_contact(user/$1)}"/>
<action application="set" data="${res=${status()}}"/>
拨号计划的主要作用是在fs路由表查找对端的sip地址,如果知道对端的sip地址可直接呼叫(前提不要注册到fs上。在当前测试环境无法实现,话机必须注册到fs才能登录。硬电话或许可行?)。
查询sip地址:sofia_contact user/1018
sofia/internal-1/sip:1018@172.17.161.162:50055;ob;fs_nat=yes;fs_path=sip%3A1018%40183.230.169.152%3A57822%3Bob
直接呼叫sip:1018@172.17.161.162:50055即可 -- 注册到fs呼叫,还是会到fs走拨号计划
在docker家目录配置.fs_cli_conf, 快速链接fs fs server0(见手册71页) ip可配0网卡ip
[server0]
host => 10.247.104.158
port => 48021
password => Msxf_ClueCon
debug =>
freeswitch 启动服务
系统控制台 shutdown 关闭服务
后台启动:freeswitch -nc 关闭:freeswitch -stop
连接freeswitch服务:fs_cli -P 端口 -p 密码 #配置在autoload_configs/event_socket.conf.xml
-x "command" #执行一条语句后退出
#fs控制台(API)
status 查询freeswitch状态 F2
reloadxml 动态生效配置文件 F6
/help 帮助 /exit /event /log /filter /debug
sofia status #查询各profile配置端口及状态 F5
sofia status profile internal #查询指定profile配置信息
sofia status profile internal-1(名字) reg #查询在指定profile注册用户信息
sofia_contact user/1018 #根据用户注册地址扩展成 sofia逻辑地址 和 nat地址 sofia_contact 1018@10.247.104.158
sofia/internal-1/sip:1018@172.17.161.162:55674;ob;fs_nat=yes;fs_path=sip%3A1018%40183.230.169.152%3A46136%3Bo
originate user/1019 &echo #呼叫1019,得先注册成功 originate用fs发起呼叫;user/1019呼叫字符串,找到sip地址;echo回音程序,充当channel另一端,自己和自己说话
#park "挂起"等待无声音; hold "保持"等待保持音 echo、park、hold都是充当channel的另一端,实现“单腿通话”,用户和app通话
originate user/1019 &playback(/root/test.wav) #playback(path)放音 record(path)录音
originate user/1019 &bridge(user/1018) #桥接 先originate建channel呼叫1019,1019接听后在该leg上调用bridge,建channel呼叫1018(建立桥接关系)
sofia global siptrace on/off #开启、关闭sip消息
sofia loglevel all 9 #设置sofia协议栈底层日志 sofia可查看命令帮助
originate user/1018,user/1019 &echo
originate user/1019 9196 XML msxf
解析:
originate Api,产生channel originate不通会导致fs阻塞,建议加上bgapi originate。。。
user/1019 呼叫用户1(呼叫字符串)
9192 呼叫用户2,在dialplan里的 destination_number
9196 XML msxf 在默认的拨号xml文件,找context为msxf,destination_number涵盖9196的extension
此方式需要修改xml文件,并重新加载。对于小的测试过程,建议使用内联拨号计划(inline dialplan)。
例: originate user/1000 playback:/tmp/tmp.wav,bridge:user/1001 inline
#app默认以逗号分隔,有冲突时可修改m:^改为以^分隔。
originate user/1000 ‘m:^playback:/tmp/tmp.wav^bridge:{a=true,b=false}user/1001’inline
originate用法
bgapi originate user/1019 &echo #呼叫字符串格式:类型/参数/参数 user/1019 从本地注册用户查找该用户联系地址
bgapi originate sofia/internal-1/sip:1018@183.230.169.152:21607 &echo #sip的nat联系地址,非sofia地址(sofia_contact的fs_path部分,或信令的route)
bgapi originate user/1019 9196 XML msxf #转入拨号计划 在xml里找context=msxf,destination_number=9196的分机号
bgapi originate user/1019 9196 XML msxf 'T wei' 12580 20 #自定义呼叫时的 self主叫名称 号码 invite超时秒数
bgapi originate sofia/internal-1/sip:1018@192.168.169.152:21607 &echo XML default 'T wei' 12580 20
bgapi originate {origination_caller_id_number=7777}user/1019 &bridge({origination_caller_id_number=7788}user/1018) #使用通道变量设置两条腿的来电显示
origination_caller_id_number设置当前腿的来电显示(a,b腿)、 effective_caller_id_number设置另一条腿的来电显示(只能在a腿设置)
bgapi originate {ignore_early_media=true}sofia/gateway/gw/1389000000 &palyback(/tmp/a.wav) #放音忽略183早期媒体
bgapi originate {instant_ringback=ture}{transfer_ringback=local_stream://moh}user/1019 &bridge(user/1018)
transfer_ringback收到bleg180时播放播放回铃音 instant_ringback立即播放
bgapi originate user/1019 &ivr(msxf_ivr) #ivr(ivr_menus下menu name)电话语音菜单 呼入可在拨号计划设置ivr phrase:msxf_ivr_main_menu语音xml短语
bgapi originate user/1019 &lua(/tmp/a.lua) #执行指定lua
FS只对呼入鉴权: 先ACL,失败再密码鉴权
1.ACL访问控制列表 -- IP鉴权,不知道用户信息,只能用profile的context(对应拨号计划文件) freeswitch/conf/autoload_configs/acl.conf.xml
2.密码鉴权 -- 在directory找注册用户,使用 user_context 的拨号计划文件
常用事件说明
CUSTOM事件:模块内部事件,如sofia,conference,fifi。Event-Name永远为CUSTOM,具体事件以Event-Subclass区分。
Channel(状态)事件:跟channel状态有关,以CHANNEL_开头,事件携带变量以variable_开头
来去话 -- CHANNEL_CREATE uuid为Unique-ID
sip收到100或180 -- CHANNEL_PROGRESS
若收到183(Early Media)-- CHANNEL_PROGRESS_MEDIA
应答 -- CHANNEL_ANSWER
两个channel桥接成功 -- CHANNEL_BRIGE (仅在主动bridge产生,对端无)
挂机 -- CHANNEL_HANGUP和CHANNEL_HANGUP_COMPLETE
销毁channel – CHANNEL_DESTROY
执行APP时:CHANNEL_EXECUTE APP执行完毕:CHANNEL_EXECUTE_COMPLETE
Channel相关事件:与channel有关,不以CHANNEL_开头
如PLAYBACK_START, PLAYBACK_STOP,RECORD_START,DTMF
系统事件:
startup系统启动,shutdown系统关闭,module_load模块加载,module_unload,heartbeat心跳消息,API api产生,BACKGROUND_JOB bgapi产生
新增网关,新增用户话机拨打电话:
在freeswitch/conf/sip_profiles添加网关,重启fs生效。 Sofia profile rescan ReloadXML
在freeswitch/conf/directory/default下新增用户xml信息
freeswitch/conf/dialplan 修改拨号计划,让其他人可以呼叫到它
reloadxml 动态生效配置文件
注:sip注册话机若失败,可能和sip server\proxy 未配有关
curl ifconfig.me #在内网root获取公网ip
STUN服务器(适用于锥形NAT):接收内网消息,响应内网被映射的外网地址端口
TURN(适用于对称NAT):中间人转发,固定服务器ip+port
ICE(锥形、对称NAT):提供多个候选地址(内网,stun,turn),选最优
#默认0-19
<extension name="local_extenstion">
<condition field="destination_number" expression="^(101[0-9])$">
<action application="bridge" data="${sofia_contact(internal-1/$1$2)}"/> # $1表示通配所匹配到的字符串,如1019
</condition>
</extension>
#自定义号码
<extension name="139">
<condition field="destination_number" expression="^(13[89]\d{8})$">
<action application="bridge" data="${sofia_contact(user/$1)}"/>
</condition>
</extension>
查错过程:
A->B, fs无日志:呼叫未到fs,检查A的fsIP,防火墙设置等
到fs,但不通:1.查dialplan拨号计划是否找到 2.返回的HangUp Cause挂机原因