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

Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 12:30
r@diO
Приветствую всех присутствующих!, уважаемые форумчане!
Есть такая задача:
1. Принять входящий вызов;
2. Записывать n секунд, что говорит позвонивший;
3. Положить трубку (положить трубку может и сам звонящий, не дождавшись завершения записи);
4. Позвонить с внутренного номера на внутренний;
5. При соединении проиграть сделанную запись.
Делаю так:
[code]
exten => 7933XXXXXXX,1,Answer
exten => 7933XXXXXXX,n,Playback(01)
exten => 7933XXXXXXX,n,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
exten => 7933XXXXXXX,n,Record(/var/spool/asterisk/monitor/${fname}.wav,3,5)
exten => 7933XXXXXXX,n,Playback(02)
exten => 7933XXXXXXX,n,Hangup
include => new_call
[/code]
В new_call создается call-файл:
[code]
[new_call]
exten => h,1,NoOp(Создание call-файла)
exten => h,n,AGI(newcallfile.php)
[/code]
[code]
#!/usr/bin/php -q
<?php
ob_implicit_flush(false);
set_time_limit(10);
error_reporting(0);

$par=$argv[1];
$channel= $par;

$uid=time();

$f1=fopen("/tmp/$uid.call","w");
fputs($f1,"Channel: SIP/000@localout\n");
fputs($f1,"MaxRetries: 0\n");
fputs($f1,"RetryTime: 600\n");
fputs($f1,"WaitTime: 30\n");
fputs($f1,"Context: localin\n");
fputs($f1,"Extension: s\n");
fputs($f1,"Priority: 1\n");
fclose($f1);

system("mv /tmp/$uid.call /var/spool/asterisk/outgoing/");

?>
[/code]
И здесь я застрял. Не разберусь с настройкой контекстов, чтобы сделать звонок с внутреннего на внутренний.
Пожалуйста, подтолкните в нужном направлении.

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 12:38
Wapo
Делать так:

Channel: Local/000@context-local

и направлять вызов в
Context: playfile
Exten: 1
Priority: s

ну а там
[playfile]
exten => s,1,Answer
exten => s,n,Playback....

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 15:36
r@diO
Все равно что-то никак (
Call-файл:
[code]
$f1=fopen("/tmp/$uid.call","w");
fputs($f1,"Channel: Local/000@localout\n");
fputs($f1,"MaxRetries: 0\n");
fputs($f1,"RetryTime: 600\n");
fputs($f1,"WaitTime: 30\n");
fputs($f1,"Context: localin\n");
fputs($f1,"Extension: s\n");
fputs($f1,"Priority: 1\n");
fclose($f1);
[/code]
контексты:
[code]
[localout]
exten => 000,1,NoOp(Вызов с ${CALLERID(num)} на ${EXTEN})
exten => 000,n,Dial(LOCAL/000@localin)
exten => 000,n,Congestion
[localin]
exten => s,1,NoOp(Вызов с ${CALLERID(num)} на ${EXTEN})
exten => s,n,Answer
exten => s,n,Hangup
[/code]
cli:
-- Attempting call on Local/000@localout for s@localin:1 (Retry 1)
-- Executing [000@localout:1] NoOp("Local/000@localout-00000018;2", "Вызов с на 000") in new stack
-- Executing [000@localout:2] Dial("Local/000@localout-00000018;2", "LOCAL/000@localin") in new stack
[Sep 11 19:30:25] NOTICE[14011]: chan_local.c:970 local_call: No such extension/context 000@localin while calling Local channel
-- Couldn't call LOCAL/000@localin
== Everyone is busy/congested at this time (0:0/0/0)
-- Executing [000@localout:3] Congestion("Local/000@localout-00000018;2", "") in new stack
> Channel Local/000@localout-00000018;1 was never answered.
[Sep 11 19:30:25] NOTICE[14010]: pbx_spool.c:372 attempt_thread: Call failed to go through, reason (8) Congestion (circuits busy)
[Sep 11 19:30:25] NOTICE[14010]: pbx_spool.c:375 attempt_thread: Queued call to Local/000@localout expired without completion after 0 attempts
== Spawn extension (localout, 000, 3) exited non-zero on 'Local/000@localout-00000018;2'

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 17:41
r@diO
Wapo писал(а):Делать так:
...
Спасибо. Вроде разобрался. Сделал так:
Call-файл:

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

#!/usr/bin/php -q
<?php
    ob_implicit_flush(false);
    set_time_limit(10);
    error_reporting(0);

    $to = $argv[1]; //вызов на (телефон сервиса)
    $from = $argv[2]; //вызов с (телефон клиента)
    $file = $argv[3]; //имя файла с записью

    $uid = time();

    $f1 = fopen("/tmp/$uid.call","w");
    fputs($f1, "Channel: Local/000@localout\n");
    fputs($f1, "CallerID: ".$from."\n");
    fputs($f1, "MaxRetries: 0\n");
    fputs($f1, "RetryTime: 5\n");
    fputs($f1, "WaitTime: 5\n");
    fputs($f1, "Context: localin\n");
    fputs($f1, "Extension: 001\n");
    fputs($f1, "Priority: 1\n");
    fputs($f1, "AlwaysDelete: Yes\n");
    fputs($f1, "Archive: No\n");
    //установка дополнительных переменных
    fputs($f1, "Set: __PHONE_TO=".$to."\n");
    fputs($f1, "Set: __RECORD_FILE=".$file."\n");
    fclose($f1);

    system("mv /tmp/$uid.call /var/spool/asterisk/outgoing/");
?>
Контексты:
[localout]
exten => 000,1,NoOp(LOCALOUT ${CALLERID(num)} ${PHONE_TO})
exten => 000,n,Dial(LOCAL/001)
exten => 000,n,Playback(/var/spool/asterisk/monitor/${RECORD_FILE})
exten => 000,n,Congestion
exten => 000,n,Hangup
[localin]
exten => 001,1,NoOp(LOCALIN ${CALLERID(num)} ${PHONE_TO})
exten => 001,n,Answer
exten => 001,n,Wait(5)
exten => 001,n,Hangup

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 17:54
ded

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

exten => 000
exten => 001
Что-то Вы вразрез с общепринятой практикой едете.
Зачем Вам нули? Вы собирались внутренние номера делать трёхзначными, начианя с 000 и кончая 999, по порядку?
Офигеть, дайте 2.

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 18:08
r@diO
Осталось пару вопросов:
1. Подскажите, правильно ли я использую congestion и hangup в контексте localout ?
2. Если положить трубку во время работы команды record, то записи создано не будет. Можно ли это как-то обойти? И как получить код возврата команды record ?

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 18:08
r@diO
ded писал(а):

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

exten => 000
exten => 001
Что-то Вы вразрез с общепринятой практикой едете.
Зачем Вам нули? Вы собирались внутренние номера делать трёхзначными, начианя с 000 и кончая 999, по порядку?
Офигеть, дайте 2.
Это не принципиально, но поправлю )

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 18:57
ded

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

[localout]
exten => 000,1,NoOp(LOCALOUT ${CALLERID(num)} ${PHONE_TO})
exten => 000,n,Dial(LOCAL/001)
exten => 000,n,Playback(/var/spool/asterisk/monitor/${RECORD_FILE})
exten => 000,n,Congestion
exten => 000,n,Hangup
r@diO писал(а):1. Подскажите, правильно ли я использую congestion и hangup в контексте localout ?
Неправильно. exten => 000,n,Hangup не исполнится никогда.
r@diO писал(а):2. Если положить трубку во время работы команды record, то записи создано не будет. Можно ли это как-то обойти? И как получить код возврата команды record ?
В приведённом контексте нет команды record.

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 19:13
r@diO
1. Понятно. Спасибо.
2.

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

exten => 7933XXXXXXX,1,Answer
exten => 7933XXXXXXX,n,Playback(01)
exten => 7933XXXXXXX,n,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
exten => 7933XXXXXXX,n,Record(/var/spool/asterisk/monitor/${fname}.wav,3,5)
exten => 7933XXXXXXX,n,Playback(02)
exten => 7933XXXXXXX,n,Hangup
include => new_call
Если во время выполнения
exten => 7933XXXXXXX,n,Record(/var/spool/asterisk/monitor/${fname}.wav,3,5)
звонящий положит трубку, то далее при попытке воспроизвести запись, будет выдана ошибка, что такого файла нет в директории.

Re: Звонок с внутренного на внутренний и проигрывание записи

Добавлено: 11 сен 2013, 19:22
ded
Не используйте Record, используйте MixMonitor.