Как остановить сценарий AGI, когда другой абонент кладет трубку

У меня есть программа на Java, которая инициирует вызов клиенту и, после ответа, подключает его к расширению в диалплане. Это расширение, в свою очередь, запускает сценарий AGI для взаимодействия с клиентом. Если клиент держит линию до конца, все отлично. Но если он повесит трубку посередине, сценарий AGI продолжит работу. Я хотел бы, чтобы это остановилось в тот момент, когда клиент зависает.

Вот выдержка из исходной Java-программы:

OriginateAction originateAction;
ManagerResponse originateResponse;
originateAction=new OriginateAction();
originateAction.setChannel(phoneNumber);
originateAction.setExten("700");
originateAction.setContext("users");
originateAction.setPriority(new Integer(1));

//connect to Asterisk and login
ManagerConnectionFactory factory = new ManagerConnectionFactory("localhost","******","******");
managerConnection = factory.createManagerConnection();
managerConnection.login();
//send the originate action and wait for a maximum of 30 seconds to get a response
originateResponse=managerConnection.sendAction(originateAction, 30000);

Выдержка из диалплана

exten =>700,1,Agi(agi://localhost/message.agi,${var1},${var2},${var3},${var4}); script to play

И выписка из аги скрипта

public void service(AgiRequest arg0, AgiChannel arg1) throws AgiException {
        setVariable("missedSteps","4");
        verbose("  --------------  missed steps: 4 ----------------", 3);
        // Answer the channel and welcome
        answer();
        streamFile("silence/1");
        streamFile("welcome");
        setVariable("missedSteps","3");
        verbose("  --------------  missed steps: 3 ----------------", 3);
        //Read the file
        streamFile(fileName);
        setVariable("missedSteps","2");
        verbose("  --------------  missed steps: 2 ----------------", 3);
            ..........
            ..........
        setVariable("missedSteps","1");
        verbose("  --------------  missed steps: 1 ----------------", 3);
            ..........
            ..........
        setVariable("missedSteps","0");
        verbose("  --------------  missed steps: 0 ----------------", 3);
        //hangup
        hangup();

Итак, как вы видите, я пытаюсь сохранить переменную, которая отслеживает эволюцию внутри скрипта, и я хочу сохранить эту переменную, чтобы сохранить ее в журнале вызовов. Как видите, я добавил несколько подробных команд для отладки, и в консоли я вижу, что переменная «missedSteps» продолжает меняться от 4 до 0 независимо от того, завис клиент или нет.


person Othmane Bekkari    schedule 15.01.2014    source источник


Ответы (2)


Решение нашел случайно. На самом деле сценарий AGI останавливается при неудачном выполнении «streamFile». Поэтому я просто включил несколько «streamFile("silence/1")" перед каждым критическим шагом, перед обновлением переменной отслеживания. Сценарий AGI остановится при достижении этой инструкции, и переменная не будет обновлена.

person Othmane Bekkari    schedule 16.01.2014

Вы можете проверить переменную CHANNEL (checkhangup).

person arheops    schedule 15.01.2014
comment
Можете ли вы объяснить немного больше? Я не смог найти зависшую переменную CHANNEL в документации Asterisk. Он попытался создать переменную в Dialplan, которая устанавливается в 1 всякий раз, когда канал зависает, и это проверяется на каждом критическом шаге сценария Agi. Но опять же не работает. На самом деле кажется, что Asterisk запускает расширение h только после завершения работы сценария AGI. - person Othmane Bekkari; 16.01.2014
comment
теперь это называется checkhangup. используйте asterisk -rx core show function CHANNEL, чтобы увидеть doc. - person arheops; 16.01.2014