freeswitch基礎知識介紹
當一個呼叫在ROUTING狀態下達到命中撥號規則解析器時,相應的撥號規則就開始解析了。隨著解析的進行,在xml檔案中的符合條件的或標籤中的指令形成一個指令表,安裝到這個通道中。
你可以將撥號規則檔案放到conf/dialplan/default下,這個目錄下的撥號規則要比enum撥號規則優先處理。這個目錄下的檔案執行優先順序是按其檔名開頭的數字排序(由小到大),最大的那個檔案是99999_enum.xml,這個檔案捕捉所以的呼叫,所以我們自己定義的檔案一定要小於這個檔案才可能被先執行。一個以字母開頭的檔名會大小999999_enum.xml。
可以通過${api func(api arg ${var_name})}的方式呼叫一個模組的函式。
通常一個撥號規則檔案會包括三個要素:context, extension, condition和action。這些專案會被依次處理,只到達到action。
context
context是一個extension的邏輯組,一個context可以包含一個或多個extension。
context有一個name引數,any是一個保留的name引數值,它代表任何context。name用來標識一個context。在freeswitch.xml的dialplan section中可以有多個context。
extension
extension就是一個呼叫的目標。它有一個name,一些condition和action,這些東西會告訴freeswitch應該做什麼。
語法:
<extension name="{exten_name}" [continue="[true|false]"]>
name引數是必須的,它是extension的唯一標識。
另外還有一個可選的引數continue,如果它配置為true的話,即使這個extension已經匹配,在執行完它的action後,還會繼續執行後序的extension。其預設值為false。
{exten_name}可以是任何值。有一種特殊情況,如果exten_name正好與destination_number相等的話,解析器會從這個extension開始解析。但這是意味著就會執行它(執行要看它裡面的condition)。如果沒有這一特殊情況,解析器會從第一個extension開始解析。
如果condition中的field與expression匹配,再執行condition中的action。此時如果expresion中的以()括起來的值話,$1,$2,…,$N會依次得到這些值。在action中的data可以使用這些變數。
如果沒有匹配成功,則會執行中的指令。此時,因為沒有匹配,所以$1,$2等是沒有值的。
condition中除了field和expression引數外,還可以有一個break引數,這個引數指明什麼情況下中斷這個extension的條件匹配。也就是說extension在什麼情況下在這個condition中止查詢,這個condition後面的condition不在執行了。
break的值可以是:
‘on-true’ : 如果這個匹配成功,則下面的condition不再查詢
‘on-false’: 如果這個匹配失敗,則…… (這個是預設值) 。也就是說,預設的情況下,只要有一個condition匹配失敗了,這個extension也就不再往下執行了,再換它下面的extension。
‘always’ : 總是在此處停止
‘never’ : 永遠不在此處停止
示例1:
<extension>
<condition field="destination_number" expression="^500$">
<action application="bridge" data="sofia/profilename/500%x.x.x.x"/>
condistion>
extension>
示例2,通過閘道器呼叫使用者:
<extension name="testing">
<condition field="destination_number" expression="^(100)$">
<action application="bridge" data="sofia/gateway/gw/$1"/>
condition>
extension>
condition
condition就是決定當然呼叫是否要在這個extension中處理的一個模式匹配標籤。
語法:
<condition field="[{field_name}|${variable_name}|${api_func(api_args ${var_name})}]" expression="{expression}" break="[on-true|on-false|always|never]">
<action application="app name" data="app arg"/>
<anti-action application="app name" data="app arg"/>
condition>
fileld和expression是必須的,break是可選的。
有一些內部變數可以用:
context Why can we use the context as a field? Give us examples of usages please.
rdnis Redirected Number, the directory number to which the call was last presented.
destination_number Called Number, the number this call is trying to reach (within a given context)
dialplan Name of the dialplan module that are used, the name is provided by each dialplan module. Example: XML
caller_id_name Name of the caller (provided by the User Agent that has called us).
caller_id_number Directory Number of the party who called (caller) -- can be masked (hidden)
ani Automatic Number Identification, the number of the calling party (caller) -- cannot be masked
aniii The type of device placing the call ANI2
uuid Unique identifier of the current call? (looks like a GUID)
source Name of the FreeSWITCH module that received the call (e.g. PortAudio)
chan_name Name of the current channel (Example: PortAudio/1234). Give us examples when this one can be used.
network_addr IP address of the signaling source for a VoIP call.
year Calendar year, 0-9999
yday Day of year, 1-366
mon Month, 1-12 (Jan = 1, etc.)
mday Day of month, 1-31
week Week of year, 1-53
mweek Week of month, 1-6
wday Day of week, 1-7 (Sun = 1, Mon = 2, etc.)
hour Hour, 0-23
minute Minute (of the hour), 0-59
minute-of-day Minute of the day, (1-1440) (midnight = 1, 1am = 60, noon = 720, etc.)
除了上面的變數外,還可以使用自定義的變數${variable},以及一些api函式${api(args)}
這些變數可以在field及expression裡。
condition是不能巢狀的,但可以將多個condition堆在一起,並設定break為on-false(預設值),這樣的效果與巢狀一樣。
示例1,利用cond API函式:
<condition field="${cond(${my_var} > 12 ? YES : NO)}" expression="^YES$">
<action application="log" data="INFO ${my_var} is indeed greater than 12"/>
<anti-action application="log" data="INFO ${my_var} is not greater than 12"/>
condition>
示例2, 巢狀效果:
<extension name="To PSTN">
<condition field="fdnis" expression="9541231234"/>
<condition field="destination_number" expression="(.*)">
<action application="bridge" data="sofia/profilename/
condition>
extension>
action
action是在condition匹配的時候執行,而anti-action是在condition不匹配的時候執行。
action有兩個引數,一個是application,一個是data。其中application是指一個註冊的應用程式。data是給這個應用程式傳遞的引數。
在anti-action裡不能使用$1這樣的變數,原因是expression沒有匹配成功,所以$1沒有值。
內聯action
先說說hunting和executing,hunting就是freeswitch掃描符合條件action放到一個佇列裡,executing就是執行佇列裡的action。
所以,在通常情況下freeswitch中的hunting和executing是分兩步執行的。這說意味著在executing時設定的變數,在hunting時是不可用的。也就是說,即使我們能用可以顯示變數的值,但是在我們的xml檔案中的condition中可能是不可用的。
要解決這個問題就要用到inline引數。
inline="true" application="set" data="some_var=some_val"/>
action的引數inline設定為"true"時,action會在hunting時執行。這樣,後面的condition就可以使用這個${some_var}變量了。
另外,用inline方式執行的application不能顯示在cdr裡,原因是它們在hunting時就已經執行了。
不是所有的application都可以在hunting時執行。只有那些快速執行get或set變數值,且不會影響當前session的application才可以。它們包括下面這些:
check_acl,
eval,
event,
export,
log,
presence,
set,
set_global,
set_profile_var,
set_user,
sleep,
unset,
verbose_events,
cidlookup,
curl,
easyroute,
enum,
lcr,
nibblebill,
odbc_query
可用的action
參見這兩個: API Reference 和 Dialplan Functions
示例
示例1
<extension name="Test1">
<condition field="network_addr" expression="^192/.168/.1/.1$"/>
<condition field="destination_number" expression="^(/d+)$">
<action application="bridge" data="sofia/profilename/
condition>
extension>
<extension name="Test1Wrong">
<condition field="destination_number" expression="^(/d+)$"/>
<condition field="network_addr" expression="^192/.168/.1/.1$">
<action application="bridge" data="sofia/profilename/[email protected]
condition>
extension>
<extension name="Test1_2">
<condition field="destination_number" expression="^(/d+)$">
<action application="set" data="dialed_number=$1"/>
condition>
<condition field="network_addr" expression="^192/.168/.1/.1$">
<action application="bridge" data="sofia/profilename/${dialed_number}@192.168.2.2"/>
condition>
extension>
示例2
<extension name="Test2">
<condition field="network_addr" expression="^192/.168/.1/.1$"/>
<condition field="destination_number" expression="^1(/d+)$">
<action application="bridge" data="sofia/profilename/[email protected]"/>
condition>
extension>
示例3
<extension name="Test3.1">
<condition field="destination_number" expression="^00(/d+)$">
<action application="bridge" data="sofia/profilename/[email protected]"/>
condition>
extension>
<extension name="Test3.2">
<condition field="destination_number" expression="^00(.+)$">
<action application="bridge" data="sofia/profilename/[email protected]"/>
condition>
extension>
示例4
<extension name="Test4">
<condition field="destination_number" expression="^00(/d+)$">
<action application="bridge" data="sofia/profilename/[email protected]"/>
condition>
extension>
示例5
假設我們有兩個不同的profile, profile的配置檔案在conf/sip_profiles/
<profile name="profile1">
<param name="debug" value="1"/>
<param name="rfc2833-pt" value="101"/>
<param name="sip-port" value="5060"/>
<param name="dialplan" value="XML"/>
<param name="dtmf-duration" value="100"/>
<param name="codec-prefs" value="[email protected]"/>
<param name="codec-ms" value="20"/>
<param name="use-rtp-timer" value="true"/>
profile>
<profile name="profile2">
<param name="debug" value="1"/>
<param name="rfc2833-pt" value="101"/>
<param name="sip-port" value="5070"/>
<param name="dialplan" value="XML"/>
<param name="dtmf-duration" value="100"/>
<param name="codec-prefs" value="[email protected]"/>
<param name="codec-ms" value="20"/>
<param name="use-rtp-timer" value="true"/>
profile>
這兩個profile1和profile2
要使用u-law的配置
<extension name="Test5ulaw">
<condition field="network_addr" expression="^192/.168/.1/.1$"/>
<condition field="destination_number" expression="^1(/d+)$">
<action application="bridge" data="sofia/profile1/[email protected]"/>
condition>
extension>
要使用a-law的配置
<extension name="Test5alaw">
<condition field="network_addr" expression="^192/.168/.1/.1$"/>
<condition field="destination_number" expression="^1(/d+)$">
<action application="bridge" data="sofia/profile2/[email protected]"/>
condition>
extension>
示例6
<extension name="internal">
<condition field="source" expression="mod_sofia" />
<condition field="destination_number" expression="^(4/d+)">
<action application="bridge" data="sofia/local_profile/$0%example.com" />
condition>
extension>
示例7
<extension name="internal">
<condition field="destination_number" expression="^1111">
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="sofia/local_profile/[email protected]mple1.company.com" />
<action application="bridge" data="sofia/local_profile/[email protected]" />
condition>
extension>
示例8
<extension name="9191">
<condition field="destination_number" expression="^9191$"/>
<condition field="${sip_authorized}" expression="true">
<anti-action application="reject" data="407"/>
condition>
<condition>
<action application="playback" data="/tmp/itworked.wav"/>
condition>
extension>
示例9
將一個DID(Direct inward dailing)路由到一個指定的extension 1001。
本示例是一個傳送和查詢voicemail的配置示例。
首先是在conf/dialplan/public.xml裡:
<extension name="test_did">
<condition field="destination_number" expression="^(XXXxxxxxxx)$">
<action application="transfer" data="$1 XML default"/>
condition>
extension
然後在conf/dialplan/default.xml的default context裡:
<extension name="Local_Extension">
<condition field="destination_number" expression="^(XXXxxxxxxx)$">
<action application="set" data="dialed_ext=$1"/>
condition>
<condition field="destination_number" expression="^${caller_id_number}$">
<action application="set" data="voicemail_authorized=${sip_authorized}"/ >
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="voicemail" data="check default $${domain} ${dialed_ext}"/>
<anti-action application="ring_ready"/>
<anti-action application="set" data="call_timeout=10"/>
<anti-action application="set" data="hangup_after_bridge=true"/>
<anti-action application="set" data="continue_on_fail=true"/>
<anti-action application="bridge" data="USER/[email protected]$${domain}"/>
<anti-action application="answer"/>
<anti-action application="sleep" data="1000"/>
<anti-action application="voicemail" data="default $${domain} ${dialed_ext}"/>
condition>
extension>
示例10
撥出示例, 可以替換主叫號碼
<extension name="asterlink.com">
<condition field="caller_id_number" expression="^1000$"/>
<condition field="destination_number" expression="^(/d{10})$">
<action application="set" data="effective_caller_id_number=8001231234"/>
<action application="set" data="effective_caller_id_name=800 Number"/>
<action application="bridge" data="sofia/gateway/asterlink.com/1208$1"/>
condition>
extension>
示例11
根據目標號碼不同路由到不同的目標
<extension>
<condition field="network_addr" expression="^(66/.123/.321/.231|70/.221/.221/.221)$" break="on-false"/>
<condition field="destination_number" expression="^/d+$" break="never">
<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,TIMEOUT,NO_ROUTE_DESTINATION"/>
<action application="set" data="bypass_media=true"/>
<action application="set" data="accountcode=myaccount"/>
condition>
<condition field="destination_number" expression="^(1813/d+|1863/d+|1727/d+|1941/d+|404/d+)$" break="never">
<action application="bridge" data="sofia/outbound_profile/${sip_to_user}@switch1.mydomain.com"/>
<action application="info"/>
<action application="respond" data="503"/>
<action application="hangup"/>
condition>
<condition field="destination_number" expression="^(1404/d+|1678/d+|1770/d+)$">
<action application="bridge" data="sofia/outbound_profile/${sip_to_user}@switch2.mydomain.com"/>
<action application="info"/>
<action application="respond" data="503"/>
<action application="hangup"/>
<anti-action application="respond" data="503"/>
<anti-action application="hangup"/>
condition>
extension>
示例12
捕捉所有的號碼,
<extension name="catchall">
<condition field="destination_number" expression=".*" continue="on-true">
<action application="playback" data="bla.wav"/>
condition>
extension>
示例13
從主號方取得名字,接通被叫並顯示主叫名字,如果被叫按“1”則接通主被叫,如果被叫方掛機,則主叫會被路由到voicemail。
這個沒搞清楚它是怎麼實現的!
<extension name="screen">
<condition field="destination_number" expression="^(/d{4})$">
<action application="set" data="call_screen_filename=/tmp/${caller_id_number}-name.wav"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="phrase" data="voicemail_record_name"/>
<action application="playback" data="tone_stream://%(500, 0, 640)"/>
<action application="set" data="playback_terminators=#*0123456789"/>
<action application="record" data="${call_screen_filename} 7 200 2"/>
<action application="set" data="group_confirm_key=1"/>
<action application="set" data="fail_on_single_reject=true"/>
<action application="set" data="group_confirm_file=phrase:screen_confirm:${call_screen_filename}"/>
<action application="set" data="continue_on_fail=true"/>
<action application="bridge" data="user/$1"/>
<action application="voicemail" data="default $${domain} $1"/>
<action application="hangup"/>
condition>
extension>
示例14
wav格式語音的錄/放音
<extension name="recording">
<condition field="destination_number" expression="^(2020)$">
<action application="answer"/>
<action application="set" data="playback_terminators=#"/>
<action application="record" data="/tmp/recorded.wav 20 200"/>
condition>
extension>
<extension name="playback">
<condition field="destination_number" expression="^(2021)$">
<action application="answer"/>
<action application="set" data="playback_terminators=#"/>
<action application="playback" data="/tmp/recorded.wav"/>
condition>
extension>
示例15
用Flite text to speech報時,mod_flite
<include>
<extension name="SpeakTime">
<condition field="destination_number" expression="^2910$">
<action application="set" data="actime=${strftime(%H:%M)}"/>
<action application="set" data="tts_engine=flite"/>
<action application="set" data="tts_voice=slt"/>
<action application="speak" data="Is it +${actime}"/>
condition>
extension>
include>
SIP特定的撥號字串
呼叫一個SIP URI
基本語法:sofia/my_profile/[email protected], 如:
sofia/my_profile/[email protected]
呼叫一個註冊使用者
沒有註冊別名的情況:sofia/my_profile/1234%mydomain.com
註冊別名的情況:sofia/mydomain.com/1234,注意:這裡沒有顯示指定profile檔案。也可以這樣:user/[email protected]
通過閘道器呼叫
sofia/gateway/mygateway.com/1234
其中閘道器名就是mygateway.com,呼叫的使用者1234
呼叫時指定傳輸協議
傳輸協議可以是:TCP, UDP, TLS, SCTP,如:
sofia/my_profile/[email protected];transport=tcp
指定編解碼
{absolute_codec_string=XXXX}sofia/my_profile/[email protected]
Getting Fancy With PortAudio,這個沒搞明白是做什麼用的
If you have PortAudio running and would like to specify the codec you need to originate first and bridge second:
originate {absolute_codec_string=XXXX}sofia/default/[email protected] bridge:portaudio/auto_answer inline
修改SIP聯絡人
fs正常會用[email protected]:port做為內部的聯絡人,如果想修改一下,
{sip_contact_user=foo}sofia/my_profile/[email protected];transport=tcp
使用定製的SIP URI
比如,要傳送在“SIP:”開頭的URI,
sofia/my_profile/sip:xxxx;[email protected];user=phone
相關推薦
freeswitch基礎知識介紹
當一個呼叫在ROUTING狀態下達到命中撥號規則解析器時,相應的撥號規則就開始解析了。隨著解析的進行,在xml檔案中的符合條件的或標籤中的指令形成一個指令表,安裝到這個通道中。 你可以將撥號規則檔案放到conf/dialplan/default下,這個目錄下的撥號規則要
DeepLearning.ai學習筆記(四)卷積神經網絡 -- week1 卷積神經網絡基礎知識介紹
除了 lock 還需要 情況 好處 計算公式 max 位置 網絡基礎 一、計算機視覺 如圖示,之前課程中介紹的都是64* 64 3的圖像,而一旦圖像質量增加,例如變成1000 1000 * 3的時候那麽此時的神經網絡的計算量會巨大,顯然這不現實。所以需要引入其他的方法來
js基礎知識介紹
pro 知識 bsp var 字符 文本 運算符 span 取余 //js大小寫敏感 註意 ‘‘和; //單行註釋 /*多行註釋*/ //js輸出語法 //alert(‘周天‘); //c
php基礎知識--介紹
domain lin 就是 能夠 必須 不同的 執行 apache com 1. php開發環境? 1) Wamp : window + Apache + Mysql + php 2) Lamp : Linux
OSPF基礎知識介紹
使用 ipv 鄰居 信息 out code 引入 路由交換 驗證 OSPF(Open Shortest Path First開放式最短路徑優先)是一個內部網關協議(Interior Gateway Protocol,簡稱IGP),用於在單一自治系統(autonomous s
多通道影象卷積基礎知識介紹
轉:https://blog.csdn.net/williamyi96/article/details/77648047 1.對於單通道影象+單卷積核做卷積 Conv layers包含了conv,pooling,relu三種層。以python版本中的VGG16模型中的faster_rcnn_
PROFINET基礎知識介紹
工業乙太網一般使用IEEE 802.3中定義的乙太網標準。針對自動化系統的網路節點輔助採用了服務質量( QOS)機制。PROFINET作為工業乙太網之一,它採用了三種不同的方法來實現。這樣既滿足了普通乙太網的需求,又滿足了工業系統對不同應用的實時性的要求。如下圖1所示。 圖1、PROFIN
第二章 python分散式爬蟲打造搜尋引擎環境搭建 第一節爬蟲基礎知識介紹
第一,爬蟲能做什麼?作用是啥?簡單的介紹幾種,以便於瞭解。 1. 搜尋引擎---百度、google、垂直領域搜尋引擎 2. 推薦引擎---今日頭條 3. 機器學習的資料樣本 4. 資料分析(如金融資料分析)、輿情分析等 第二,技術選型(為什麼要使用scrapy而不是request
【 MATLAB 】逆離散餘弦變換(idct)的基礎知識介紹
基礎知識介紹 逆離散餘弦變換從離散餘弦變換 (DCT) 係數中重建序列。idct 函式是 dct 函式的逆。 The DCT has four standard variants. For a tr
資料加解密基礎知識介紹,及Java實現Base64加密
加密流程涉及的一些關鍵詞: 明文:準備加密的資訊 加密:把明文處理為密文的過程 加密演算法:具體實現明文轉為密文的演算法 加密金鑰:通過加密演算法進行加密操作需要的金鑰 密文:被加密的明文 解密:將密文轉為明文的過程 解密演算法:具體實現密文轉為明文的演算法 解
視訊編解碼的理論和實踐1:基礎知識介紹
近幾年,視訊編解碼技術在理論及應用方面都取得了重大的進展,越來越多的人想要了解編解碼技術。因此,網易雲信研發工程師為大家進行了歸納梳理,從理論及實踐兩個方面簡單介紹視訊編解碼技術。 相關閱讀推薦 1、視訊介紹 視訊的本質是影象序列,根據視覺暫留的原理
ASO基礎知識介紹
什麼是ASO? ASO全稱App Store Optimization,即蘋果應用商店搜尋優化。即通過各種方式來提升你APP在各類APP應用市場排行榜排名和搜尋結果排名的過程,從而提高APP在APP
Powercenter 基礎知識介紹
1 Install & Concept 1.1 Powercenter 的安裝,架構,元件及其主要功能; 1. 安裝Powercenter 7.12,8.11客戶端,知識庫伺服器及Informatica
webAPP專案基礎知識介紹用html5+css3+js開發
最近關於webAPP很火,差不多很多公司開始製作自己的webAPP啦。一談到webAPP,大家就會想到用html5+CSS+js來實現。到底如何來製作?25學堂小編還沒有找到比較合適的用html5+css3開發webAPP專案教材。 這裡分享了一個《網易微博Web Ap
es學習:基礎知識介紹
一、概述 Elasticsearch:是一個開源的分散式搜尋引擎伺服器;有一下特點和功能: 1. 支援分散式儲存; 2. 提供全文檢索功能; 3. 完成對大資料的自動分片
OpenGL開發基礎知識介紹
最近由於手機專案中需要用到OpenGL ES的知識,所以這段時間正在研究OpenGL的相關知識。因為OpenGL ES是OpenGL的剪裁版本,所以我直接從OpenGL入手,然後再去看OpenGL ES就很容易上手。從此篇開始,我將發表一系列文章來逐步深入介紹OpenGL的
公司信貸基礎知識介紹
一.應付賬款週轉天數、應收賬款週轉、存貨週轉天數 1.應收賬款週轉天數 (1)概念 什麼是應收賬款週轉天數(Average Collection Period) 應收賬款週轉天數是指企業從取得應收賬款的權利到收回款項、轉換為現金所需要的時間。是應收賬款週轉率的一個輔助性指標
Powercenter 基礎知識介紹- 1
1 Install & Concept 1.1 Powercenter 的安裝,架構,元件及其主要功能; 1. 安裝Powercenter 7.12,8.11客戶端,知識庫伺服器及Informatica伺服器件; 需要指定註冊碼;在本機上建立
Hive基礎知識介紹
Hive是基於Hadoop的資料倉庫工具,可對儲存在HDFS上的檔案中的資料進行資料整理、特殊查詢和分析處理,提供了類似於SQL語
linux入門基礎知識及簡單命令介紹
linux基礎linux入門基礎知識介紹1、計算機硬件組成介紹計算機主要由cpu(運算器、控制器),內存,I/O,外部存儲等構成。 cpu主要是用來對二進制數據進行運算操作,它從內存中取出數據,然後進行相應的運算操作。不能從硬盤中直接取數據。 內存從外部存儲中取出數據供cpu運存。內存的最小單位是