Всем привет. Частенько появляется необходимость принятия решений о маршрутизации вызова в Asterisk на основе номера(CallerID) звонящего. Чаще всего это делают, на мой взгляд, не самым удобным способом.
exten => s,1,GotoIf($["${CALLERID(num)}" = "12345"]?True:False)
same => n(True),NoOp("Есть совпадение")
... какая-то логика при совпадении ...
same => n(False),NoOp("Нет совпадения")
... какая-то логика в остальных случаях ...
Второй же способ, крайне редко используется, но, на мой взгляд он куда элегантнее.
exten => s/100,1,NoOp(Этот маршрут сработает только для номера 100)
... какая-то логика при совпадении ...
exten => s,1,NoOp(Этот маршрут сработает для всех остальных)
... какая-то логика в остальных случаях ...
;;; можно использовать маски
exten => s/_1XX,1,NoOp(Этот маршрут сработает только для номеров из диапазона 100-199)
... какая-то логика при совпадении ...
exten => s,1,NoOp(Этот маршрут сработает для всех остальных)
... какая-то логика в остальных случаях ...
Но у второго способа есть и особенности, которые следует учитывать, если где-то в средине описываемой логики Вы решите поменять CALLERID(num) на такой, который не подходит к указанной маске. В этом случае обработка прекратится с ошибкой. При этом первый вариант избавлен от этой особенности, т.к. нет привязки логики к CALLERID(num) и его модификация не влияет на переход по приоритетам плана набора.
Спасибо за внимание.