Страница 1 из 1

quene и callback

Добавлено: 07 дек 2015, 12:35
neomax22
Добрый день. Очень надеюсь на Вашу помощь, так как что то никак не получается с реализацией одной штуки, может я просто что то упускаю из виду. Задача стоит вроде бы и не сложная, сделать так, что бы при звонке извне, звонок сбрасывался, потом на этот номер астериск перезванивал и при поднятии трубки направлял вызов в очередь, если кратко то сделать callback и соединить его с очередью. В моей конфигурации используется астериск 1.6.2.24 Я пытался реализовать задачу следующим образом:
входящий контекст

Код: Выделить всё

context in-context {
    _X. => {
	NoOp("Call callback");
	System(/etc/asterisk/callback.sh ${CALLERID(num)}) ;
	Hangup();
    };
};
Сам скрипт для генерации call -файла:

Код: Выделить всё

#!/usr/bin/php -q
<?php
ob_implicit_flush(true);
set_time_limit(0);
$number = $argv[1];
$cf = fopen("/tmp/".$number,"w+"); 
fputs($cf,"Channel: Local/".$number."@operator-out\n");
fputs($cf,"Context: callback\n");
fputs($cf,"Extension: 333\n");
fputs($cf,"CallerID:".$number."\n");
fputs($cf,"MaxRetries: 100\n");
fputs($cf,"RetryTime: 30\n");
fclose($cf);
copy("/tmp/".$number,"/var/spool/asterisk/outgoing/".$number);
unlink("/tmp/".$number);
?>
контекст для исхода, который используеться для маршрутизации вызова callback'а астериска звонившему номеру:

Код: Выделить всё

context operator-out {
_050XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/101/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/301/${EXTEN},120);
	HangUp(17);
    };
}
я привел только кусок, так как дальше идет для других операторов и все однотипное
ну и сам контекст для callback:

Код: Выделить всё

context callback {
333 => {
 		NoOp("Callback called");
		 Answer();
		 Wait(1);
         Playback(pri);
         Queue(test_quene,tTwW,,,300);
         Hangup(17);
		 }
}
У меня через раз, то попадает вызов в очередь, то нет, не могу понять из-за чего, в логах ничего по этому поводу не нахожу.

Re: quene и callback

Добавлено: 08 дек 2015, 08:28
virus_net
neomax22 писал(а):У меня через раз, то попадает вызов в очередь, то нет
А куда ж он тогда попадает ? Никуда ? Что в логах CLI ?
Номер вообще не набирается ? Если "ДА", то ответ ниже.
neomax22 писал(а):Сам скрипт для генерации call -файла:
Вы создаете call-файл в /tmp, а затем копируете в /var/spool/asterisk/outgoing. Посему вполне вероятные грабли тут:
в Unix операция перемещения файла в пределах одного раздела (команда mv) просто перемещает «inode» – указатель на файл – и он появиться в указанной директории уже сразу целиком, что предотвращает ситуацию, когда Asterisk считывает частично записанный файл. (Обратите внимание: Что все вышесказанное относиться только к тому случаю, если источник и точка перемещения файла находятся в пределах одного логического раздела, иначе, будет использоваться эквивалентная комбинация из команд «cp» и «rm»
Создайте диру /var/spool/asterisk/outgoing-tmp/ и уже в ней создавайте call-файлы, а затем выполняйте mv.
neomax22 писал(а):в логах ничего по этому поводу не нахожу.
Смотря что именно вы там ищете. Для начала нужно искать нужно отработку operator-out, если call-файл был успешно создан и обрабатывался.

Re: quene и callback

Добавлено: 08 дек 2015, 11:30
neomax22
Сам call-файл создаеться, так как колбек срабатывает, вот только в очередь бросает не всегда, почему, я не могу понять.
В логи вываливаеться следующее:

Код: Выделить всё

**********
-- Executing [050******@in-context:32] NoOp("SIP/101-00000005", ""Call callback"") in new stack
-- Executing [050******@in-context:33] System("SIP/101-00000005", "/etc/asterisk/callback.sh 095******") in new stack
    -- Executing [050*****@in-context:34] Hangup("SIP/101-00000005", "") in new stack
  == Spawn extension (in-context, 050*********, 34) exited non-zero on 'SIP/101-00000005'
    -- Attempting call on Local/095*******@operator-out for 333@callback:1 (Retry 1)
    -- Executing [095*******@operator-out:1] Set("Local/095*********@operator-out-f0f9;2", "VOLUME(TX)=7") in new stack
    -- Executing [095*******@operator-out:2] Set("Local/095*********@operator-out-f0f9;2", "VOLUME(RX)=7") in new stack
    -- Executing [095*******@operator-out:3] Dial("Local/095*********@operator-out-f0f9;2", "SIP/101/095**********,120") in new stack
  == Using SIP RTP CoS mark 5
    -- Called 101/095*********
    -- SIP/101-00000006 is making progress passing it to Local/095***********@operator-out-f0f9;2
    -- SIP/101-00000006 answered Local/095************@operator-out-f0f9;2
       > Channel Local/095***********@operator-out-f0f9;1 was answered.
    -- Executing [333@callback:1] NoOp("Local/095***********@operator-out-f0f9;1", ""Callback called"") in new stack
    -- Executing [333@callback:2] Answer("Local/095*********@operator-out-f0f9;1", "") in new stack
    -- Executing [333@callback:3] Wait("Local/095**********@operator-out-f0f9;1", "1") in new stack
а вот после этого бывает разное или больше ничего в логе или же видно что попадает в очередь, от случая к случая по разному

Re: quene и callback

Добавлено: 08 дек 2015, 11:54
neomax22
Забыл добавить, что если все отработает как надо, то при этом

Код: Выделить всё

core show channels
Channel              Location             State   Application(Data)
0 active channel
3 active calls
8 calls processed
появляються активные звонки после того как звонок завершен и нету занятых каналов. Извините, если я и правда чего то недопонимаю, диалплан вроде бы и не сложный, но все же что то видимо не так или это баг какой

Re: quene и callback

Добавлено: 09 дек 2015, 07:57
virus_net
Вызов не может исчезать бесследно.
neomax22 писал(а):или больше ничего
НИверю.
Грепните лог по имени канала operator-out-f0f9 и получите все строки по данному вызову
Что в CDR в поле lastdata по данному вызову ?

P.S. НЕ надо заменять номер на звезды, читать это неудобно. Если ух хотите заменить, то заменяйте ЦИФРЫ на ЦИФРЫ.

Re: quene и callback

Добавлено: 09 дек 2015, 15:31
neomax22
Путем дальнейшего изучения логов и включения логирование всего и вся :) увидел следующее сообщение в логах:

