Алексей Бузмаков: почти рабочий вариант в ложкой дёгтя.
[from_sip] ; основной контекст
exten => _7922ХХХХХХХ,1, NoOP(INCOMMING CALL to MULTIFON 7922ХХХХХХХ)
same => n, Macro(originate_background,${CALLERID(num)})
same => n, Macro(originate_context,${CALLERID(num)})
same => n, Set(CONFBRIDGE(default_user,marked)=yes)
same => n, ConfBridge(${CALLERID(num)})
same => n, Hangup()
[macro-originate_background]
exten => s,1, NoOP(macro-originate_call is started)
same => n, Set(CONFBRIDGE(default_user,marked)=no)
same => n, Originate(Local/999999999999@_background,app,ConfBridge,${ARG1})
[macro-originate_context]
exten => s,1, NoOP(macro-originate_call is started)
same => n, Set(CONFBRIDGE(default_user,marked)=yes)
same => n, Originate(Local/777777777777@_context,app,ConfBridge,${ARG1})
[_background]
exten => 999999999999,1, NoOP(Background music context)
same => n, Answer()
same => n, Background(//home/my_sounds/_music_low)
same => n, Wait(3)
same => n, Goto(background_sound,999999999999,3)
same => n, Hangup()
[_context]
exten => 777777777777,1, NoOP(Playback with Logic based MySQL context)
same => n, Answer()
same => n, Playback(hello-world)
same => n, Playback(demo-thanks)
;same => n, Goto(_context,777777777777,3)
same => n, HangUp()
Итог: фоновая музыка есть, нужные сообщения из спец. контекста говорилки(_context) проигрываются...
Ложка дёгтя - не закрывается конференция по выходу инициатора и говорилки, хотя вроде как я их маркирую и в confbridge.conf параметр end_marked=yes проставлен...
background_sound продолжает выполняться (background, wait и goto видны в консоли)
уххх, Дмитрий... Взорвали вы мне мозг... Но как и всегда в opensource - сколько людей, столько и вариантов! Чем я и люблю asterisk и сильно не люблю традиционные TDM...
пока сделал так:
[f_sip] ; основной контекст
exten => _ОСНОВНОЙ ВХОДЯЩИЙ НОМЕР,1, NoOP(INCOMMING CALL to ${EXTEN})
same => n, Macro(originate_call,${CALLERID(num)})
same => n, ConfBridge(${CALLERID(num)})
same => n, Hangup()
[macro-originate_call]
exten => s,1, NoOP(macro-originate_call is started)
same => n, Originate(Local/999999999999@background_sound,app,ConfBridge,${ARG1})
[background_sound]
exten => 999999999999,1, NoOP(Background music context)
same => n, Answer()
same => n, Background(//home/my_sounds/_music_low)
same => n, Wait(3)
same => n, Goto(background_sound,999999999999,3)
Промежуточный итог - звонящий попадает в конференцию с ID, равным своему CALLERID(num) и слышит background.
Осталось:
1. прицепить к этому "счастью" еще и автоинформатор с логикой (отдельный контекст с запросами в БД Mysql...) - наверное через ChanSpy (Local/105@_context,wx) - режим суфлера;
2. убивать конференцию когда инициатор (callerid(num)) по какой-то причине отваливается;
3. убивать конференцию когда заканчивается сценарий в контексте с логикой (который _context).
Спасибо за развернутный ответ. В ближайшее время нужно будет прикручивать к астериску аналоговый ТЧ-канал (4-проводка - прием\передача "+3/-14")... Нужно УКВ-каналы прицепить...
Вот например сейчас я прыгаю около реализации фишки "Кто звонил?" (habrahabr.ru/post/213669/). С той разницей, что в этой статье только SIP-абоненты... А у меня как раз в наличии стык с традиционной АТС и зоопарк из двух категорий абонентов - SIP и DAHDI... Шикарно, я вам скажу, в первом приближении усложняется вопрос... В CDR гора вариаций dstchannel - зафильтруешься досыта...
И как всегда и везде есть два варианта:
1. искалечить исходники и получать в CDR всегда то, что хочется и упростить форматы запросов в базу... Этот подход плох тем, что на всех астерисках придется калечить исходники подобным образом... Не по-человечески как-то...
2. взорвать себе мозг один раз и сделать надстройку, которая тиражируется на любой готовый астериск...
побольше детализации в консоли сделайте и увидите статусы канала. А вообще не помню почему, но у меня в таком раскладе тоже не заработало. Хотя заработало вот так:
[macro-m-other-channels]
exten => s,1,NoOp("Звонок на ${operator_${ARG1}} от ${CallerID_Channel${ARG1}}")
exten => s,n,Set(CALLERID(number)=12345) ; Подставляем CallerID Коммутатора
exten => s,n,Dial(${Tch-Channel-1},,mtD(9w8${ARG1:1:10})) ; Звоним через шлюз в Управлении (через 9ку)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?L_end_of_call) ; обрабатываем состояние звонка
exten => s,n,GotoIf($["${DIALSTATUS}" = "CANCEL"]?L_end_of_call)
exten => s,n,GotoIf($["${DIALSTATUS}" = "CONGESTION"]?L_end_of_call)
exten => s,n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?L_end_of_call)
exten => s,n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?L_end_of_call)
exten => s,n,Set(CALLERID(number)=${MEG-Channel-3:5:15}) ; CallerID через мультифон
exten => s,n,Dial(${MEG-Channel-3}/7${ARG1:1:10},,mt)
exten => s,n(L_end_of_call),Goto(С_end_of_call,h,1) ; Уходим в контекст окончания звонка
exten => s,n(L_answer),System(echo "${ARG2}} -> ${operator_${ARG1}} - ${DialedNumber_${ARG1}} - ${ANSWEREDTIME} сек.">> /var/log/asterisk/mobile_calls)
exten => s,n,Hangup()
На качество кода не претендую - работает и ладно. Других задач хватает.
lakegull: sipgsmgateway имеет рюшечный интерфейс м настраивается в пять кликов мышкой - в сторон астериска у вас будут настроены SIP-аккаунты, а на самом астере вы их пропишете в SIP.conf и маршрутизацию звонков в extensions.conf. Ну или в GUI, если вы им пользуетесь... Ничего сложного. Единственное, что мне пришлось допилить на стороне sipgsmgateway - поднять уровни громкости в каналах.
да. берите системник с виндой, ставьте прогу SIPgsmgateway, втыкайте gsm-модемы (в просторечии свистки), настраивайте и пользуйтесь. По конкретным вопросам welcome!
Один важный момент - Asterisk в чистом виде сам нормально работает только с хуавэй-евскими свистками, да и то не со всеми - старые чипсеты, а на многих модемах актуальна проблема односторонней слышимости... А Oktell-овская софтина в этом плане на коне - жуёт многие хуавэй-ки и что особенно радует ZTE(!), которые как показывает практика найти намного лечге. Ну и бесплатно еще до 10-ти каналов в одном системнике. Ресурсов практически не жрёт - можете его под что-то использовать легко.
По конкретным вопросам welcome!
Субъективное мнение. Если хотите развития - сразу копайте в сторону чистой оси и астериска из исходников - не тратьте время и не засирайте мозг первое время всякими GUI-ми. Уверен понимания будет больше.
Если же нужна какая-то простая разовая задачка типа организации халявной связи в отпуске, то копипаст статей про Freepbx - ваше всё.
P.S. Пишу из личного опыта. Начинал знакомиться с астериском с FreePbxDistro... Наелся чудес работы custom-файлов(нестандартный функционал написанный своими руками), плюнул и ушел на голый астериск из исходников. За три года ни разу об этом не пожалел... Текстовые конфиги и консоль астера - траблешутинг как на ладони...
[from_sip] ; основной контекст
exten => _7922ХХХХХХХ,1, NoOP(INCOMMING CALL to MULTIFON 7922ХХХХХХХ)
same => n, Macro(originate_background,${CALLERID(num)})
same => n, Macro(originate_context,${CALLERID(num)})
same => n, Set(CONFBRIDGE(default_user,marked)=yes)
same => n, ConfBridge(${CALLERID(num)})
same => n, Hangup()
[macro-originate_background]
exten => s,1, NoOP(macro-originate_call is started)
same => n, Set(CONFBRIDGE(default_user,marked)=no)
same => n, Originate(Local/999999999999@_background,app,ConfBridge,${ARG1})
[macro-originate_context]
exten => s,1, NoOP(macro-originate_call is started)
same => n, Set(CONFBRIDGE(default_user,marked)=yes)
same => n, Originate(Local/777777777777@_context,app,ConfBridge,${ARG1})
[_background]
exten => 999999999999,1, NoOP(Background music context)
same => n, Answer()
same => n, Background(//home/my_sounds/_music_low)
same => n, Wait(3)
same => n, Goto(background_sound,999999999999,3)
same => n, Hangup()
[_context]
exten => 777777777777,1, NoOP(Playback with Logic based MySQL context)
same => n, Answer()
same => n, Playback(hello-world)
same => n, Playback(demo-thanks)
;same => n, Goto(_context,777777777777,3)
same => n, HangUp()
Итог: фоновая музыка есть, нужные сообщения из спец. контекста говорилки(_context) проигрываются...
Ложка дёгтя - не закрывается конференция по выходу инициатора и говорилки, хотя вроде как я их маркирую и в confbridge.conf параметр end_marked=yes проставлен...
background_sound продолжает выполняться (background, wait и goto видны в консоли)