使用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