ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы и их решения Asterisk как такового

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

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

Сообщение verhperm » 30 мар 2017, 17:49

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

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

Подскажите пожалуйста, в какую сторону рыть, чтобы заставить Астериск игнорировать ложное "снятие трубки" call-центром, распознавать гудки в линии и соединить каналы только тогда, когда там появится "живая речь" оператора?
verhperm
 
Сообщений: 4
Зарегистрирован: 30 мар 2017, 17:39

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

Сообщение virus_net » 31 мар 2017, 09:41

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

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

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

Сообщение ded » 31 мар 2017, 10:42

Предложу чуть изменить сценарий:
1. Сначала ringall телефоны менеджеров втечение 5-7 сек., а потом переход на внешний call center
2. Dial(SIP/externalCC/12345)
или наоборот. Кто берёт на себя ударную нагрузку.
ded
 
Сообщений: 15803
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение virus_net » 31 мар 2017, 10:44

Вообщем то либо просить калцентр не делать 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 - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

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

Сообщение verhperm » 01 апр 2017, 20:32

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

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

Сообщение verhperm » 01 апр 2017, 20:50

До ответа оператора - 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, 17:39

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

Сообщение verhperm » 01 апр 2017, 20:53

Второй вариант - лезть в исходники, в файле dsp.c есть функция tone_detect, позволяющая распознать тон определенной частоты.
С её помощью можно модифицировать waitForNoise или написать свое приложение, которое будет ждать шума, а тон с частотой 425 Hz считать за тишину.
verhperm
 
Сообщений: 4
Зарегистрирован: 30 мар 2017, 17:39

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

Сообщение Obi Van » 05 апр 2017, 14:16

Похоже что на FL.ru ваше задание? ;) Однако в этой ситуации, до того как понаставить костылей и подпорок, не проще что-то поменять в колл-центре. Ведь это не должно быть "только вашей проблемой" верно?
Аватар пользователя
Obi Van
 
Сообщений: 340
Зарегистрирован: 03 сен 2010, 11:21

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

Сообщение ded » 05 апр 2017, 15:54

verhperm писал(а):2. В call-центре именно однорукий админ, так что поставить Answer после ответа именно оператора у него вряд ли получится.
ded
 
Сообщений: 15803
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение whoim » 14 апр 2017, 13:09

Правильно - решить проблему на стороне коллцентра.
Заодно и сип-транк с ними прямой замутить, чтобы не платить за исходящие.
облачные и локальные сервера asterisk/freepbx/a2billing/crm с полной техподдержкой. skype: whoim2, sipuri: whoim@asterisk.ru
whoim
 
Сообщений: 766
Зарегистрирован: 26 ноя 2013, 23:25
Откуда: Краснодар


Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 22

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH