|
|
纯真的白开水
4 月前 |
把变量和正则表达式匹配,如果匹配,就执行对应的动作。详细参考 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Dialplan/XML-Dialplan/
也叫APP,就是一个功能函数,常见的APP参考 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_dptools_1970333
拨号方案的原理就是对通道变量执行正则表达式匹配,如果匹配上了,就执行对应的动作(APP)。fs的很多特性是通过设置通道变量来实现的。这里介绍一下常用的通道变量,更详细的说明参考 https://freeswitch.org/confluence/display/FREESWITCH/Channel+Variables 和 https://freeswitch.org/confluence/display/FREESWITCH/Variables+Master+List
action=“set” data=“变量=值” ,详细参考 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586661
action=“export” data=“变量=值” 详细参考 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586592/
set和export的区别是set设置的变量只作用于本通道,export设置的变量会带入到后续桥接的通道。
如果只需要给后续桥接的通道设置变量,不需要作用于本通道export设置的变量名前面加一个
nolocal:
前缀或者
_nolocal_
前缀。
action=“bridge_export” data=“变量=值” 详细参考 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586489/
bridge_export和export的区别,export只能导出到拨号方案中bridge的通道(export其实就是switch_ivr_originate中处理的),bridge_export可以导出到任何能通话的通道,包含ESL调用的uuid_bridge(bridge_export其实就是switch_ivr_multi_threaded_bridge中处理的)。
ignore_early_media 【被叫设置】忽略早期媒体,可选的值 true:忽略 consume:忽略但是可以获取数据,ring_ready:183改成180
bridge_early_media 【被叫设置】 主叫可以听到早期媒体,透传还是转码,暂时未测试
ringback 【主叫设置】设置呼叫彩铃 ,中国标准的回铃:$${cn-ring} 实际值:%(1000,4000,450)
transfer_ringback 【主叫设置】设置转接彩铃,主叫接通之后值bridge,就算转接,未设置transfer_ringback,会使用ringback。
call_timeout 【主叫设置】设置呼叫超时
originate_timeout 【被叫设置】设置呼叫超时,会覆盖call_timeout
instant_ringback=true 【主叫和被叫设置都可以】发送假回铃(被叫没发送180,主叫就先发送嘟嘟的声音)
continue_on_fail=true 【主叫设置】转接失败不要挂断主叫
sip_h_自定义头=值
添加自定义sip头到 INVITE
sip_rh_自定义头=值
添加自定义sip头到 200
sip_bye_h_自定义头=值
添加自定义sip头到 bye
sip_ph_自定义头=值
添加自定义sip头到 180 183
continue_on_answer_timeout
可以控制超时时挂机,还是继续执行拨号方案。
fs的通道变量非常多,怎么查看通话的通道变量呢,有2个方法 方法1 执行fs控制台命令
uuid_dump 通话UUID
,方法2 拨号方案里面执行fs的动作info 也可以输出通道变量,info输出的通道变量有些名字和uuid_dump的不一样,文末复制了一个fs官方文档里面的对应关系。
execute_on_answer 应答时
execute_on_pre_answer 收到183时
execute_on_pre_bridge 桥接前
execute_on_post_bridge 桥接后
execute_on_media 建立媒体时
execute_on_ring 收到180时
execute_on_tone_detect 检测到信号音时
execute_on_originate 发送呼叫请求后
execute_on_post_originate 呼叫前
execute_on_pre_originate 呼叫完成(183或者200后)
例子 应答的时候播放一个信号音
execute_on_answer_play="playback tone_stream://%(10000,0,350,440)" |
例子 应答的时候播放一个信号音
api_on_answer_play="uuid_broadcast ${uuid} tone_stream://%(10000,0,350,440) [aleg|bleg|both]" |
action=“set” data=“x=${strmicroepoch()}”
2025-05-13 06:35:57
<!-- generate random number between 1 and 100 --> |
详细参考 mod_expr说明文档 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_expr_6587353
如果编码不匹配等呼入直接拒接的,可能还没进入动作就失败了,可以在拨号方案动作是set,和export 行勾选inline ,这样就避免这个问题。
eval ${cti_http_get(http://ip?arg=${通道变量})}
set myval=${cti_http_get(http://ip?arg=${通道变量})}
{"header":{"value1":"1","value2":"2"},"body":""}
拨号方案的condition(条件),也可以调用http接口,根据返回的结果和正则表达式进行匹配。具体可以看下图的例子。注意返回的数据前后不要有空格换行等不可见字符,会导致和正则表达式匹配不上。如果返回的是json数据,expression 和json的body属性 进行正则匹配,如果返回的是非法json数据,expression 直接和返回的文本数据匹配。
cti_hash_get hash field [varname]
,cti模块定义了cti_hash_get这个同名的API和APP,用来读取redis的hash表.
hash 表的key
field hash表的 field
varname 读取到的value存放的变量
cti_hash_set hash field value
cti模块定义了cti_hash_set这个同名的API和APP,用来设置redis的hash表
APP就是一个动作,拨号方案里面可以直接添加动作,拨号方案调用API就和使用变量一样
${API名字(参数)}
,多个参数用空格隔开,可以用set 这个APP把API的返回结果写入变量。也可以嵌套使用比如
${cti_extension_exists(${cti_hash_get(callhistory@${cti_domain} ${cti_mid_string(${caller_id_number} -11)})})}
,如果不需要把返回结果写入变量,只是想执行这个API,可以用eval ,这个什么也不做的APP去调用API。
redis 创建一个 key 名字:cti_did@域名 ,类型:hash, filed 是DID号码, value为分机号。
匹配表达式写法
${cti_extension_exists(${cti_hash_get(cti_did@${cti_domain} ${destination_number}}}))}
拨号方案例子,如果 cti_hash_get 没有设置获取value的变量名参数, 就会把获取到的数据 写入 默认变量 cti_hash_get_last_result。
cti_variable hash field
,cti模块定义了cti_variable 这个同名的API和APP,用来从redis的hash表获取通道变量.
{ |
redis 创建一个 key 名字:cti_inbound_rule@域名 ,类型:hash, filed 是DID号码, value为json格式的转接规则。
{ |
cti_inbound_dest 转接目的地,如果要转接到分机,就是分机号,如果要转接给排队,就是排队号。
cti_inbound_route 转接路由,如果要转接给分机,就是internal,如果要转接给排队,就是 acd。
拨号方案的匹配表达式写法
${cti_variable(cti_inbound_rule@${cti_domain} ${destination_number})}
如果找到了规则,就把cti_inbound_dest和cti_inbound_route设置到通道变量。
APP cti_curl http://ip/app?number=${destination_number}
cti_curl 这个APP会调用http,执行接口返回的动作。
返回例子说明,数组格式,支持多个动作。
[{"application":"log","data":"INFO 3text"}]
[ |
read 放音并且读取DTMF,参数说明
<min> <max> <sound file> <variable name> <timeout> <terminators>
cti_curl 提交读取到的DTMF结果,继续返回新的放音。
如果需要实现按键错误提示音,可以使用 play_and_get_digits 代替 read, 具体可以看FreeSWITCH官方文档 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586933/
例子
action = cti_dial_exten data=1234 inband 10000
local_stream://default
配置文件->local_stream.conf 里面配置的默认保持音乐,也可以单独指定一个声音文件。
${cti_limit_inc(callin 30)}
如果超过30并发返回false,没超过返回true。
action: bind_digit_action
参数 name,按键,api:api命令,api参数 或者
比如按键1调用一个URL
action=bind_digit_action data=dtmfcallurl,1,api:cti_http_get,http://demo.ddrj.com/dtmf?uuid=c3129712-17da-4783-a8bf-530c91b84244
按键参数支持正则表达式,更详细的说明请看 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-dptools/6586414/
<action application="sched_hangup" data="[+]<time>[ <hangup_cause>]"/>
action =sched_hangup data=+60 ALLOTTED_TIMEOUT
inbound_rule是hash表的key为规则名字,value是规则配置。支持多个规则,只要成功匹配到一个规则,其他规则就不在匹配。
redis hash 表的 value(规则配置)格式如下
{ |
conditions
根据这个里面设置的条件,如果命中就执行 variables、exports、applications等配置。
是二维数组, 用于实现or和and。第一维为or,就是只需要匹配上任意一个就算命中。第二唯为and,就是必须全部匹配才算命中。
[["条件1","条件2"],["条件3"]]
这个例子中 条件1和条件2都满足才算匹配,如果条件1和条件2有一个不满足,但是条件3满足也算匹配成功。相当于
(条件1 and 条件2) or 条件3)
。
variable 用来比较的通道变量
value 要比较的值
method 比较方法
=
同
EQUAL
==
同
EQUAL
EQUAL
variable等于value,区分大小写,匹配成功
equal
variable等于value,不区分大小写,匹配成功
>
variable大于value 匹配成功
>=
variable大于等于value 匹配成功
<
variable小于value 匹配成功
<=
variable小于等于value 匹配成功
contain
variable包含value,不区分大小写,匹配成功
CONTAIN
variable包含value,区分大小写, 匹配成功
prefix
variable前缀是value,不区分大小写,匹配成功
PREFIX
variable前缀是value,区分大小写, 匹配成功
suffix
variable后缀缀是value,不区分大小写,匹配成功
SUFFIX
variable后缀是value,区分大小写, 匹配成功
regexp
使用正则表达式匹配
人工坐席直接呼入接管
添加拨号方案,并且在internal路由中启用,放到呼叫外线前面。
answer
log info uuid_cti_stop_robot ${uuid_cti_stop_robot($1 intercept)}
intercept $1
sip软件直接呼叫 intercept通话callid 进入接管
http接口先呼叫坐席,然后执行接管拨号方案
http://127.0.0.1:88/cli?key=abc&cmd=bgapi&arg=originate user/1000 intercept通话callid XML internal |
录音的例子 |
这里就不做解释了,具体参考FreeSWITCH的拨号方案写法。
支持嵌套等XML拨号方案的所有功能。
[ |
CTI模块根据顺序把cti_dialplan_extensio@domain里面的内容组合成一个拨号方案的XML文件。
variable_xxxx
)
Some variables, as shown from the
info app
, may have
variable_
in front of their names. For example, if you pass a header variable called
type
from the proxy server, it will get displayed as
variable_sip_h_type
in FreeSWITCH™. To access that variable, you should strip off the
variable_
, and just do
${sip_h_type}
. Other variables shown in the info app are prepended with channel, which should be stripped as well. The example below show a list of info app variables and the corresponding channel variable names:
<action application="set" data="initial_callee_id_name='${user_data(${dialed_extension}@${domain_name} var effective_caller_id_name)}'"/>
variable_sip_received_ip
sip_received_ip
variable_sip_received_port
sip_received_port
variable_sip_authorized
sip_authorized
variable_sip_mailbox
sip_mailbox
variable_sip_auth_username
sip_auth_username
variable_sip_auth_realm
sip_auth_realm
variable_mailbox
mailbox
variable_user_name
user_name
variable_domain_name
domain_name
variable_record_stereo
record_stereo
variable_accountcode
accountcode
Accountcode for the call. This is an arbitrary value. It can be defined in the user variables in the directory, or it can be set/modified from dialplan. The accountcode may be used to force a specific CDR CSV template for the call; if the value of the
accountcode
variable
matches the name of a template then that template will be used. This is valuable for having a specific template be used on a per-call basis. See
mod_cdr_csv
.
variable_user_context
user_context
variable_effective_caller_id_name
effective_caller_id_name
variable_effective_caller_id_number
effective_caller_id_number
variable_caller_domain
caller_domain
variable_sip_from_user
sip_from_user
variable_sip_from_uri
sip_from_uri
variable_sip_from_host
sip_from_host
variable_sip_from_user_stripped
sip_from_user_stripped
variable_sip_from_tag
sip_from_tag
variable_sofia_profile_name
sofia_profile_name
variable_sofia_profile_domain_name
sofia_profile_domain_name
variable_sip_full_route
sip_full_route
The complete contents of the Route: header.
variable_sip_full_via
sip_full_via
The complete contents of the Via: header.
variable_sip_full_from
sip_full_from
The complete contents of the From: header.
variable_sip_full_to
sip_full_to
The complete contents of the To: header.
variable_sip_req_params
sip_req_params
variable_sip_req_user
sip_req_user
variable_sip_req_uri
sip_req_uri
variable_sip_req_host
sip_req_host
variable_sip_to_params
sip_to_params
variable_sip_to_tag
sip_to_tag
variable_sip_to_user
sip_to_user
variable_sip_to_uri
sip_to_uri
variable_sip_to_host
sip_to_host
variable_sip_contact_params
sip_contact_params
variable_sip_contact_user
sip_contact_user
variable_sip_contact_port
sip_contact_port
variable_sip_contact_uri
sip_contact_uri
variable_sip_contact_host
sip_contact_host
variable_sip_invite_domain
sip_invite_domain
variable_channel_name
channel_name
variable_sip_call_id
sip_call_id
SIP header Call-ID
variable_sip_user_agent
sip_user_agent
variable_sip_via_host
sip_via_host
variable_sip_via_port
sip_via_port
variable_sip_via_rport
sip_via_rport
variable_presence_id
presence_id
variable_sip_h_P-Key-Flags
sip_h_p-key-flags
This will contain the optional P-Key-Flags header(s) that may be received from calling endpoint.
variable_switch_r_sdp
switch_r_sdp
The whole SDP received from calling endpoint.
variable_remote_media_ip
remote_media_ip
variable_remote_media_port
remote_media_port
variable_write_codec
write_codec
variable_write_rate
write_rate
variable_endpoint_disposition
endpoint_disposition
variable_dialed_ext
dialed_ext
variable_transfer_ringback
transfer_ringback
variable_call_timeout
call_timeout
variable_hangup_after_bridge
hangup_after_bridge
variable_continue_on_fail
continue_on_fail
variable_dialed_user
dialed_user
variable_dialed_domain
dialed_domain
variable_sip_redirect_contact_user_0
sip_redirect_contact_user_0
variable_sip_redirect_contact_host_0
sip_redirect_contact_host_0
variable_sip_h_Referred-By
sip_h_referred-by
variable_sip_refer_to
sip_refer_to
The full SIP URI received from a SIP Refer-To: response
variable_max_forwards
max_forwards
variable_originate_disposition
originate_disposition
variable_read_codec
read_codec
variable_read_rate
read_rate
variable_open
variable_use_profile
use_profile
variable_current_application
current_application
variable_ep_codec_string
ep_codec_string
This variable is only available if late negotiation is enabled on the profile. It’s a readable string containing all the codecs proposed by the calling endpoint. This can be easily parsed in the dialplan.
variable_rtp_disable_hold
rtp_disable_hold
This variable when set will disable the hold feature of the phone.
variable_sip_acl_authed_by
sip_acl_authed_by
This variable holds what ACL rule allowed the call.
variable_curl_response_data
curl_response_data
This variable stores the output from the last curl made.
variable_drop_dtmf
drop_dtmf
Set on a channel to drop DTMF events on the way out.
variable_drop_dtmf_masking_file
drop_dtmf_masking_file
If drop_dtmf is true play specified file for every tone received.
variable_drop_dtmf_masking_digits
drop_dtmf_masking_digits
If drop_dtmf is true play specified tone for every tone received.
sip_codec_negotiation
sip_codec_negotiation
sip_codec_negotiation is basically a channel variable equivalent of inbound-codec-negotiation. sip_codec_negotiation accepts “scrooge” & “greedy” as values. This means you can change codec negotiation on a per call basis.
Caller-Callee-ID-Name
Caller-Callee-ID-Number
Caller-Channel-Progress-Media-Time
Caller-Channel-Progress-Time
Caller-Direction
Caller-Profile-Created-Time
profile_created
GMT microseconds timestamp when the caller profile was created
Caller-Transfer-Source
Channel-Call-State
Current
state
of the call
Channel-Call-UUID
Channel-HIT-Dialplan
Channel-Read-Codec-Bit-Rate
Channel-Write-Codec-Bit-Rate
Core-UUID
Event-Calling-File
Event-Calling-Function
Event-Calling-Line-Number
Event-Date-GMT
Event-Date-Local
Event-Date-Timestamp
Event-Name
Event-Sequence
FreeSWITCH-Hostname
FreeSWITCH-IPv4
FreeSWITCH-IPv6
FreeSWITCH-Switchname
Hunt-ANI
Hunt-Callee-ID-Name
Hunt-Callee-ID-Number
Hunt-Caller-ID-Name
Hunt-Caller-ID-Number
Hunt-Channel-Answered-Time
Hunt-Channel-Created-Time
Hunt-Channel-Hangup-Time
Hunt-Channel-Name
Hunt-Channel-Progress-Media-Time
Hunt-Channel-Progress-Time
Hunt-Channel-Transfer-Time
Hunt-Context
Hunt-Destination-Number
Hunt-Dialplan
Hunt-Direction
Hunt-Network-Addr
Hunt-Privacy-Hide-Name
Hunt-Privacy-Hide-Number
Hunt-Profile-Created-Time
profile_created
Hunt-Profile-Index
Hunt-RDNIS
Hunt-Screen-Bit
Hunt-Source
Hunt-Transfer-Source
Hunt-Unique-ID
Hunt-Username
Presence-Call-Direction
variable_DIALSTATUS
variable_absolute_codec_string
variable_advertised_media_ip
variable_answersec
variable_rtp_audio_in_mos
Mean Opinion Score; read-only, available in CS_REPORTING state, published by CHANNEL_DESTROY event
variable_rtp_use_ssrc
variable_session_id
variable_sip_2833_recv_payload
variable_sip_2833_send_payload
variable_sip_P-Asserted-Identity
variable_sip_Privacy
variable_sip_audio_recv_pt
variable_sip_cid_type
variable_sip_cseq
variable_sip_destination_url
variable_sip_from_display
sip_from_display
‘User’ element of SIP From: line
variable_sip_from_port
variable_sip_gateway
variable_sip_gateway_name
variable_sip_h_P-Charging-Vector
variable_sip_local_network_addr
variable_sip_local_sdp_str
variable_sip_network_ip
variable_sip_network_port
variable_sip_number_alias
variable_sip_outgoing_contact_uri
variable_sip_ph_P-Charging-Vector
variable_sip_profile_name
variable_sip_recover_contact
variable_sip_recover_via
variable_sip_reply_host
variable_sip_reply_port
variable_sip_req_port
variable_sip_to_port
variable_sip_use_codec_name
variable_sip_use_codec_ptime
variable_sip_use_codec_rate
variable_sip_use_pt
variable_sip_via_protocol
variable_switch_m_sdp
variable_transfer_history
variable_transfer_source
variable_uuid
variable_waitsec
|
|
神勇威武的日记本 · boost C++知识点(一)-阿里云开发者社区 1 年前 |