VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Переадресация на мобильный с GXP-1620

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

Добрый день уважаемые форумчане!

Ранее, когда тестировал и настраивал на задарме, переадресация работала. Но с тех пор много воды утекло, мб я что наворотил...
Ситуация такая, есть на телефоне переадресация, которую можно ввести с телефона кнопкой переадресация. Интересно тем, что я прописываю не жестко в диалплане, а пользователь может сам включить переадресацию на свой номер, без меня. И отключить соответсвенно, когда пришел на рабочее место.
Телефон GXP-1620. В телефоне не нашел настроек переадресации.

У меня есть подозрения, что проблема на стороне провайдера, судя по логам (Got SIP response 503 "Service Unavailable" back from xxx.xxx.xxx.xxx:5060), но я не уверен, в первую очередь проблему надо искать в себе, решил на всякий случай сначала спросить у Вас, а уже потом намекать провайдеру, что у него что то не так.

Я правильно понял логи?
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Лог звонка
== Using SIP RTP CoS mark 5
> 0x7f220405c910 -- Strict RTP learning after remote address set to: 10.0.10.20:5004
-- Executing [301@outcoling:1] Macro("SIP/100-00000844", "recording,100,301") in new stack
-- Executing [s@macro-recording:1] GotoIf("SIP/100-00000844", "1?mp3") in new stack
-- Goto (macro-recording,s,3)
-- Executing [s@macro-recording:3] Set("SIP/100-00000844", "fname=1566196724.3354-2019-08-19-09_38-100-301") in new stack
-- Executing [s@macro-recording:4] Set("SIP/100-00000844", "monopt=nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3" && rm -f "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" && chmod o+r "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3"") in new stack
-- Executing [s@macro-recording:5] Set("SIP/100-00000844", "CDR(filename)=1566196724.3354-2019-08-19-09_38-100-301.mp3") in new stack
-- Executing [s@macro-recording:6] Set("SIP/100-00000844", "CDR(realdst)=301") in new stack
-- Executing [s@macro-recording:7] Set("SIP/100-00000844", "CDR(remoteip)=10.0.10.20") in new stack
-- Executing [s@macro-recording:8] MixMonitor("SIP/100-00000844", "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav,b,nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3" && rm -f "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" && chmod o+r "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3"") in new stack
== Begin MixMonitor Recording SIP/100-00000844
-- Executing [s@macro-recording:9] Goto("SIP/100-00000844", "no") in new stack
-- Goto (macro-recording,s,16)
-- Executing [s@macro-recording:16] Verbose("SIP/100-00000844", "Exit record") in new stack
Exit record
-- Executing [301@outcoling:2] Dial("SIP/100-00000844", "SIP/301,,t&m") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/301
-- Started music on hold, class 'default', on channel 'SIP/100-00000844'
[Aug 19 09:38:44] WARNING[28808][C-0000041f]: translate.c:407 framein: no samples for alawtolin
-- Got SIP response 302 "Moved Temporarily" back from 10.0.10.53:5060
-- Now forwarding SIP/100-00000844 to 'Local/8915xxxxxxx@outcoling' (thanks to SIP/301-00000845)
[Aug 19 09:38:44] NOTICE[28808][C-0000041f]: app_dial.c:1000 do_forward: Not accepting call completion offers from call-forward recipient Local/8915xxxxxxx@outcoling-00000018;1
-- Executing [8915xxxxxxx@outcoling:1] Macro("Local/8915xxxxxxx@outcoling-00000018;2", "recording,100,8915xxxxxxx") in new stack
-- Executing [s@macro-recording:1] GotoIf("Local/8915xxxxxxx@outcoling-00000018;2", "1?mp3") in new stack
-- Goto (macro-recording,s,3)
-- Executing [s@macro-recording:3] Set("Local/8915xxxxxxx@outcoling-00000018;2", "fname=1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx") in new stack
-- Executing [s@macro-recording:4] Set("Local/8915xxxxxxx@outcoling-00000018;2", "monopt=nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3" && rm -f "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" && chmod o+r "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3"") in new stack
-- Executing [s@macro-recording:5] Set("Local/8915xxxxxxx@outcoling-00000018;2", "CDR(filename)=1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3") in new stack
-- Executing [s@macro-recording:6] Set("Local/8915xxxxxxx@outcoling-00000018;2", "CDR(realdst)=8915xxxxxxx") in new stack
[Aug 19 09:38:44] WARNING[28810][C-0000041f]: func_channel.c:465 func_channel_read: Unknown or unavailable item requested: 'recvip'
-- Executing [s@macro-recording:7] Set("Local/8915xxxxxxx@outcoling-00000018;2", "CDR(remoteip)=") in new stack
-- Executing [s@macro-recording:8] MixMonitor("Local/8915xxxxxxx@outcoling-00000018;2", "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav,b,nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3" && rm -f "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" && chmod o+r "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3"") in new stack
-- Executing [s@macro-recording:9] Goto("Local/8915xxxxxxx@outcoling-00000018;2", "no") in new stack
-- Goto (macro-recording,s,16)
-- Executing [s@macro-recording:16] Verbose("Local/8915xxxxxxx@outcoling-00000018;2", "Exit record") in new stack
Exit record
-- Executing [8915xxxxxxx@outcoling:2] Dial("Local/8915xxxxxxx@outcoling-00000018;2", "SIP/ntel/8915xxxxxxx") in new stack
== Begin MixMonitor Recording Local/8915xxxxxxx@outcoling-00000018;2
== Using SIP RTP CoS mark 5
-- Called SIP/ntel/8915xxxxxxx
> 0x7f220405c910 -- Strict RTP switching to RTP target address 10.0.10.20:5004 as source
> 0x7f220405c910 -- Strict RTP learning complete - Locking on source address 10.0.10.20:5004
> 0x7f2208023bc0 -- Strict RTP learning after remote address set to: xxx.xxx.xxx.xxx:11650
-- SIP/ntel-00000846 is making progress passing it to Local/8915xxxxxxx@outcoling-00000018;2
-- Local/8915xxxxxxx@outcoling-00000018;1 is making progress passing it to SIP/100-00000844
-- Got SIP response 503 "Service Unavailable" back from xxx.xxx.xxx.xxx:5060
-- SIP/ntel-00000846 is circuit-busy

== Everyone is busy/congested at this time (1:0/1/0)
-- Executing [8915xxxxxxx@outcoling:3] Hangup("Local/8915xxxxxxx@outcoling-00000018;2", "") in new stack
== Spawn extension (outcoling, 8915xxxxxxx, 3) exited non-zero on 'Local/8915xxxxxxx@outcoling-00000018;2'
== MixMonitor close filestream (mixed)
== Executing [nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3" && rm -f "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.wav" && chmod o+r "/records/callrecords/1566196724.3357-2019-08-19-09_38-100-8915xxxxxxx.mp3"]
== Everyone is busy/congested at this time (1:0/1/0)
-- Stopped music on hold on SIP/100-00000844
-- Executing [301@outcoling:3] Hangup("SIP/100-00000844", "") in new stack
== Spawn extension (outcoling, 301, 3) exited non-zero on 'SIP/100-00000844'
== MixMonitor close filestream (mixed)
== Executing [nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3" && rm -f "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.wav" && chmod o+r "/records/callrecords/1566196724.3354-2019-08-19-09_38-100-301.mp3"]
== End MixMonitor Recording SIP/100-00000844
== End MixMonitor Recording Local/8915xxxxxxx@outcoling-00000018;2
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Переадресация на мобильный с GXP-1620

Сообщение ded »

Когда прямой вызов с SIP/301 идёт на мобильный SIP/ntel/8915xxxxxxx (можно вместо хххх ставить 12345, чтобы не замутнять понимание? Ибо хххх в синтаксисе диал-плана - это шаблоны), то где-то в вашем контексте outcoling видимо указывается подставление правильного разрешённого ntel CALLERID(num) и вызов на мобильный проходит.

А когда перенаправленный -
-- Executing [8915xxxxxxx@outcoling:2] Dial("Local/8915xxxxxxx@outcoling-00000018;2", "SIP/ntel/8915xxxxxxx")
то правильного разрешённого ntel CALLERID(num) нету, поэтому ntel посылает вас на три цифры
503 "Service Unavailable" back from xxx.xxx.xxx.xxx:5060

P.S. Перенаправление по занятости, недоступности - включается в FreePBX например штатно сервисными кодами *52 и *90
Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Re: Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

ded писал(а):Когда прямой вызов с SIP/301 идёт на мобильный SIP/ntel/8915xxxxxxx (можно вместо хххх ставить 12345, чтобы не замутнять понимание? Ибо хххх в синтаксисе диал-плана - это шаблоны), то где-то в вашем контексте outcoling видимо указывается подставление правильного разрешённого ntel CALLERID(num) и вызов на мобильный проходит.

А когда перенаправленный -
-- Executing [8915xxxxxxx@outcoling:2] Dial("Local/8915xxxxxxx@outcoling-00000018;2", "SIP/ntel/8915xxxxxxx")
то правильного разрешённого ntel CALLERID(num) нету, поэтому ntel посылает вас на три цифры
503 "Service Unavailable" back from xxx.xxx.xxx.xxx:5060

P.S. Перенаправление по занятости, недоступности - включается в FreePBX например штатно сервисными кодами *52 и *90
Насчет 12345 учту, мой косяк. но это же не диалплан в принципе...учту, спасибо.

У меня чистый Asterisk, в фришке c folowme подобного не встречал.

но ведь написано, что делается вызов правильный:
-- Executing [8915xxxxxxx@outcoling:2] Dial("Local/8915xxxxxxx@outcoling-00000018;2", "SIP/ntel/8915xxxxxxx") in new stack
== Begin MixMonitor Recording Local/8915xxxxxxx@outcoling-00000018;2
== Using SIP RTP CoS mark 5
-- Called SIP/ntel/8915xxxxxxx
> 0x7f220405c910 -- Strict RTP switching to RTP target address 10.0.10.20:5004 as source
> 0x7f220405c910 -- Strict RTP learning complete - Locking on source address 10.0.10.20:5004
> 0x7f2208023bc0 -- Strict RTP learning after remote address set to: xxx.xxx.xxx.xxx:11650
-- SIP/ntel-00000846 is making progress passing it to Local/8915xxxxxxx@outcoling-00000018;2
-- Local/8915xxxxxxx@outcoling-00000018;1 is making progress passing it to SIP/100-00000844
-- Got SIP response 503 "Service Unavailable" back from xxx.xxx.xxx.xxx:5060

Я так понял что Local, это внутреннее общение внутри asterisk, а внешний вызов делает как раз правильно ( -- Called SIP/ntel/8915xxxxxxx). И с другой стороны... на другом провайдере работало.
Я так понимаю вместо Local/8915xxxxxxx должно передаваться SIP/ntel/8915xxxxxxx? А как это побороть со своей стороны?
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: на всякий случай extensions.conf
[general]
static=yes
writeprotect=yes

[globals]

;Если 0, запись разговоров отключена
;Если 1, запись разговоров включена с одновременной конвертацией в MP3
;Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
;Путь к папке с записями разговоров
DIR_RECORDS=/records/callrecords/;

[default]

; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);

[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;_X., означает, что для ЛЮБЫХ исходящих номеров начинает определятся название файла
exten => _xxx,2,Dial(SIP/${EXTEN},,t&m)
exten => _100,2,Dial(SIP/100,,t&m,/var/lib/asterisk/moh/ivr/JingleBells)
exten => _X.,2,Dial(SIP/ntel/${EXTEN})
exten => _X.,3,Hangup()
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.

[incoming]
exten => _x.,1,Set(CALLERID(num)=8${CALLERID(num)}) ;добавляем 8 к входящему, что бы корректно перезванивать
exten => _x.,2,Macro(recording,${CALLERID(num)},${EXTEN}) ;запуск макроса на запись
exten =>_x.,3,Goto(menu,s,1) ;перевод на меню menu ivrsaga
exten => _X.,4,Hangup()

[menu]
exten => s,1,Background(/var/lib/asterisk/moh/ivr/ivrsaga) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => s,n,WaitExten(5) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,n,Dial(SIP/101,30,t&m) ; вызываем секретаря? ждем 120 сек
exten => s,n,Voicemail(101@default) ; если нет ответа секретаря 120 сек переводим на автоответчик 101@default

exten => 1,1,Queue(managers,t) ; 1 нажал, в отдел продаж попал
exten => 2,1,Queue(buh,t) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Queue(logistic,t) ; 3 нажал, в логистику попал
exten => 4,1,Dial(SIP/170,30,t&m) ; 4 нажал, к юристу попал
exten => 4,n,Voicemail(170@default) ;через 30 сек переадресация на автоответчик
exten => 5,1,Dial(SIP/100,30,t&m) ;5 нажал, в IT-отдел попал
exten => 5,n,Voicemail(100@default) ;через 30 сек переадресация на автоответчик
exten => 0,1,Dial(SIP/101,30,t&m) ; 0 нажал, на секретаря попал Queue(secretar,,,,120,t,m
exten => 0,n,Voicemail(101@default) ;через 30 сек переадресация на автоответчик

exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m) ; набор трехзначного внутреннего номера
exten => _XXX,n,Voicemail(${EXTEN}@default)
exten => _XXX,n,Set(dstNUM=${EXTEN}) ;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1) ;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1) ;Проверяем статус пира, подключен или нет
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s) ;Проверяем канал на занятость
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========) ;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,Goto(num-${DIALSTATUS},1) ;Обрабатываем остальные статусы
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid) ;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice) ;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone) ;Если номер занят, говорим "Занято"
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u) ;Если номер не отвечает, включаем голосовую почту
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail) ;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => t,1,Dial(SIP/101,120) ;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Re: Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