Код: Выделить всё

Delaying retry since we're currently running '/var/spool/asterisk/outgoing/file_name
которое постоянно повторялось и это в любом случае (удачное попадание звонка в очередь или же нет) Так же посмотрев в папку, я увидел что call-файл не удалился, хотя по идее должен был (но в логе как раз и пишет что удалить неполучаеться, пока занят). После этого я попробовал разные варианты и переделал к следующему виду:

Код: Выделить всё

context in-context {
    _X. => {
   NoOp("Call callback");
   System(/etc/asterisk/callback.sh ${CALLERID(num)} ${CHANNEL:0:7}) ;
   Hangup();
    };
};
сам файл генерации call-файла принял следующий вид:

Код: Выделить всё

#!/usr/bin/php -q
<?php
ob_implicit_flush(true);
set_time_limit(0);
$number = $argv[1];
$channel=$argv[2];
$cf = fopen("/tmp/".$number,"w+"); 
fputs($cf,"Channel: ".$channel."/".$number."\n");
fputs($cf,"Context: callback\n");
fputs($cf,"Extension: 333\n");
fputs($cf,"CallerID:".$number."\n");
fputs($cf,"MaxRetries: 10\n");
fputs($cf,"RetryTime: 40\n");
fputs($cf,"WaitTime: 30\n");
fclose($cf);
touch("/tmp/".$number,time()+60);
exec("mv /tmp/".$number." /var/spool/asterisk/outgoing/".$number);
то есть раньше канал был вида Local/number@operator_out
принял вид channel/number где channel береться из входящего звонка, это строка вида SIP/101
в теперешнем варианте контекст operator_out не используеться и исходящий звонок от астериска идет через тот же канал через который был входящий. В таком случае колбек отрабатывает нормально, из всех тестов звонки попадали в очередь без проблем, единственное что теперь конешно исходящий звонок всегда идет по тому каналу по которому был входящий а не маршрутизируеться через контекст. Call-файлы начали корректно удаляться. К сожалению, я не нашел хорошей информации, о том как правильно использовать Channel в call-файле. Если это возможно, можно указать в чем была ошибка в предыдущем варианте реализации

Код: Выделить всё

context operator-out {
    _0[69]3XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/204/${EXTEN},120);
	Hangup();
    };
    _050XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/101/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/303/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/302/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/301/${EXTEN},120);	
	HangUp(17);
    };
    _066XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/101/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/303/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/302/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/301/${EXTEN},120);	
	HangUp(17);
    };
    _09[59]XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/101/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/303/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/302/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/301/${EXTEN},120);
	HangUp(17);
    };
    _06[78]XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/203/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/202/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/201/${EXTEN},120);
	HangUp(17);
    };
    _09[6-8]XXXXXXX => {
	Set(VOLUME(TX)=7);
        Set(VOLUME(RX)=7);
	Dial(SIP/203/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/202/${EXTEN},120);
	if ("${DIALSTATUS}" = "ANSWER") {
	HangUp(17);
	};
	if ("${DIALSTATUS}" = "BUSY") {
	HangUp(17);
	};
	Dial(SIP/201/${EXTEN},120);
	HangUp(17);
    };
};

Re: quene и callback

Добавлено: 09 дек 2015, 16:50
neomax22
Похоже я все же нашел причину такого странного поведения)
я ошибся в синтаксисе скрипта который создавал call-файлы, для корректной работы канала в скрипте я писал следующий код:

Код: Выделить всё

fputs($cf,"Channel: Local/".$number."@operator-out\n");
а в даном случае надо было

Код: Выделить всё

fputs($cf,"Channel: Local/".$number."@operator-out/n\n");
После таких изменений все заработало как надо.
Спасибо за помощь в решении проблемы.