AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Распределенный CallCenter

Newbies/FAQ Forum 16 сообщений 21.09.2011 12:07 - 24.09.2011 13:01
#1 21.09.2011 12:07

Распределенный CallCenter


Есть 3 инсталяции Asterisk 1.6.2.19. Назовем их условно store1,store2 и store3.
На каждом из них по одному абоненту. Назовем их условно 100, 200 и 300.
На каждый Asterisk заведено по одной городской линии.
На каждом Asterisk созданы очереди обработки входящих городских вызовов, причем мемберами (members) в каждой очереди являются все 3 абонента.
Queues.conf выглядит примерно так:
Code:

member => SIP/100
member => IAX2/store2/200
member => IAX2/store3/300


Когда входящий городской на Store1 попал в очередь и SIP/100 занят вызов пойдет на IAX2/store2/200 и будет обработан там в контексте определенном для IAX2/store2 (например incoming_local). Однако если просто позвонить с Store1/100 на Store2/200 вызов так же попадет в контекст incoming_local

Вопрос: каким образом на Store2 отделить вызовы поступившие из глобальной очереди и просто звонки одного оператора другому?
#2 21.09.2011 12:46

По CallerID ?
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#3 21.09.2011 12:46

К примеру можно добавить некую переменную, которой будет присваиваться значение:

exten => 100,1,Answer
exten => 100,n,Set(FROM=queue-store1)
exten => 100,n,Queue(some)

а дальше уже анализ этой переменной

_________________
P4 3.0 + 1Gb CentOS 5.5 Aster 1.8.5
Не люблю gui-сборки: натуральный продукт вкуснее.
#4 21.09.2011 12:56

Wapo wrote:
К примеру можно добавить некую переменную, которой будет присваиваться значение:

exten => 100,1,Answer
exten => 100,n,Set(FROM=queue-store1)
exten => 100,n,Queue(some)

а дальше уже анализ этой переменной


А как передать значение данной переменной на store2/200?

Пока нашел одно решение, в принципе не такое уж и безобразное.
Для связи Астеров создаю по 2 канала: IAX2/store1 и IAX2/store1_queue, IAX2/store2 и IAX2/store2_queue, IAX2/store3 и IAX2/store3_queue
Каждому каналу свой контекст.
В диалпланах соответственно если вызов между операторами то использую IAX2/store2/200, а при указании мембера для очереди IAX2/store2_queue/200
#5 21.09.2011 13:04

А вот попробуйте протестить такую конструкцию:

exten => s,n,Queue(test,ct,,,ohh)

[macro-ohh]
exten => s,1,NoOP(${UNIQUEID}:${CDR(dst)}:${CDR(src)}:${AGENT}:${Who${AGENTLINE}}:${__AGENTLINE}-- )

и удивитесь сколько всего интересного прилетает в момент ответа агента

_________________
P4 3.0 + 1Gb CentOS 5.5 Aster 1.8.5
Не люблю gui-сборки: натуральный продукт вкуснее.
#6 21.09.2011 13:17

Wapo wrote:
А вот попробуйте протестить такую конструкцию:

exten => s,n,Queue(test,ct,,,ohh)

[macro-ohh]
exten => s,1,NoOP(${UNIQUEID}:${CDR(dst)}:${CDR(src)}:${AGENT}:${Who${AGENTLINE}}:${__AGENTLINE}-- )

и удивитесь сколько всего интересного прилетает в момент ответа агента


Может я чего-то недопонимаю, но [macro-ohh] отработает когда я ставлю звонок в очередь, а не в тот момент когда происходит обзвон мемберов очереди на предмет доступности?
Допустим поступил входящий на store1, попал в очередь на этом же store1, далее store1 начинает обзванивать мемберов-участников очереди. Можно ли влезть именно в этот момент для того чтобы указать какие-то дополнительные переменные, которые я уже потом смогу поймать и обработать на store2 или store3?
#7 21.09.2011 13:20

Макро срабатывает ДЛЯ агента в момент его ответа на звонок.
Кроме того есть такая чудестная переменная типа ${CDR(userfield)} куда вы может загнать что душе угодно на store1 а прочесть на store2 (надеюсь)

_________________
P4 3.0 + 1Gb CentOS 5.5 Aster 1.8.5
Не люблю gui-сборки: натуральный продукт вкуснее.
#8 21.09.2011 14:00

Wapo:
Quote:
Кроме того есть такая чудестная переменная типа ${CDR(userfield)} куда вы может загнать что душе угодно на store1 а прочесть на store2 (надеюсь)


ого, это когда астериск научился CDR прокидывать между собой ?
#9 21.09.2011 14:06

Игорь wrote:
Wapo:
Quote:
Кроме того есть такая чудестная переменная типа ${CDR(userfield)} куда вы может загнать что душе угодно на store1 а прочесть на store2 (надеюсь)


ого, это когда астериск научился CDR прокидывать между собой ?

Вот и я о том же! никогда второй Asterisk не узнает что там отработало в макросе на другой стороне
#10 21.09.2011 14:16

Для начала напомню что макро ohh сработает на стороне сервера-владельца очереди. Для него внешние агенты - лишь каналы, в которые ваще-то впихнуть много можно. Всяко CALLERID(name) присутствует и доступен для модификации как ДО входа звонка в очередь так и в момент ответа. Равно как старт того же AGI-скрипта (который уже в этот момент ЗНАЕТ какой канал ответил на внешнем сервере).
_________________
P4 3.0 + 1Gb CentOS 5.5 Aster 1.8.5
Не люблю gui-сборки: натуральный продукт вкуснее.
#11 21.09.2011 20:34

2 Wapo:

Quote:
Для начала напомню что макро ohh сработает на стороне сервера-владельца очереди


это конечно замечательно, но как говорится есть ньюянс... очередь вместе с макросом на store1 а значение макросом предлагается вытаскивать на store2...

2 топик стартер, раз уж разнесли по контекстам и работает, то и пользуйте. Как вариант можно было просто мемберу префикс добавить:

Code:
member => IAX2/store2/fromstore200


а потом на sotore2 по нему и фильтрануть... короче вариантов куча всяких разных.
#12 22.09.2011 18:53

на правах рекламы: я реализовал очередь для распределенных астерисков, kamailio раскидывает звонки на asterisk ноды, очереди реализованы c помощью AGI, решение коммерческое, успешно работает пару лет в крупном call центре, кому надо в личку.
#13 23.09.2011 06:41

Quote:
Как вариант можно было просто мемберу префикс добавить:

Code:
member => IAX2/store2/fromstore200


а потом на sotore2 по нему и фильтрануть... короче вариантов куча всяких разных.

Все правильно, почему сразу не додумался Smile Этот вариант самый простой и красивый, вместо того чтобы разность по контекстам
#14 23.09.2011 08:13

Ну а чем мой вариант то плох?
_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard
#15 24.09.2011 10:18

aven wrote:
Ну а чем мой вариант то плох?

То же можно, но больше кода будет в диалплане.
#16 24.09.2011 13:01

Если не знать синтаксиса диалплано, то да.

Code:
exten => 200/_1XX,1,DIal(SIP/200)

_________________
Intel Core 2 Duo E6400 @ 2.40GHz / 6GB / 160GB
Gentoo Linux || Asterisk 1.8.5 | SFA | FFA | Datacard