Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Всякие «Деды» на форумах скорее обольют тебя помоями и отправят читать книжки десятилетней давности
Проблема в том, что выполняя кучу originate подряд через ami, система ждет, пока завершится предыдущий, чтобы дать следующий. А если никто не берет трубку, а там 20 секунд no_ans и таких 5 штук? Можно будет до вечера ждать сбора.
2. Можно, но почему то тогда по *1 срабатывает не dialplan_exec, а DYNAMIC_FEATURES.
Могу только сказать, что я делал 3-way call на чистом диалпане и оно работало.Блин, вот в этом подвох.
System(/usr/bin/php /home/script/conference.php 2 ${CALLERID(num)} ${INVITEN})
exten => 1111,1,Answer
same => n,Playback(beep)
same => n,Set(CALLERID(num)=ops)
same => n,NOOP(CALLERID NUM = ${CALLERID(num)})
same => n,Hangup
pro-sip*CLI> core set verbose 3
— Executing [1111@test:1] Answer(«IAX2/iaxtest-7530», "") in new stack
— Executing [1111@test:2] Playback(«IAX2/iaxtest-7530», «beep») in new stack
— <IAX2/iaxtest-7530> Playing 'beep.gsm' (language 'en')
— Executing [1111@test:3] Set(«IAX2/iaxtest-7530», «CALLERID(num)=ops») in new stack
— Executing [1111@test:4] NoOp(«IAX2/iaxtest-7530», «CALLERID NUM = ops») in new stack
— Executing [1111@test:5] Hangup(«IAX2/iaxtest-7530», "") in new stack
Проблема в том, что выполняя кучу originate подряд через ami, система ждет, пока завершится предыдущий, чтобы дать следующий
;func_odbc.conf
; тут можно было получить всю строчку целиком за счет sql, но мы же повторяем логику в php скрипте, потому просто получаем список куда звонить
[GET_GROUPS]
dsn=asterisk
SELECT group_concat(extension) FROM asteriskconf_groups where groupid = '${SQL_ESC(${ARG1})}'
; group_concat возвращает одно значение состоящее из екстеншенов через запятую, принадлежит стандарту slq92 или гдето там.
;extensions.conf
[call_all_group]
exten => _X.,1,Set(list=${ODBC_GET_GROUPS(${EXTEN})}); берем список, ид=текущий екстеншен.
same => n,Execif($[ "${list}" == "" ]?Hangup); ничего нет.
same => n,Set(res=)
same => n,Set(i=1); ставим счетчик в 0. Стандартный for цикл в испольнении астериска.
same => n(loop),GotoIF($[ "${CUT(list,\,,${i}}" == "" ]?endfor); если нет больше ничего, выходим
same => n,Set(res=${res}Local/${CUT(list,\,,${i}}@originate_conf/n&); добавляем строчку звонка. Тут немного магии, да.
smae => n,Set(i=$[ ${i} + 1 ]); увеличение параметра цикла. стандартно.
same => n,Goto(loop)
same => n(endloop),Dial(${res}); запускаем цикл из N дозвонов, параллельно.
[originate_conf]
exten => _X.,1,Originate(SIP/${EXTEN},app,Confbridge,1000); звоним каждому, посылаем в конференцию.
Dial(Local/1000@originate_conf/n&Local/1001@originate_conf)
Конференц-комнаты на базе Asterisk