VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Проблема записи вызовов

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
guvijur
Сообщения: 85
Зарегистрирован: 22 авг 2011, 17:03

Проблема записи вызовов

Сообщение guvijur »

Доброго всем дня!
Разрешите немного потупить?

На астериске написан план набора, который однозначно через MixMonitor инициирует запись всех входящих со стороны провайдера (внешние входящие вызовы).
Входящий звонок после IVR попадает в очередь, где на него отвечает один из свободных секретарей. Тут вопросов нет, всё работает. Так же всё без проблем работает, если вызывающая сторона наберёт добавочный номер в процессе прослушивания IVR. Тут тоже всё отлично, поскольку у меня в плане набора стоит проверка на канал, с которого пришёл вызов (Если ${CHANNEL:0:5} = DAHDI , то включаем MixMonitor)
Но, если клиент просит секретаря перевести вызов на другого сотрудника, то возникает проблема, поскольку текущая запись останавливается, а новая не начинается.
Да, она может начаться, если в БД установлен нужный ключ для sippeer-а. Другими словами, в БД MySQL в таблицу sip добавлено мной вручную поле "rec", принимающее значения 0 или 1. В контексте, который обрабатывает местные вызовы, происходит обращение к БД и среди прочего считывается значение этого поля для вызывающей стороны и для вызываемой стороны. Если хотя бы одно из них равно 1, то задействуется MixMonitor.
Что, как я думаю, происходит в момент перевода вызова:
1. Если для местного номера секретаря и у номера, на который звонок будет переведён, в поле "rec" не стоит 1, то вызов переводится, но запись заканчивается, как только секретарь положила трубку.
2. Если же 1 в поле стоит, то в момент перевода формируется новый файл для записи и начинается запись в него.