Спасибо за помощь Дед :)

позвонил провайдеру, они решили со своей стороны проблему, переадресация пошла. Им вызов приходил с внутренним callerid? Т.е. звонок с 301 и у них звонок стопался. Что то подкрутили, переадресация пошла.

Всем спасибо!
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Переадресация на мобильный с GXP-1620

Сообщение ded »

Поставили закрывающий CALLERID, принадлежащий вам, в нормальном формате, вот что подкрутили.
А следовало бы это делать вам.
Как минимум - поставить на пире ntel
callerid=8431234567
или какой у вас назначен.
Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Re: Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

ded писал(а):Поставили закрывающий CALLERID, принадлежащий вам, в нормальном формате, вот что подкрутили.
А следовало бы это делать вам.
Как минимум - поставить на пире ntel
callerid=8431234567
или какой у вас назначен.
Возможно сейчас полетят камни.

Провайдер сделал конечно все своими силами но...отказали международные, межгород, мобильные...позвонил им, говорю все плохо. Чинили до след дня. Сегодня обратил внимание, что переадресация снова не работает. Ответ от их сервера тот же...предпологаю что они просто откатили конфиг до момента "когда все было хорошо".

Соответственно возник вопрос, как мне самому поставить исходящий callerid? Вижу кучу примеров по модификации callerid, а как явно указать, какой callerid должен быть при условии, не могу найти. Лабораторные эксперименты тоже ничего не дают :(

Подозреваю что должна быть или строка exten => _x,n,Set,CALLERID(num)=74951234567 или exten => _X.,2,Dial(SIP/ntel/${EXTEN}@74951234567), но разные варианты не дали результата.

Прошу подсказку, как указать явный исходящий callerid.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: extensions.conf
[general]
static=yes
writeprotect=yes

[globals]

;Если 0, запись разговоров отключена
;Если 1, запись разговоров включена с одновременной конвертацией в MP3
;Если 2, запись разговоров включена и выполняется запись в формат WAV. Преобразование в MP3 формат должно быть выполнено скриптом "proc_records.sh"
RECORDING=1;
;Путь к папке с записями разговоров
DIR_RECORDS=/records/callrecords/;

[default]

; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?mp3)
exten => s,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => s,n(mp3),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n,Goto(no);
exten => s,n(wav),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(CDR(filename)=${fname}.wav);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,Set(CDR(remoteip)=${CHANNEL(recvip)});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b);
exten => s,n,Goto(no);
exten => s,n(no),Verbose(Exit record);

[outcoling]
exten => _X.,1,Macro(recording,${CALLERID(num)},${EXTEN}) ;_X., означает, что для ЛЮБЫХ исходящих номеров начинает определятся название файла
exten => _xxx,2,Dial(SIP/${EXTEN},,t&m)

exten => _x,n,Set,CALLERID(num)=7495775588

exten => _X.,2,Dial(SIP/ntel/${EXTEN})
exten => _X.,3,Hangup()
exten => 700,3,Goto(menu,s,1) ;если мы изнутри позвоним на этот номер, то мы сможем проверить работу нашего голосового меню.
;exten => 500,3,Log(NOTICE, Dialing out from ${CALLERID(all)} to VoiceMail (500))
;exten => 500,n,VoiceMailMain(0${CALLERID(num)}@default,s) ;без авторизации
;exten => 500,n, Hangup


[incoming]
exten=> s,1,Answer()
exten => _x.,1,Set(CALLERID(num)=8${CALLERID(num)}) ;добавляем 8 к входящему, что бы корректно перезванивать
exten => _x.,2,Macro(recording,${CALLERID(num)},${EXTEN}) ;запуск макроса на запись
exten =>_x.,3,Goto(menu,s,1) ;перевод на меню menu ivrsaga
exten => _X.,4,Hangup()

[menu]
exten => s,1,Background(/var/lib/asterisk/moh/ivr/ivrsaga) ;здесь ловится звонок из контекста incoming и проигрывается записанное нами приветствие.
exten => s,n,WaitExten(5) ;если человек не нажал ничего, ждем 5 секунд и
exten => s,n,Dial(SIP/101,30,t&m) ; вызываем секретаря? ждем 120 сек
exten => s,n,Voicemail(101@default) ; если нет ответа секретаря 120 сек переводим на автоответчик 101@default

exten => 1,1,Queue(managers,t) ; 1 нажал, в отдел продаж попал
exten => 2,1,Queue(buh,t) ; 2 нажал, в бухгалтерию попал
exten => 3,1,Queue(logistic,t) ; 3 нажал, в логистику попал
exten => 4,1,Dial(SIP/170,30,t&m) ; 4 нажал, к юристу попал
exten => 4,n,Voicemail(170@default) ;через 30 сек переадресация на автоответчик
exten => 5,1,Dial(SIP/100,30,t&m) ;5 нажал, в IT-отдел попал
exten => 5,n,Voicemail(100@default) ;через 30 сек переадресация на автоответчик
exten => 0,1,Dial(SIP/101,30,t&m) ; 0 нажал, на секретаря попал Queue(secretar,,,,120,t,m
exten => 0,n,Voicemail(101@default) ;через 30 сек переадресация на автоответчик

exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m) ; набор трехзначного внутреннего номера
exten => _XXX,n,Voicemail(${EXTEN}@default)
exten => _XXX,n,Set(dstNUM=${EXTEN}) ;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1) ;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1) ;Проверяем статус пира, подключен или нет
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s) ;Проверяем канал на занятость
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========) ;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1) ;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,Goto(num-${DIALSTATUS},1) ;Обрабатываем остальные статусы
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid) ;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice) ;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone) ;Если номер занят, говорим "Занято"
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u) ;Если номер не отвечает, включаем голосовую почту
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail) ;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => t,1,Dial(SIP/101,120) ;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: sip.conf
[general]
language=ru
context=default ;контекст по умолчанию, он будет пустой
allowguest=no ;запрет гостевых вызовов
allowoverlap=no ;автоматический донабор запрещен
alwaysauthreject=yes ;Безопасности ради на любой неверный запрос отвечаем одинаково
useragent=SagaOffice ;Так представл¤емс¤ на уровне SIP-протокола
defaultexpiry=120 ;заставляем клиентов подтверждать свою регистрацию раз в 2 минуты
limitonpeer=yes ;считаем исход¤щие и вход¤щие вызовы для ограничения количества одновременных вызовов для клиента/абонента.
tcpenable=yes ;разрешаем TCP протокол для SIP.
bindport=5060 ;порт SIP по умолчанию.
bindaddr=0.0.0.0 ;На каком адресе слушаем. В данном случае на всех.
srvlookup=yes ;Позволяет звонить по именам днс
sendrpid=yes ;ОТправлять или нет Remote-Party-ID header: (проброс caller id звонящего к конечному через меню и переадресацию)

;кодеки по умолчанию для всех

disallow=all ;сначала запрещаем все
allow=alaw ;потом разрешаем нужные
allow=ulaw

relaxdtmf=yes

dtmfmode=rfc2833 ;режим передачи DTMF (Dual-Tone Multi-Frequency) - "писк", соответствующий нажатой цифре
tpholdtimeout=300 ;завершаем вызов через 300 секунд, если нет активности по RTP протоколу в режиме удержания линии (hold)
rtpkeepalive=5 ;как часто сервер должен посылать сообщения проверки активности установленного соединения для поддержания NAT открытым

canreinvite=no ;все вызовы проходят через нашу станцию, запрещено пр¤мое соединение


register => login: password@sip.zadarma.com/login ;регистрация транка на задарма
register => login: password@xxx.xxx.xxx.xxx/login ;регистрация транка на ntel


[zadarma] ;
type=friend ;
username=login ;
secret= password ;
fromuser=login ;
fromdomain=sip.zadarma.com ;
host=sip.zadarma.com ;
nat=force_rport,comedia ;
insecure=invite ;
context=incoming ;
canreinvite=no ;
qualify=yes
;
[ntel]
type=friend ;
username=login ;
secret= password ;
fromuser=login ;
fromdomain=xx.xx.xx.xx ;
host=sip.xxx.ru ;
nat=force_rport,comedia ;
insecure=invite ;
context=incoming ;
canreinvite=no ;
qualify=yes


;задаем [шаблон](!) для номеров по дефолту, далее что бы подсосать из шаблона пишем [номер](имя шаблона)

[internal](!)
type=friend ;разрешаем двухстороннюю связь
directmedia=no ;направлять медиа поток (RTP трафик) через сервер или напрямую между каналами (пирами).
;insecure=invite,port ;port: игнорировать номер порта, с которого пришла аутентификация. invite: не требовать начальное сообщение INVITE для аутентификации
context=outcoling ;контекст по умолчанию для внутренних по умолчанию
fromdomain=<10.0.10.15> ;адрес сервера Астериск
host=dynamic ;адрес определ¤ется регистрацией
call-limit=2 ;одновременных звонков - 1. если больше - отдавать "занято", по умолчанию на ip-телефоне 2 линии.
qualify=yes ;проверять связь до клиента
disallow=all ;запрещаем все кодеки
allow=alaw ;разрешаем кодек alaw (g711a)
allow=ulaw ;разрешаем кодек ulaw
qualify=yes ;проверка качества соединения с клиентом
canreinvite=no
nat=no ;клиент может быть за NAT, если за NAT есть клиенты, включаем yes
dtmfmode=auto ;стандарт передачи тональных звуков dtmf режим (auto|inband|info|rfc2833)
deny=0.0.0.0/0.0.0.0 ;запрещено подключаться со всех сетей
permit=10.0.0.0/255.0.0.0 ;разрешено подключаться с разрешенных сетей
;subscribemwi = yes ;Отсылает оповещение о почте, если телефон подписан на них (???????)

;создаем внутренние номера по шаблону, дописываем только пароль


[100](internal) secret=
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Переадресация на мобильный с GXP-1620

Сообщение ded »

ded писал(а):Поставили закрывающий CALLERID, принадлежащий вам, в нормальном формате, вот что подкрутили.
А следовало бы это делать вам.
Как минимум - поставить на пире ntel
callerid=8431234567
или какой у вас назначен.

Код: Выделить всё

