Asterisk AMI - перехват вызова

Я хочу перехватить звонок в Asterisk с помощью AMI. Я могу позвонить, но совершенно не знаю, как ответить на звонок... Скрипт для звонка:

#login
sock = socket.socket(af, socktype, proto)
sock.connect(sockaddr)
sock.send('Action: login\r\n')
sock.send('Events: off\r\n')
sock.send('Username: '+str(ast_server.login)+'\r\n')
sock.send('Secret: '+str(ast_server.password)+'\r\n\r\n')

#originate call
sock.send('Action: originate\r\n')
sock.send('Channel: ' + str(user.asterisk_chan_type) + '/' + str(user.internal_number)+'\r\n')
sock.send('Timeout: '+str(ast_server.wait_time*1000)+'\r\n')
sock.send('CallerId: '+str(user.callerid)+'\r\n')
sock.send('Exten: '+str(ast_number)+'\r\n')
sock.send('Context: '+str(ast_server.context)+'\r\n')
if ast_server.alert_info and user.asterisk_chan_type == 'SIP':
    sock.send('Variable: SIPAddHeader=Alert-Info: '+str(ast_server.alert_info)+'\r\n')
sock.send('Priority: '+str(ast_server.extension_priority)+'\r\n\r\n')

#logout
sock.send('Action: Logoff\r\n\r\n')
time.sleep(1)
sock.close()

Мне нужно нечто подобное, но для ответа на звонки. Не удается найти полезную команду в команде *CLI> manager show

Помоги мне, плокс


person voy    schedule 31.05.2012    source источник


Ответы (1)


Вы не можете ответить на звонок напрямую через AMI. Это связано с тем, что новый вызов «поступит» в заданный контекст/приоритет/добавочный номер, настроенный в диалплане (или будет отклонен, если не удастся найти подходящий). Таким образом, что бы ни случилось с этим вызовом, оно начнется с заданного контекста/приоритета/расширения в диалплане.

Если вы хотите обрабатывать вызовы через AMI, попробуйте использовать асинхронный AGI, например:

exten => _X.,1,AGI(agi:async)

Это будет обрабатывать все вызовы на любой добавочный номер, который имеет хотя бы 1 цифру, путем создания события (AsyncAGI), которое вы можете обработать с помощью своего клиента AMI.

Затем из вашего клиента AMI вы можете отправить AGIAction, например:

Action: AGI
Channel: SIP/adevice
Command: ANSWER
CommandID: MyCommandID

Это эффективно позволит вам запускать команды AGI (и обрабатывать вызовы, как вы обычно делаете в любом сценарии AGI) из вашего клиента AMI.

Надеюсь, поможет!

person marcelog    schedule 31.05.2012
comment
Я уверен, что вы правы, но я не знаю, куда поставить exten =› _X.,1,AGI(agi:async). Я программист на Python, а не гуру Asterisk :‹ - person voy; 04.06.2012
comment
Привет! Диалплан находится в вашем файле extensions.conf, см.: wiki.asterisk.org/ wiki/display/AST/Dialplan+Fundamentals и voip-info.org/wiki/view/Asterisk+config+extensions.conf. Возможно, вы захотите создать специальный контекст для своих тестов, и после того, как вы его изменили, не забудьте выполнить перезагрузку диалплана в cli или перезапустить asterisk, чтобы изменения вступили в силу. - person marcelog; 04.06.2012
comment
Я знаю, где находятся диалпланы. Например, я использую внутренний диалплан. Куда вставить exten =› (бла)? Может, это не имеет значения? Спасибо за потраченное на меня время :) - person voy; 04.06.2012
comment
Вот что я хочу сделать: схема - person voy; 04.06.2012
comment
Ваш файл extensions.conf разделен на разделы, называемые контекстами. В этом случае вы говорите (или я предполагаю:)) вы используете контекст from-internal. Поэтому поместите эти строки в этот контекст (то есть где-нибудь между [from-internal] и следующим [section]). Если это производственная коробка, я предлагаю вам не модифицировать ее, а попробовать на коробке разработки, чтобы ничего не сломать. Строки, которые я написал в ответе, будут применяться к входящим вызовам на добавочный номер, содержащий как минимум 1 цифру, поэтому вы можете изменить его, чтобы он применялся к определенному неиспользуемому добавочному номеру, например 555. - person marcelog; 04.06.2012
comment
Кстати, имейте в виду, что контекст может измениться в зависимости от того, откуда поступает вызов, поэтому рекомендуется, чтобы вы освоились с настройкой asterisk или, по крайней мере, имели рядом кого-то, кто мог бы решить эти вопросы для вас. Здесь мы как бы отклоняемся от исходного вопроса, и все это трудно объяснить в комментарии :) - person marcelog; 04.06.2012
comment
Иди нахуй, Звездочка. Лучше я попробую решить мою проблему с библиотекой sip python. Что я сделал: CLICK - person voy; 04.06.2012
comment
Вы отправляете действие AGI с командой ОТВЕТ (как указано в ответе) для этого канала? Это необходимо при использовании async agi, чтобы что-нибудь произошло. Async agi работает, я реализовал его в PAMI (php) без проблем. Другим вариантом было бы просто использовать обычный AGI вместо асинхронного AGI. Удачи! - person marcelog; 04.06.2012
comment
Команда AGI точно такая же, как в вашем ответе. Еще раз спасибо :) - person voy; 04.06.2012
comment
Конечно! Рад помочь :). Если ответ был полезен, не забудьте отметить его как ответ, нажав на правильный знак слева от ответа. Ваше здоровье! - person marcelog; 04.06.2012