fs概述及基本使用

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/[email protected] &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:[email protected]:50055;ob;fs_nat=yes;fs_path=sip%3A1018%40183.230.169.152%3A57822%3Bob
直接呼叫sip:[email protected]: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

扫描二维码关注公众号,回复: 15274042 查看本文章

连接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 [email protected] 
sofia/internal-1/sip:[email protected]: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:[email protected]: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:[email protected]: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挂机原因

猜你喜欢

转载自blog.csdn.net/lr94V587/article/details/127209508