Денис Пестрецов
30.12.2019
3909

Передача переменных канала диалплана в код Asterisk и их использование. Отключение проигрывания файла sound_thanks

В рамках данной статьи рассмотрим передачу переменных канала в код Asterisk и их использование. Делать это будем на примере отключения проигрывания файла sound_thanks. Разберёмся, что это за файл и для чего он нужен. Назначение файла sound_thanks Для рассмотрения назначения, нам необходимо будет обратиться к функционалу очередей, а именно к параметру Announce Hold Time расположенному на […]

В рамках данной статьи рассмотрим передачу переменных канала в код Asterisk и их использование. Делать это будем на примере отключения проигрывания файла sound_thanks.

Доработка будет рассматриваться на примере Asterisk версии 13.28.1.

Разберёмся, что это за файл и для чего он нужен.

Назначение файла sound_thanks

Для рассмотрения назначения, нам необходимо будет обратиться к функционалу очередей, а именно к параметру Announce Hold Time расположенному на вкладке Caller Announcements.

Параметр Announce Hold Time
Параметр Announce Hold Time

Когда он включён, клиенту, звонящему на очередь, будет проигрываться приблизительное время ожидания. Вдобавок, в конце каждого такого сообщения проигрывается файл sound_thanks, в котором записана фраза (при условии использования русского языка): «Благодарим за терпение».

Подробнее о работе с очередями и описание параметров можно найти в статье.

Данный файл будет всё равно озвучен, даже если, по какой-либо причине, приблизительное время ожидания не будет подсчитано.

Поэтому, в данной статье рассмотрим возможность управлять проигрыванием данного файла из диалпана Asterisk. Попутно рассмотрим возможность передачи, и использования переменных канала в коде Asterisk.

Запись и получение значений переменных канала

Для этих действий в Asterisk 13 версии предусмотрены следующие функции:

pbx_builtin_getvar_helper – получение значения переменной канала. В качестве входных параметров, в эту функцию передаём канал и имя переменной типа const char. В случае, если данная переменная будет найдена, то в качестве результата вернётся её значение. Притом возвращаемое значение имеет тип const char. Если переменная не будет найдена в канале, вернётся NULL.

pbx_builtin_setvar_helper – запись значения в переменную канала. В качестве входных параметров в функцию передаётся канал, имя переменной и значение (два последних параметра в формате const char). Возвращаемое значение имеет тип int.

Исходный код этих функций можно найти в файле …/asterisk-*/main/pbx_variables.c.

В качестве примера, запишем новую переменную канала в одной части файла исходного кода очередей и выведем её в другой. Для этого откроем в режиме редактирования файл …/asterisk-*/app_queue.c (в качестве * здесь необходимо указать установленную версию Asterisk). В нём найдём функцию инициализации вызова в очередь: static int queue_exec(…). После объявления всех переменных в этой функции, добавим инициализацию нашей новой переменной канала. Должен получиться следующий код:

char *opt_args[OPT_ARG_ARRAY_SIZE];
int max_forwards;
pbx_builtin_setvar_helper(chan, "VOXTEST", "First_Variable");

Таким образом в канал должна добавиться переменная VOXTEST со значением First_Variable.

Теперь рассмотрим возможность её получения в другой части кода файла app_queue.c. В качестве примера сделаем вывод данной переменной в консоль, при озвучивании позиции в очереди. Для этого находим в открытом файле функцию say_position и в ней находим следующий код:

ast_verb(3, "Hold time for %s is %ld minute(s) %ld seconds\n", qe->parent->name, avgholdmins, avgholdsecs);

Код выше отвечает за вывод в консоль Asterisk текущего времени ожидания.

Выше вставляем код вывода в консоль нашей тестовой переменной.

ast_verb(3, "Test variable: %s", pbx_builtin_getvar_helper(qe->chan, "VOXTEST"));

Для вывода в консоль используется процедура ast_verb, на вход которой подаются параметры: 1) уровень логирования; 2) Текст, который необходимо вывести в консоль Asterisk.

Теперь сохраним файл app_queue.c и займёмся пересборкой Asterisk.

Для этого переходим в каталог, где хранятся исходники Asterisk (обычно это /usr/src/asterisk-*).

В этом каталоге выполняем последовательно:

make
Результат make
Результат make
make install
Результат make install
Результат make install

В случае, если всё было выполнено верно, должен получиться результат, похожий на тот, что на скриншотах выше.

Теперь перезапускаем asterisk:

systemctl restart asterisk (для CentOS 7+)
service asterisk restart (для CentOS до 7 версии)

Включаем для проверки в очереди озвучивание позиции. Для этого при редактировании очереди переходим на вкладку Caller Announcements и выставляем Freequency, к примеру, в 15 секунд. Также переключатель Announce Hold Time выставляем в Yes.

Тестовые параметры в очереди
Тестовые параметры в очереди

Выполняем звонок на очередь, проверяем, что тестовая переменная отобразилась в консоли Asterisk:

Отображение тестовой переменной в консоли Asterisk
Отображение тестовой переменной в консоли Asterisk

Как видно из скриншота, значение тестовой переменной успешно получено.

Значения для таких переменных можно задавать не только в коде, но также функцией Set в диалплане Asterisk. Как это сделать – покажем в следующей части статьи.

Отключаем проигрывание файла sound_thanks

Для того, чтобы сделать проигрывание файла sound_thanks регулируемым переменной диалплана, необходимо внести некоторые правки в файл app_queue.c.

Находим уже знакомую функцию say_position. В ней находим метку posout. И находим здесь код:

if (qe->parent->announceposition) {
	ast_verb(3, "Told %s in %s their queue position (which was %d)\n",
	ast_channel_name(qe->chan), qe->parent->name, qe->pos);
}
if (say_thanks) {
Здесь вставляем следующий код:
ann_thanks = pbx_builtin_getvar_helper(qe->chan,"ANNOUNCE_THANKS");
if (ann_thanks && strncasecmp(ann_thanks, "1", 1) == 0) {
	res = play_file(qe->chan, qe->parent->sound_thanks);
}

Тем самым указали, что кроме проверки стандартного say_thanks, проверять также переменную ANNOUNCE_THANKS. И только если она равна 1, то проигрывать сообщение.

Теперь указываем значение для этой переменной. Производится это в файле extensions_override_freepbx.conf, в который мы вставляем диалплан изменяемой очереди, взятый из файла extensions_additional.conf.

В оверрайд помещаем следующее значение:

exten => 2020,n,Set(__ANNOUNCE_THANKS=0)

где в качестве номера 2020 указывается внутренний номер очереди, в которой отключаем проигрывание файла sound_thanks.

Пересобираем Asterisk уже знакомыми командами:

make
make install

И перезапускаем сам Asterisk.

systemctl restart asterisk

Теперь если позвонить на очередь, то услышим приблизительное время ожидания. Притом файл sound_thanks озвучен не будет.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.