Для начала в примере с воспроизведением счета извлечем число (значение ключа count) из базы данных и присвоим его переменной COUNT. Если такой ключ не существует, DB() возвратит NULL (нет значения). Чтобы проверить наличие значения в базе данных, введем функцию ISNULL(), которая будет контролировать, возвращено ли значение. В случае если этого не произошло, мы присвоим AstDB исходное значение 1 с помощью приложения Set(). Следующий приоритет возвратит нас к приоритету 1. Это произойдет при первом вызове данного добавочного номера:
exten => 678,1,Set(COUNT=${DB(test/count)})
exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)
exten => 678,n,Set(DB(test/count)=1)
exten => 678,n,Goto(1)
exten => 678,n(continue),NoOp()
Далее будет воспроизведено текущее значение COUNT. После этого оно будет увеличено на 1:
exten => 678,1,Set(COUNT=${DB(test/count)})
exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)
exten => 678,n,Set(DB(test/count)=1)
exten => 678,n,Goto(1)
exten => 678,n(continue),NoOp()
exten => 678,n,SayNumber(${COUNT})
exten => 678,n,Set(COUNT=$[${COUNT} + 1])
Теперь, после приращения COUNT, давайте поместим новое значение в базу данных. Не забудьте, что сохранение значения для существующего ключа приводит к перезаписи предыдущего значения:
exten => 678,1,Set(COUNT=${DB(test/count)})
exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)
exten => 678,n,Set(DB(test/count)=1)
exten => 678,n,Goto(1)
exten => 678,n(continue),NoOp()
exten => 678,n,SayNumber(${COUNT})
exten => 678,n,Set(COUNT=$[${COUNT} + 1])
exten => 678,n,Set(DB(test/count)=${COUNT})
Наконец вернемся к первому приоритету. Теперь приложение будет продолжать счет:
exten => 678,1,Set(COUNT=${DB(test/count)})
exten => 678,n,GotoIf($[${ISNULL(${COUNT})}]?:continue)
exten => 678,n,Set(DB(test/count)=1)
exten => 678,n,Goto(1)
exten => 678,n(continue),NoOp()
exten => 678,n,SayNumber(${COUNT})
exten => 678,n,Set(COUNT=$[${COUNT} + 1]
exten => 678,n,Set(DB(test/count)=${COUNT})
exten => 678,n,Goto(1)
Попробуйте этот пример. Послушайте немного, как приложение считает, и повесьте трубку. Когда вы наберете этот добавочный номер снова, счет должен быть продолжен с той цифры, на которой вы остановились. Значение, хранящееся в базе данных, будет постоянным даже при перезагрузке Asterisk.
В следующем примере логика диалплана будет организована вокруг функции BLACKLIST(), которая проверяет наличие Caller ID (ID звонящего) текущего абонента в черном списке. (Черный список - это просто семейство AstDB, называемое blacklist.) Если функция BLACKLIST() находит номер в черном списке, она возвращает значение 1, в противном случае возвращается 0. Эти значения в сочетании с приложением GotoIf() могут использоваться для управления выполнением приложения Dial() при вызове:
exten => 124,1,GotoIf($[${BLACKLIST()]?blocked,1) exten => 124,n,Dial(${JOHN})
exten => blocked,1,Playback(privacy-you-are-blacklisted) exten => blocked,n,Playback(vm-goodbye) exten => blocked,n,Hangup()
Чтобы добавить номер в черный список, выполните команду database put blacklist номер 1 из интерфейса командной строки Asterisk.
Полезные функции Asterisk
Теперь, рассмотрев дополнительные базовые возможности, давайте перейдем к ряду популярных функций, включенных в Asterisk.
Zapateller()
Zapateller() - это простое приложение Asterisk, которое воспроизводит специальный информационный тон в начале звонка. Устройства автоматического набора (обычно используемые в системах продаж по телефону) принимают этот тон за сигнал разъединения линии. Причем они не только прекратят вызов, но также пометят данный номер как не обслуживаемый, что поможет избежать всех видов телемаркетинговых звонков. Чтобы использовать эту функциональность в своем диалпла- не, вам надо просто вызвать приложение Zapateller().
Также применим необязательную опцию nocallerid, чтобы тон воспроизводился только в случае, если входящий вызов не предоставляет информации о Caller ID (ID звонящего). Вот пример использования приложения Zapateller() в добавочном номере контекста [incoming]:
[incomimg]
exten => s,1,Zapateller(nocallerid) exten => s,n,Playback(enter-ext-of-person)
Парковка вызова
Еще одна удобная функция - парковка вызова. Она обеспечивает возможность перевести вызов в состояние ожидания, поставить его на «парковку», чтобы он мог быть принят на другом добавочном номере. Все параметры парковки вызовов (такие, как используемые добавочные номера, количество мест и т. д.) задаются в конфигурационном файле features.conf. Раздел [general] файла features.conf содержит четыре настройки, касающиеся парковки вызовов: parkext
Читать дальше