本文将讨论免费的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的出站路由。
规则列表显示如下:

特定“规则”卡的示例:
