思蘆隨筆

人隻不過是一根蘆葦,是自然界最脆弱的東西;但他能夠思想。
個人資料
思蘆 (熱門博主)
  • 博客訪問:
歸檔
正文

使用Sipsorcery Dial Plan 的兩個竅門

(2011-08-20 18:48:06) 下一個

使用Sipsorcery Dial Plan 的兩個竅門

Sipsocery相當於一個用戶可以根據自己需要做配置的電話交換中心。這裏介紹兩個很有用的竅門。一個是CNAM;一個是多路接入。CallerID隻是把打電話對方的電話號碼傳送過來,但不會把電話號碼持有者的姓名傳送到接收端。電話公司一般都用自己的數據庫把電話號碼轉換成實際姓名。一般VOIP公司沒有這樣的數據庫,所以所謂的callerID隻是提供電話號碼。在sipsorcerydialplan裏用戶可以自己設置CNAM功能,把callerID轉換成姓名。首先用戶可以自己設置PhonebookPhonebook是一個把你自己常用的電話號碼和人名對應起來的數據庫。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

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.