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

Передача вызова call-центру

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

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

Ответить
verhperm
Сообщения: 4
Зарегистрирован: 30 мар 2017, 16:39

Передача вызова call-центру

Сообщение verhperm »

Здравствуйте! Подключили услуги внешнего call-центра и приобрел себе головную боль :(
Раньше, при входящих вызовах - одновременно звонили телефоны у всех сотрудников (через очередь, с задержкой - сначала у одного, потом у других), но речь не об этом :)
Сейчас - к этим телефонам добавили внутренний номер call-центра (т.е. звоним одновременно на него, и на телефоны наших менеджеров).

Проблема, что оборудование call-центра сразу "снимает трубку" (отправляет код 200) и само генерирует длинные гудки (пока не ответит оператор) - телефоны у наших менеджеров не звонят.

Подскажите пожалуйста, в какую сторону рыть, чтобы заставить Астериск игнорировать ложное "снятие трубки" call-центром, распознавать гудки в линии и соединить каналы только тогда, когда там появится "живая речь" оператора?
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Передача вызова call-центру

Сообщение virus_net »

Интересная проблема. Сходу не могу придумать предложений.
А с call-центром общались по этому поводу ?
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

Re: Передача вызова call-центру

Сообщение ded »

Предложу чуть изменить сценарий:
1. Сначала ringall телефоны менеджеров втечение 5-7 сек., а потом переход на внешний call center
2. Dial(SIP/externalCC/12345)
или наоборот. Кто берёт на себя ударную нагрузку.
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Передача вызова call-центру

Сообщение virus_net »

Вообщем то либо просить калцентр не делать Ansewer ДО соединения с оператором, но боюсь этот deadend, т.к. вангую, что там сидит пряморукий Одмин, который просто не знает как сделать по другому.
Либо убрать калцентр из очереди и вызывать их номер только по выходу из очереди, когда есть тригеры, например "нет ответа" или "нет операторов очереди".
${QUEUESTATUS}: The status of the call as a text string.
TIMEOUT
FULL
JOINEMPTY
LEAVEEMPTY
JOINUNAVAIL
LEAVEUNAVAIL
CONTINUE
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
verhperm
Сообщения: 4
Зарегистрирован: 30 мар 2017, 16:39

Re: Передача вызова call-центру

Сообщение verhperm »

Спасибо за ответы!
1. Ударную нагрузку должен брать как раз call-центр. По диалплану - если в течение 10 секунд операторы call-центра не отвечают, то начинают звонить телефоны у наших менеджеров.
2. В call-центре именно однорукий админ, так что поставить Answer после ответа именно оператора у него вряд ли получится.
3. Пока допендрил до пары вариантов, напишу их в следующих сообщениях.
verhperm
Сообщения: 4
Зарегистрирован: 30 мар 2017, 16:39

Re: Передача вызова call-центру

Сообщение verhperm »

До ответа оператора - call-центр выдает в линию стандартные ring tones:
20-100 миллисекунд - фоновый шум при соединении
от 2-х до 6-х секунд - тишина
Дальше по циклу:
1 секунда - тон, 425 Hz
4 секунды - тишина

Оператор может ответить в любой момент, даже без гудков.

Первый вариант (чтобы не лезть в исходники Asteriska):
1. Номер call-центра набираем с опцией "M":

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

Dial(SIP/123, 60, TtM(callcenter))
2. После ответа call-центра, но до соединения каналов - вызовется макрос callcenter.
3. В макросе используем приложения wait, waitForSilence, waitForNoise с таймаутом.
Засекаем время выполнения каждой waitForSilence, waitForNoise, если оно соответствует нашему шаблону (гудки), то остаемся в цикле.
Если не соответствует - завершаем макрос и соединяем каналы.

Код макроса (диалплан на LUA):

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

         local ringing = 1
         local intervalLen = 30   -- интервал (мс), в течение которых должен быть шум/тишина
         app.wait(1)        -- отсекаем шум в начале соединения
         
         local t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())    -- 30123 (30 - количество секунд в текущей минуте; 123 - миллисекунды)
         local t2 = 0
         app.waitfornoise(intervalLen,1,6)			-- ждем первого гудка, или ответа оператора
         t2 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
         if (t2 < t1) then t2 = t2 + 60000 end                  -- на случай, если началась новая минута (t1 = 58123, а t2 = 01123)
         t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())

         while ringing == 1 do
            app.waitforsilence(intervalLen,1,1.1)            -- ждем окончания гудка (или перерыва в словах оператора)
            t2 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
            if (t2 < t1) then t2 = t2 + 60000 end
            if (t2 - t1 <= 950 or t2 - t1 >= 1050) then       -- если звук длился <= 0.95 или >= 1.05 секунды
                ringing = 0                                               -- значит оператор ответил, завершаем макрос
            else
                app.waitfornoise(intervalLen,1,4.1)          -- если нет, то ждем следующего гудка (4 секунды)
                t1 = tonumber(channel["STRFTIME(${EPOCH},0,%S%3q)"]:get())
                if (t1 < t2) then t1 = t1 + 60000 end
                if (t1 - t2 < 3950  or t1 - t2 >= 4050) then ringing = 0 end       -- если следующий звук не через 4 секунды, то завершаем макрос
                while t1 >= 60000 do t1 = t1 - 60000 end
            end
         end
         return 1;         
Проблема - в реальных условиях часто не распознается первый гудок, хотя все описанные условия соблюдаются (4 сек тишина, 1 сек - гудок, проверял в аудиоредакторе):
waitforsilence срабатывает через 100 - 700 мс, хотя должен срабатывать примерно через 1 секунду.
Увеличение интервала intervalLen не помогает.
verhperm
Сообщения: 4
Зарегистрирован: 30 мар 2017, 16:39

Re: Передача вызова call-центру

Сообщение verhperm »

Второй вариант - лезть в исходники, в файле dsp.c есть функция tone_detect, позволяющая распознать тон определенной частоты.
С её помощью можно модифицировать waitForNoise или написать свое приложение, которое будет ждать шума, а тон с частотой 425 Hz считать за тишину.
Аватара пользователя
Obi Van
Сообщения: 340
Зарегистрирован: 03 сен 2010, 11:21

Re: Передача вызова call-центру

Сообщение Obi Van »

Похоже что на FL.ru ваше задание? ;) Однако в этой ситуации, до того как понаставить костылей и подпорок, не проще что-то поменять в колл-центре. Ведь это не должно быть "только вашей проблемой" верно?
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

Re: Передача вызова call-центру

Сообщение ded »

verhperm писал(а):2. В call-центре именно однорукий админ, так что поставить Answer после ответа именно оператора у него вряд ли получится.
whoim
Сообщения: 766
Зарегистрирован: 26 ноя 2013, 23:25
Откуда: Краснодар
Контактная информация:

Re: Передача вызова call-центру

Сообщение whoim »

Правильно - решить проблему на стороне коллцентра.
Заодно и сип-транк с ними прямой замутить, чтобы не платить за исходящие.
облачные и локальные сервера asterisk/freepbx/a2billing/crm с полной техподдержкой. skype: whoim2, sipuri: whoim@asterisk.ru
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH