思芦随笔

人只不过是一根芦苇,是自然界最脆弱的东西;但他能够思想。
个人资料
思芦 (热门博主)
  • 博客访问:
归档
正文

使用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)
评论
目前还没有任何评论
登录后才可评论.