星号 Dialplan Askozia 6.拨出电话

本文将讨论免费的PBX Askozia版本6 。 开发电话交换机时,首要任务之一是组织呼出电话。

怎么样了


在旧版的Askozia中,使用了标准的“拨号计划” 模板

  • X! -所有电话号码
  • XXX-三位数
  • 。! -绝对所有电话号码

上下文示例可以用示意图描述:

[outgoing] exten => _XXXXXX!,1,NoOp(Start outgoing calling...) same => n,Dial… 

在我们看来,这种方法不够灵活。 无法描述以下规则:

  • 号码开始于79
  • 它遵循35或26
  • 其余的数字是7位数字

在削减的范围内,描述了我们的方法和发展成果。

当前实施


我们决定使用REGEX不同地实现此功能。

模板示例:

 79(25|26)[1-9]{7} 

  • (25 | 26)是25或26
  • [0-9] -从0到9的数字,出现1次或多次
  • {7} -上一个字符的出现次数

REGEX函数的语法为:

 REGEX("regular expression" string) Return '1' on regular expression match or '0' otherwise 

Askozia 6中的使用示例:

 [outgoing] exten => _X!,1,NoOp(Start outgoing calling...) same => n,Ringing() same => n,ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-1-out,${EXTEN},1)) same => n,ExecIf($["${REGEX("^(7|8)[0-9]{10}$" ${EXTEN})}" == "1"]?Gosub(SIP-PR-2-out,${EXTEN},1)) same => n,Hangup() 

对于拨出呼叫,将组织一个入口点-“ 拨出 ”上下文,在其中调用“ ExecIf ”功能:

 ExecIf($["${REGEX("^[0-9]{6}$" ${EXTEN})}" == "1"] 

如果变量“ $ {EXTEN} ”中指定的电话号码与模式匹配,则使用“ Gosub ”功能将呼叫路由到子上下文

如果在子上下文中未中断呼叫,则该呼叫将根据以下适当规则进行。

这样,我们解决了单通道线路的问题。 如果线路繁忙,则呼叫将继续进行下一个呼叫,直到应答为止。

上下文示例:

 [SIP-PR-1] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-1/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return [SIP-PR-2] exten => _X!,1,ExecIf($["${number}x" == "x"]?Hangup()) same => n,Dial(SIP/PR-2/${EXTEN},600,TeK)) same => n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?Hangup()) same => n,return 

在“ ”中必须-上下文检查“ DIALSTATUS ”。 如果呼叫已接听,则通话后,将使用“ Hangup() ”功能终止该频道。 如果不这样做,则在客户端呼叫结束时,可能会重新拨打客户端号码。

一个重要的细微之处是,当使用“ Gosub ”或“ Goto ”时,我们有意更改$ {EXTEN} 。 即使您需要修改电话号码(添加/删除前缀)。

事实是,当修改EXTEN时,Asterisk将修改CDR变量(dst)的值 ,这将导致CDR呼叫历史记录表中的预测结果差。 我认为保留员工拨打的电话号码在历史上很重要。

描述正则表达式时要小心。 使用字符“ ^ ”,行的开头和“ $ ”-行的末尾,否则可能会得到意外的结果。

例如,模式“ [0-9] {6} ”将对应于具有6个或更多数字的所有数字。 模式“ ^ [0-9] {6} $ ”仅匹配6位数字。

总结


我们有一个灵活的子系统来描述到PBX的出站路由。
规则列表显示如下:

图片

特定“规则”卡的示例:

图片

Source: https://habr.com/ru/post/zh-CN445536/


All Articles