Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
а может быть и совсем другим способом
Откуда: Москва
Сообщений: 3421
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Наверное, мы придумываем велосипед на костылях вместо колес :-)
Да породить сразу AGI, и в нем все сделать. При использовании System, шела, awk, grep и тд - это сколько fork'ов то будет!?
|
Сообщений: 1573
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Во-во .... :)
|
Сообщений: 4
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Я все же реализовал эту задачу следующим образом.
Концовка meetme.conf
[rooms]
conf => 1234
manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[sysadmin]
secret = sysadmin
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.255
read = all,system,call,log,verbose,command,agent,user,config
write = all,system,call,log,verbose,command,agent,user,config
Добавления в extensions.conf
; Вызов редиректа разговора оператора в MeetMe-конференцию
exten => _*9X.,1,Gosub(start-redirect,${EXTEN:2},1)
[start-redirect]
exten => _X.,1,Verbose(Trying to redirect talking ${EXTEN})
exten => _X.,n,System(/var/lib/asterisk/scripts/invade.sh ${EXTEN})
exten => _X.,n,Gosub(addto-meetme,${EXTEN},1)
[addto-meetme]
exten => s,1,Verbose(Trying to add ${EXTEN} to MeetMe conference)
exten => s,n,MeetMe(1234,qodx)
exten => _X.,1,Verbose(Trying to add ${EXTEN} to MeetMe conference)
exten => _X.,n,MeetMe(1234,qodx)
Вот листинг скрипта invade.sh
#Получаем от Asterisk список активных каналов и помещаем его в файл activechannels.tmp
asterisk -rx 'core show channels' > /var/lib/asterisk/scripts/activechannels.tmp
#При помощи скрипта getchannels.awk выделяем активные каналы, которые соответствуют экстеншену $1
#Далее из скрипта getchannels.awk запускается скрипт redirect.sh, который при помощи Asterisk AMI производит редирект в MeetMe-конференцию
awk -f /var/lib/asterisk/scripts/getchannels.awk EXTEN=$1 /var/lib/asterisk/scripts/activechannels.tmp
Вот листинг awk-скрипта getchannels.awk
{
SEARCH = "SIP/"EXTEN
# Ищем строку с надписью "Bridged Call", которая отображает состояние канала разговора и в ней ищем SIP/EXTEN
if ($0 ~ /Bridged Call/ && ($1 ~ SEARCH || $5 ~ SEARCH) )
{
if ($1 ~ SEARCH)
{
channel1 = $1
channel2 = $5
}
else
{
channel1 = $5
channel2 = $1
}
# Обрезаем ненужное слово Call и скобки по краям
if (channel1 ~ /^Call/)
{
sub(/Call\(/,"",channel1)
sub(/\)/,"",channel1)
}
if (channel2 ~ /^Call/)
{
sub(/Call\(/,"",channel2)
sub(/\)/,"",channel2)
}
}
}
END {
# Запускаем скрипт redirect.sh передавая в качестве параметров названия двух каналов и extension.
# Вывод скрипта осуществляется в telnet
system("expect /var/lib/asterisk/scripts/redirect.exp "channel1" "channel2" "EXTEN)
}
Ну и последний листинг скрипта redirect.exp
# Usage: ./redirect.exp channel1 channel2
# The user account from manager.conf:
set username "sysadmin"
set secret "sysadmin"
set host "127.0.0.1"
set port "5038"
if {[llength $argv] != 3} {
send_user "Error: You must specify two channels and extension to redirect!\n"
exit 1
}
set channel1 [lindex $argv 0]
set channel2 [lindex $argv 1]
set EXTEN [lindex $argv 2]
# Mute output to stdout:
log_user 0
# Open connection to AMI:
spawn telnet $host $port
# Just in case telnet aborts because it cannot connect:
expect_before eof {
send_user "Failed to connect.\n"
exit 1
}
# Wait for the text "Manager"; once received, send a login packet:
expect "Manager" {
send_user "Connected.\n"
send "Action: Login\nUsername: $username\nSecret: $secret\n\n"
}
# Login successful?:
expect {
-re "Response:\\s*Error" {
send_user "Login failed.\n"
exit 1
}
-re "Response:\\s*Success" {
send_user "Logged in.\n"
send "Action: Redirect\nChannel: $channel1\nExtraChannel: $channel2\nExtension: *99\nContext: addto-meetme\nPriority: 1\n\n"
}
}
send "Action: Logoff\n\n"
В результате звонок на *9<номер_телефона> приводит к вклиниванию в разговора с этого номера.
Цитирование покоцало пробелы в листингах, но что ж тут поделаешь? ))))))))
Думаю, что можно реализовать идею красивее, но времени было как всегда в обрез.
|
Сообщений: 1573
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Еще раз, повторюсь - чем это, и другое подобное, решение отличается от написания AGI-скрипта?
Кроме доп.нагрзки на систему и усложнения задачи - я ничего не вижу ...
Digium для таких задач предлагает - AGI ... :))
|
Сообщений: 4
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Как AGI может кардинально облегчить данную задачу? Все равно необходимо будет производить вызов скрипта, а команды, предоставляемые непосредственно AGI, не так уж многочисленны.
|
Откуда: Москва
Сообщений: 3421
|
Re: Asterisk+n-way+call+HOWTO где инициатором выступает третий участник
Команд AGI предостаточно, особенно EXEC :-)
AGI более эффективен с точки зрения нагрузки на систему. Это раз.
На любимом языке программирования писать приятнее и более понятнее, чем ваять на шеле. Это два :-)
|
|