2020 (80)
2021 (49)
2022 (69)
使用Sipsorcery Dial Plan 的兩個竅門
Sipsocery相當於一個用戶可以根據自己需要做配置的電話交換中心。這裏介紹兩個很有用的竅門。一個是CNAM;一個是多路接入。CallerID隻是把打電話對方的電話號碼傳送過來,但不會把電話號碼持有者的姓名傳送到接收端。電話公司一般都用自己的數據庫把電話號碼轉換成實際姓名。一般VOIP公司沒有這樣的數據庫,所以所謂的callerID隻是提供電話號碼。在sipsorcery的dialplan裏用戶可以自己設置CNAM功能,把callerID轉換成姓名。首先用戶可以自己設置Phonebook。Phonebook是一個把你自己常用的電話號碼和人名對應起來的數據庫。Dialplan先查這個數據庫。如果找到的話,就會返回人名,和電話號碼一起送到接受電話。如果找不到的話,Dialplan再去查找網上的免費白頁服務。如果還找不到的話,就根據CallerID,把打電話一方的州和城市送到接收端。為了使用免費白頁服務,使用者首先要到query.yahooapis.com網站上注冊,得到一個APIkey。具體到dialplan上,要插入如下內容:
WP_key = 'tyhuusnnika8980sy7889' # White Pages API key
# CNAM Hash Table (phonebook)
CNAM = {
'1234567890' => 'zhangsan',
'1987654321' => 'Lisi(m)',
'1456321321' => 'WangerMazhi’,
……………………….
}
#here is your otherdial plan
if sys.In then
name = req.Header.from.FromURI.User.to_s # Get caller ID
# Check CNAM first. If not found and USnumber, try to lookup caller's name in Whitepages
if !(cname =CNAM[name]) && name =~ /^1([2-9]dd[2-9]d{6})/
url= "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D'http%3A%2F%2Fapi.whitepages.com%2Freverse_phone%2F1.0%2F%3Fphone%3D#{$1}%3Bapi_key%3D#{WP_key}'%20and%20itemPath%3D'wp.listings.listing'&format=json"
if js =sys.WebGet(url,4).to_s
cname,dname, city, state = %w(businessname displayname city state).map {|x| js =~/"#{x}":"([^"]+)"/; $1}
cname ||=dname; cname ||= "#{city}, #{state}" if city && state
end
end
第二個竅門是用戶可以同時使用兩條以上的路徑從GV連到SS來提高可靠性。但是兩條來自同一caller的信號都會被SS先後送到你的電話裏。這時後到達的信號會被當作callwaiting處理,在聽筒裏你會聽到連續的callwaiting的提醒振鈴,比較煩人。在dialplan裏你可以設置如果在很短時間(比如8秒)內,接收到兩個來自同一電話但來自不同的通路的呼叫,後一呼叫就會被拋棄,不會被送到你的電話機。這樣你不會聽到惱人的假callwaiting振鈴。在Dialplan中需要插入下列內容:
if sys.In then
# other dial plan
@t = Time.now
ignore_call =false # assume we should processthis call
req.URI.User.to_s=~ Regexp.new("(.*).#{sys.Username}")
trunk = $1 # get trunk name
l_name, l_trunk, l_time =sys.DBRead('LastIncoming').to_s.split('|')
time_passed =@t.to_i - l_time.to_i
sys.Log("Lastcall from #{l_name}, trunk = #{l_trunk}, #{time_passed} sec ago")
# if called fromthe same trunk or time_passed > 8 sec or different CID
if l_trunk == trunk || time_passed > 8 ||l_name != name
sys.DBWrite('LastIncoming',[name,trunk,@t.to_i].join('|'))
else
ignore_call= true
sys.Respond(486,"Already calling")
return
# other dial plan
end