Астериск перенаправляет входящий вызов на последний номер, который его вызвал.

Вопрос или проблема

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

.

Ответ или решение

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

Теория

В Asterisk существует множество функциональных переменных и механизмов управления вызовами, но непосредственного встроенного решения для сохранения истории вызовов, чтобы использовать ее динамически для такого рода перенаправлений, нет. Зато можно воспользоваться логикой и скриптами AGI (Asterisk Gateway Interface) или внешними базами данных для реализации нужной логики.

Asterisk поддерживает гибкую работу с переменными, и вы можете использовать их для сохранения состояния вызова. Например, вы можете индивидуально сохранять данные из переменных CHANNEL или CALLERID (например, CALLERID(num)) для последующего использования.

Чтобы сохранить информацию о последнем вызвавшем номере, можно использовать дополнительную технологию хранения данных, такую как базы данных или простые текстовые файлы. Это возможно при помощи функции func_odbc, AstDB (встроенная база данных Asterisk) или даже простых AGI-скриптов.

Пример

Для более конкретной иллюстрации процесса, представим несколько шагов, как это можно реализовать:

  1. Сохранение ID вызывающего абонента: Каждый раз, когда исходящий вызов поступает на конкретное внутреннее расширение, вы сохраняете CALLERID в базу данных или файл. Например, это можно сделать следующим образом:

    exten => _X.,1,Set(LASTCALLER=${CALLERID(num)})
    same => n,Set(DB(lastcaller/${EXTEN})=${LASTCALLER})
    same => n,Dial(SIP/${EXTEN})

    Здесь DB(lastcaller/${EXTEN}) — это пример записи последнего звонящего номера в реестр Asterisk.

  2. Использование сохраненной информации: Когда поступает входящий вызов, вы получаете данные о последнем звонящем из вашей базы или файла и используете его для перенаправления.

    exten => _X.,1,Set(LASTCALLER=${DB(lastcaller/${EXTEN})})
    same => n,GotoIf($["${LASTCALLER}" != ""]?redirect:continue)
    same => n(redirect),Dial(SIP/${LASTCALLER})
    same => n(continue),Playback(no-valid-callback)

    Если сохраненный номер существует, вызов перенаправляется на него.

  3. Ошибка обратного вызова: В случае, если невозможно найти предыдущий вызов, можно добавить голосовое сообщение об ошибке или другую логику.

Применение

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

Разработка подобной системы в Asterisk требует определенного уровня навыков в программировании на dialplan и понимания концепций AGI/AMI, а также знания SQL, если планируется использование полноценных баз данных.

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

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

Оцените материал
Добавить комментарий

Капча загружается...