[ntel]
type=friend ;
username=login ;
secret= password ;
fromuser=login ;
fromdomain=xx.xx.xx.xx ;
host=sip.xxx.ru ;
nat=force_rport,comedia ; ??????????
insecure=invite ;
context=incoming ;
callerid=74951234567
canreinvite=no ;
qualify=no ; думаете надо пихать провайдера пакетами OPTIONS ?
Elektronik писал(а):но разные варианты не дали результата.
Вы действуете наобум, копипаста до добра не доведёт.
Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Re: Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: то же самое
Reloading SIP
== Parsing '/etc/asterisk/sip.conf': Found
== Parsing '/etc/asterisk/users.conf': Found
== Using SIP CoS mark 4
== Parsing '/etc/asterisk/sip_notify.conf': Found
== Using SIP RTP CoS mark 5
> 0x7f2204059720 -- Strict RTP learning after remote address set to: 10.0.10.20:5004
-- Executing [301@outcoling:1] Macro("SIP/100-000011f5", "recording,100,301") in new stack
-- Executing [s@macro-recording:1] GotoIf("SIP/100-000011f5", "1?mp3") in new stack
-- Goto (macro-recording,s,3)
-- Executing [s@macro-recording:3] Set("SIP/100-000011f5", "fname=1566553635.7552-2019-08-23-12_47-100-301") in new stack
-- Executing [s@macro-recording:4] Set("SIP/100-000011f5", "monopt=nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3" && rm -f "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" && chmod o+r "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3"") in new stack
-- Executing [s@macro-recording:5] Set("SIP/100-000011f5", "CDR(filename)=1566553635.7552-2019-08-23-12_47-100-301.mp3") in new stack
-- Executing [s@macro-recording:6] Set("SIP/100-000011f5", "CDR(realdst)=301") in new stack
-- Executing [s@macro-recording:7] Set("SIP/100-000011f5", "CDR(remoteip)=10.0.10.20") in new stack
-- Executing [s@macro-recording:8] MixMonitor("SIP/100-000011f5", "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav,b,nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3" && rm -f "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" && chmod o+r "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3"") in new stack
-- Executing [s@macro-recording:9] Goto("SIP/100-000011f5", "no") in new stack
== Begin MixMonitor Recording SIP/100-000011f5
-- Goto (macro-recording,s,16)
-- Executing [s@macro-recording:16] Verbose("SIP/100-000011f5", "Exit record") in new stack
Exit record
-- Executing [301@outcoling:2] Dial("SIP/100-000011f5", "SIP/301,,t&m") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/301
-- Started music on hold, class 'default', on channel 'SIP/100-000011f5'
[Aug 23 12:47:15] WARNING[2425][C-0000088d]: translate.c:407 framein: no samples for alawtolin
-- Got SIP response 302 "Moved Temporarily" back from 10.0.10.53:5060
-- Now forwarding SIP/100-000011f5 to 'Local/89151234567@outcoling' (thanks to SIP/301-000011f6)
[Aug 23 12:47:15] NOTICE[2425][C-0000088d]: app_dial.c:1000 do_forward: Not accepting call completion offers from call-forward recipient Local/89151234567@outcoling-0000005a;1
-- Executing [89151234567@outcoling:1] Macro("Local/89151234567@outcoling-0000005a;2", "recording,100,89151234567") in new stack
-- Executing [s@macro-recording:1] GotoIf("Local/89151234567@outcoling-0000005a;2", "1?mp3") in new stack
-- Goto (macro-recording,s,3)
-- Executing [s@macro-recording:3] Set("Local/89151234567@outcoling-0000005a;2", "fname=1566553635.7555-2019-08-23-12_47-100-89151234567") in new stack
-- Executing [s@macro-recording:4] Set("Local/89151234567@outcoling-0000005a;2", "monopt=nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3" && rm -f "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" && chmod o+r "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3"") in new stack
-- Executing [s@macro-recording:5] Set("Local/89151234567@outcoling-0000005a;2", "CDR(filename)=1566553635.7555-2019-08-23-12_47-100-89151234567.mp3") in new stack
-- Executing [s@macro-recording:6] Set("Local/89151234567@outcoling-0000005a;2", "CDR(realdst)=89151234567") in new stack
[Aug 23 12:47:15] WARNING[2427][C-0000088d]: func_channel.c:465 func_channel_read: Unknown or unavailable item requested: 'recvip'
-- Executing [s@macro-recording:7] Set("Local/89151234567@outcoling-0000005a;2", "CDR(remoteip)=") in new stack
-- Executing [s@macro-recording:8] MixMonitor("Local/89151234567@outcoling-0000005a;2", "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav,b,nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3" && rm -f "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" && chmod o+r "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3"") in new stack
-- Executing [s@macro-recording:9] Goto("Local/89151234567@outcoling-0000005a;2", "no") in new stack
== Begin MixMonitor Recording Local/89151234567@outcoling-0000005a;2
-- Goto (macro-recording,s,16)
-- Executing [s@macro-recording:16] Verbose("Local/89151234567@outcoling-0000005a;2", "Exit record") in new stack
Exit record
-- Executing [89151234567@outcoling:2] Dial("Local/89151234567@outcoling-0000005a;2", "SIP/ntel/89151234567") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/ntel/89151234567
> 0x7f2204059720 -- Strict RTP switching to RTP target address 10.0.10.20:5004 as source
> 0x7f2204059720 -- Strict RTP learning complete - Locking on source address 10.0.10.20:5004
-- Got SIP response 503 "Service Unavailable" back from 109.71.241.71:5060
-- SIP/ntel-000011f7 is circuit-busy
== Everyone is busy/congested at this time (1:0/1/0)
-- Executing [89151234567@outcoling:3] Hangup("Local/89151234567@outcoling-0000005a;2", "") in new stack
== Spawn extension (outcoling, 89151234567, 3) exited non-zero on 'Local/89151234567@outcoling-0000005a;2'
== MixMonitor close filestream (mixed)
== Everyone is busy/congested at this time (1:0/1/0)
-- Stopped music on hold on SIP/100-000011f5
== Executing [nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3" && rm -f "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.wav" && chmod o+r "/records/callrecords/1566553635.7555-2019-08-23-12_47-100-89151234567.mp3"]
-- Executing [301@outcoling:3] Hangup("SIP/100-000011f5", "") in new stack
== Spawn extension (outcoling, 301, 3) exited non-zero on 'SIP/100-000011f5'
== MixMonitor close filestream (mixed)
== Executing [nice -n 19 /usr/bin/lame -b 32 --silent "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3" && rm -f "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.wav" && chmod o+r "/records/callrecords/1566553635.7552-2019-08-23-12_47-100-301.mp3"]
== End MixMonitor Recording Local/89151234567@outcoling-0000005a;2
== End MixMonitor Recording SIP/100-000011f5
qualify=no ; думаете надо пихать провайдера пакетами OPTIONS ?
так стоит же no, если бы yes стояла, каждые 2 сек слал бы пакеты, а так то не должно быть, или я не прав?

Действие наобум, копипаст... На самом деле все не так просто :) Будущее телефонии дает поверхностную инфу, куча вопросов возникает, которые я днями гуглю. Что значит наобум? инфа из интернетиков...

я указал callerid=74951234567 в пире ntel, ничего не изменилось. и мне кажется не там надо указывать, или я не так думаю...

По этому поводу есть случай, читал на просторах, когда искал решение очередного вопроса. Пример ситуации:
Есть провайдер, он дает по одному договору несколько номеров по одному договору, как я понял транк один, а номеров по нему много, такое же может быть? Основной номер у бедолаги где то за границей, дополнительные номера по России. Ему пришел счет не малый за разговоры, начали разбираться -- исходящие шли не с российских городских, а с заграничного номера, от туда и счет.
А теперь по теме. Если провайдер может в одном транке давать много номеров, то в sip.conf не правильно прописывать callerid, думаю скорее в extensions (могу ошибаться конечно же :) ). то диалплан должен строиться (с учетом описанной выше ситуации):

exten => _495.,2,Dial(SIP/ntel/${EXTEN}@местныйномер)
exten => _481.,2,Dial(SIP/ntel/${EXTEN})@местныйномер)
exten => _816.,2,Dial(SIP/ntel/${EXTEN})@местныйномер)

Или типа того. Конечно могу ошибаться. Данная конструкция (несколько номеров местных) мне так же предстоит через некоторое время, хочу сделать местные номера по России, чтоб клиенты звонили на местный, попадали к нам. И у нас соответсвенно, что логично, звонки на конкретные регионы шли через местные номера (как минимум экономия на межгороде, с Москвы в Новосиб звонить подороже будет, чем от туда с прямого).

теперь по теме. в sip.conf подставил номер (callerid=74951234567, callerid=+74951234567, callerid=84951234567, callerid=4951234567), так и не пошло, от провайдера идет ответ 503.
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Переадресация на мобильный с GXP-1620

Сообщение ded »

Elektronik писал(а):qualify=no ; думаете надо пихать провайдера пакетами OPTIONS ?
так стоит же no, если бы yes стояла, каждые 2 сек слал бы пакеты, а так то не должно быть, или я не прав?
Это я поставил qualify=no
У вас стояло =yes (смотрите свой конфиг выше).
Elektronik писал(а): куча вопросов возникает, которые я днями гуглю. Что значит наобум? инфа из интернетиков...
У всех провайдеров подключения чуть разные, в интернетиках всё чуть по разному, и вы поступаете неразумно - вот у человека получилось в примере - копипаста к себе. Ах! У меня не получилось!
Аватара пользователя
Elektronik
Сообщения: 56
Зарегистрирован: 16 окт 2017, 12:42
Откуда: Москва

Re: Переадресация на мобильный с GXP-1620

Сообщение Elektronik »

Я не думаю, что провайдера это сильно беспокоит. Настройки транка взял с задармы, у них есть хоть на сайте настройки для их транков. Провайдер который сейчас, не давал никакой информации, только адрес сервера, логин и пароль. Более того, они мне сначала скинули просто логин\пароль, даже без сервера :) потом звонил, выяснял. Остальное догадывался сам. А что плохого в проверке качества? Он же проверяет, активен не активен транк...если это не по феншую, конечно поставлю no, спасибо за подсказку. Только смысл этого действия не понимаю.
Если вы включаете функцию qualify в конфигурации для Вашего SIP устройства в файле sip.conf, тогда Asterisk периодически будет отправлять SIP сообщение типа OPTIONS, для проверки, что данное устройство работает и доступно для совершения вызовов. Если данное устройство, не ответит в течении заданного периода (или периода по умолчанию) в миллисекундах, тогда Asterisk рассматривает это устройство как выключенное и недоступное для совершения вызовов.

Эта функциональность также может использоваться для сохранения открытой UDP сессии с устройством, которое находиться за сервером с трансляцией IP адресов (NAT). С помощью периодической отправки SIP сообщений OPTIONS, мы будем продлевать время жизни записи в таблице трансляции IP адресов, для нашего UDP соединения через NAT. Это время жизни будет продлеваться, когда присутствует трафик между нашим сервером и устройством, которое находиться по ту сторону NAT. Если же время жизни этой записи истечет, тогда запросы, отправляемые с нашего сервера Asterisk, просто не дойдут до SIP устройства, потому что NAT сервер уже не будет знать, как ему обратно оттранслировать IP адреса.
Этот режим используется совместно с установленным параметром nat=yes.
Вроде никакого криминала нет. На ошибках и синяках учатся, чаще на чужих, но и на своих порой. А я как раз и учусь :)

Но качество ладно, я понял по этому вопросу. А вот по теме топика так и не понял :(

Добавлено.
Понял! Эта функция для девайсов (телефонов и тп) и в секции провайдера не пишется, верно? тогда зачем в примере настройки транка задарма качество указано? вопрос...но не по теме :)
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH