fitwxc2011-12-07 18:53:26

玩网络电话不用SipSorcery这样的独一无二的交换机, 很难发挥网络电话的巨大潜力. SS的唯一难点是dialplan, 主要是那些网上教学的主,只知道卖弄自己的知识,而不是真想教你,或者没有教人的天分。其实非常简单好理解, 比如这是我帮一位朋友写的, 就一行:

sys.GoogleVoiceCall("username@gmail.com","password","number","#{req.URI.User}",".*",3)

真的,就这一行,你的dialplan里不需要有任何其它的东西,只要把用户名,密码和号码(比如ipkall号码)换成你自己的就成了. 把你的ATA或eyeBeam或CSipSimple, 或all of them, 注册到sipsorcery.com。

当然还要把GV号码连到sipsorcery;这里主要谈dialplan,其它细节不再赘述,请详见我的相关博客和老帖。简单讲: 把ipkall forward到username@sipsorcery.com. 用手机或普通座机拨打你的ipkall号,你的ATA等会响铃,接听,确保能双向通话,也就是两头都有声音【注1】。然后把ipkall号码加到GV里,GV会送核实码,你的ATA等响铃,接听,输入核实码【注2】。

往后如果谁打你的GV号码, 你的ATA等所有终端都会同时响铃, 你可以用任何一个接听. 拨打任何1开头的号码,也就是整个北美,都是免费的。有比这更简单, 更爽的事吗? 

就用上面这么简单的一行dialplan, 也可以打国际长途包括中国. 如果你嫌GV的话费太贵的话, $0.02/分钟, 你可以用betamax(比如VoipDiscount)来打国际长途. 先把VD加到SS的SIP Providers里, 然后dialplan稍加几行:

case req.URI.User

 when /^1?\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d$/ then
  sys.GoogleVoiceCall("username@gmail.com","password","number","#{req.URI.User}",".*",3)
  sys.Respond(480, "#{sys.Username} Not available")
 when /^\\+\\d{3,}/,/^00\\d{3,}/,/^011\\d{3,}/ then
  sys.Dial("VD")

end

这样一来如果你拨号是1开头的话, 就还是像上面一样走GV的免费美加线路; 如果是011, 00或国家号(比如中国是86)开头的话, 就会走VD的低价国际长途线路. 完美无缺, 而且你看还是非常简单, 直接复制到你的dialplan里就成了.

如果你给你们家的7大姑和8大姨各装了一个ATA, 那么在上面的dialplan前再稍加几行, 还可以让她们之间直接通话, 这可是欧吧马和胡锦涛才能享受的总统热线, 而且完全免费:

case req.URI.User

 when /^1?2345678907$/ then
  sys.Dial("7gu@sipsorcery.com")
  sys.Respond(480, "#{sys.Username} Not available")
 when /^1?2345678908$/ then
  sys.Dial("8yi@sipsorcery.com")
  sys.Respond(480, "#{sys.Username} Not available")

 when /^1?\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d$/ then
  sys.GoogleVoiceCall("username@gmail.com","password","number","#{req.URI.User}",".*",3)
  sys.Respond(480, "#{sys.Username} Not available")
 when /^\\+\\d{3,}/,/^00\\d{3,}/,/^011\\d{3,}/ then
  sys.Dial("VD")

end

当然你要把7gu和8yi加到SS的SIP Accounts里, 她们的ATA相应以自己的这些用户名注册到sipsorcery.com. 这样一来, 拨12345678907, 7姑的电话就响了;拨12345678908, 8姨的电话响. 当然她们还可以像上面一样打往美加和任何国家.

还有许多锦上添花的细节, 比如让7姑和8姨都能在来电显示里看到对方的名字和号码, 等等, 这里暂时不说了, 否则你就被吓住了. 上面这些虽然简单易读, 足够用了, 都是从正在实际使用的dialplan里复制过来的, 只要把GV的用户名,密码和号码(注意不是GV号码, 而是它的forward to号码, 比如ipkall号码)换成你自己的, 保证工作. 就这样你能整出来的话, 已经是相当低厉害鸟(宋丹丹语气).

【注1】碰到只有一头有声音的话,启用NAT选项,相见我的相关博客和老帖。

【注2】碰到核实码不认的话,把ATA或其它终端的DTMF模式由auto改成INFO或其它模式后再试。

mc33612011-12-07 19:32:37
严格地讲,要用/\A替代/^, \Z/替代$/ - 你把一行和一个字串搞混淆了
slow_quick2011-12-07 20:05:00
你能举个反例吗?
mc33612011-12-07 20:44:34
我只关心一行被转换成一个字串的情况
slow_quick2011-12-07 21:38:23
我来举个反例
mc33612011-12-07 21:41:57
实际是匹配错误,呵呵
slow_quick2011-12-07 21:59:33
你的也不对
mc33612011-12-07 22:11:16
匹配不上是对的,否则错误的性质是打错号码
slow_quick2011-12-07 22:25:55
所以匹配上是错的