Использование Asterisk AGI для исходящих звонков с использованием Originate и контроля обеих сторон звонка
Я строю очень сложный IVR, используя Asterisk AGI. Я использую AsterNET .NET Framework для интеграции в FastAGI.
Большая часть сценариев работает нормально, у меня проблема с исходящими звонками. Приложение IVR будет работать с входящими вызовами, поступающими в план набора, который отправляет его в AGI для выполнения работы. Сценарий AGI выполняет множество задач, поиск в базе данных, многоуровневое меню и т. Д., А также выполняет наборы номеров, чтобы подключить входящего абонента. Очевидно, я мог бы просто использовать приложение Dial в AGI, так что-то вроде:
Exec("Dial", "PJSIP/Number,30,r")
и действительно, я могу, и это прекрасно работает. Тем не менее, мне нужно больше контроля над исходящей стороной вызова. Например, мне нужно сохранять входящий звонок или воспроизводить музыку, пока исходящие отвечают, а я воспроизводю аудио на исходящий. Что, опять же, я знаю, что могу сделать с помощью Dial, однако мне нужно воспроизвести аудио на исходящей стороне вызова и позволить им принять вызов или отклонить его с помощью DTMF, чего Dial не делает. Если они отклоняют вызов, исходящий прекращается и возвращается к входящему сценарию, чтобы сделать что-то еще, например, набрать другой номер или сделать что-то еще, например голосовую почту.
Итак, я подумал об использовании Originate и передаче его обратно другому сценарию AGI, так что-то вроде:
Exec("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call")
что опять-таки работает. Входящий ждет некоторое время, пока ответная сторона отвечает, исходящая сторона затем выполняет все, что находится в сценарии, а входящая затем следует своему сценарию - отдельно. Тогда мне нужно соединить их вместе, поэтому я, конечно, использую Bridge!!! Но, похоже, я понятия не имею, что такое другой канал, чтобы объединить их вместе, и у меня возник вопрос, как мне уведомить свой входящий участок о статусе исходящего участка, как будто я не делаю это сразу, как только исходящая ветвь отвечает, что моя входящая ветвь продолжает свое выполнение, тогда как мне нужно дождаться, если исходящий ответит и запрашивает dtmf от пункта назначения. Я думаю, что я мог бы опросить базу данных, возможно, но каждый сценарий снова должен был бы как-то ссылаться.
Я также попытался отправить по каналу входящего в исходящий скрипт, например:
("Originate", "PJSIP/Number,app,AGI,agi://IP_Address:1234/outbound_call," + + request.Channel)
но я не могу заставить переменную Channel отображаться, так как я не могу получить несколько аргументов, работающих для arg2 в Originate Exec, он просто видит ее как arg3, которая игнорируется, если type is app.
Возможно, я подхожу к этому не с той точки зрения, поэтому буду признателен за любые мысли о том, как это сделать. Я не могу просто использовать расширения для создания этого, так как он слишком сложный, и он будет получать много одновременных вызовов, все с использованием одного и того же сценария, но с одновременным вызовом разных получателей и т. Д., И все это динамично.
Спасибо
Дэвид
1 ответ
В случае, если кому-то интересно, я сделал это сам, используя AMI, чтобы выполнить действие Originate, чтобы вызвать мой исходящий вызов и отправить в сценарий AGI входящий канал, затем мой сценарий AGI контролирует исходящий вызов, а затем я использую Bridge для соединить исходящий вызов из моего скрипта AGI с входящим, используя переданный параметр канала, поэтому мои 2 канала полностью разделены, поэтому я могу делать то, что мне нравится, с любым из них, прежде чем соединить их вместе. На тестирование у меня ушло несколько дней, но это сделано без использования локального канала или переписывания app_originate.