Мне же надо, чтобы система писала вызов от и до в один файл: звонок пришёл, запись пошла, секретарь ответил, секретарь перевёл, сотрудник ответил на переведённый звонок, сотрудник закончил разговор, запись закончилась. Но так не получается. (((

Я сломал голову и не знаю, как сделать так, чтобы при переводе звонка астериск проверял - "А не идёт ли уже запись?" - и не обрубал её, начиная новую.

Пример кода:
;Сюда маршрутизируется звонок на номер 7654321
[7654321]
exten => 7654321,1,
same => n,MYSQL(Connect connid localhost asterisk Пароль asterisk) ; Подключаемся к базе данных
same => n,MYSQL(Query resultid ${connid} SELECT id FROM blacklist WHERE number = '${CALLERID(num)}') ; Выбираем поле id из таблицы blacklist, где поле number = номеру вызывающей стороны
same => n,MYSQL(Fetch fetchid ${resultid} BLIST) ; Присваиваем результат переменной BLIST
same => n,MYSQL(Clear ${resultid})
same => n,MYSQL(Disconnect ${connid}) ; Разъединяемся
same => n,GotoIf($["${ISNULL(${BLIST})}" = "1"]?in:out)
same => n(in),Macro(ivr,${EXTEN})
same => n,Goto(end)
same => n(out),Wait(1)
same => n,Playback(incorect-number)
same => n(end),HangUp

;IVR
[macro-ivr]
exten => s,1,Set(CALLFILENAME=${UNIQUEID}_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
same => n,Set(CDR(userfield)=${CALLFILENAME}.gsm)
same => n,MixMonitor(/records/${CALLFILENAME}.gsm)
same => n,Set(QUEUENAME=q${ARG1})
same => n,Wait(0.5)
same => n,Read(IntNum,hello&nomer_sotr&na_linii,5,,1,3)
same => n,GotoIf($["${ISNULL(${IntNum})}" = "1"]?queue:intcall)
same => n(queue),Queue(${QUEUENAME},tT,,announceoverride,3000)
same => n,NoOp(${DIALSTATUS})
same => n,NoOp(${QUEUESTATUS})
same => n,Goto(end)
same => n(intcall),Goto(internal,${IntNum},1)
same => n,Goto(end)
same => n(end),HangUp
exten => i,1,Playback(invalid)
exten => i,n,HangUp

;Ну и собственно контекст internal
[internal]
exten => _5XXX,1,Set(SECLINE=${SIPPEER(${EXTEN},curcalls)})
same => n,GotoIf($["${SECLINE}" = "0"]?notsecline:secline)
same => n(secline),Playback(abonent-razgovarivaet)
same => n(notsecline),MYSQL(Connect connid localhost asterisk пароль asterisk)
same => n,MYSQL(Query resultid ${connid} SELECT rec FROM sip WHERE name = '${EXTEN}')
same => n,MYSQL(Fetch fetchid ${resultid} REC1)
same => n,MYSQL(Clear ${resultid})
same => n,MYSQL(Query resultid ${connid} SELECT rec FROM sip WHERE name = '${CALLERID(num)}')
same => n,MYSQL(Fetch fetchid ${resultid} REC2)
same => n,MYSQL(Clear ${resultid})
same => n,MYSQL(Disconnect ${connid})
same => n,GotoIf($[$["${REC1}" = "1"] | $["${REC2}" = "1"] | $["${CHANNEL:0:5}" = "DAHDI"]]?recordingenabled:recordingdisabled)
same => n(recordingenabled),Set(CALLFILENAME=${UNIQUEID}_${EPOCH})
same => n,Set(CDR(userfield)=${CALLFILENAME}.gsm)
same => n,MixMonitor(/records/${CALLFILENAME}.gsm)
same => n(recordingdisabled),Dial(SIP/${EXTEN},60,tg)
same => n,StopMonitor()
same => n,HangUp()

Я знаю, что тут есть много людей, которые на много лучше меня разбираются в теме.
Прошу помочь, указать на ошибки и сказать в какую сторону копать. Если будут примеры, то этим вы меня просто осчастливите.
Всем спасибо.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: Проблема записи вызовов

Сообщение ded »

AUDIOHOOK_INHERIT
guvijur
Сообщения: 85
Зарегистрирован: 22 авг 2011, 17:03

Re: Проблема записи вызовов

Сообщение guvijur »

ded писал(а):AUDIOHOOK_INHERIT
А не подскажите, как можно посмотреть статус этой функции?
Ну вот мне, например, надо в контексте обработки локальных вызовов видеть, что стоит в AUDIOHOOK_INHERIT(MixMonitor) - yes или no.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: Проблема записи вызовов

Сообщение ded »

Наверное так?
NoOp(Audio hook status is $AUDIOHOOK_INHERIT(MixMonitor))
guvijur
Сообщения: 85
Зарегистрирован: 22 авг 2011, 17:03

Re: Проблема записи вызовов

Сообщение guvijur »

Увы, но нет.
Ладно, вы и так помогли.
Проблема решена.
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: Проблема записи вызовов

Сообщение ded »

Я там опечатался - нужно с фигурными скобками
NoOp(Audio hook status is ${AUDIOHOOK_INHERIT(MixMonitor)})
guvijur
Сообщения: 85
Зарегистрирован: 22 авг 2011, 17:03

Re: Проблема записи вызовов

Сообщение guvijur »

Я пробовал и так и этак. Не показывает.
Вот, как я написал и не один вариант не сработал:

same => n,NoOp(AUDIOHOOK_INHERIT(MixMonitor) = ${AUDIOHOOK_INHERIT(MixMonitor)})
same => n,NoOp(AUDIOHOOK_INHERIT(MixMonitor) = ${AUDIOHOOK_INHERIT()})
same => n,NoOp(AUDIOHOOK_INHERIT(MixMonitor) = ${AUDIOHOOK_INHERIT})
same => n,NoOp(Audio hook status is $AUDIOHOOK_INHERIT(MixMonitor))
ded
Сообщения: 15625
Зарегистрирован: 26 авг 2010, 19:00

Re: Проблема записи вызовов

Сообщение ded »

Да, наверное потому, что это всё же функция, а не переменная.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH