DISA для Skype в Asterisk

Довелось прикрутить к Asterisk 1.4 Skype-канал. Но поскольку пользователей на астериске много, а skype-id всего один, пришлось сочинять некое подобие DISA. Проще говоря приятный женский голос, говорящий «наберите номер абонента», отправляющий незнающих на оператора и строго указывающий «номер не существует – проверьте номер и перезвоните». Кстати до этого не знал, что скайп умеет делать тоновый набор – при разговоре среди кнопочек есть панелька с цифровой клавиатурой.

Стандартная встроенная функция DISA http://www.asterisk-pbx.ru/wiki/doku.php/freepbx/disa была отправлена на покой, ибо не умела многого, чего надо.

Для начала был найден бесплатный русский голос (IVR) для asterisk: http://www.ivrvoice.ru/downloader . Файлы с ним ушли на путь /usr/local/share/asterisk/sounds/ где переписали дефолтные речевки.

Вторым шагом была создана MySQL база с таблицей, в которой содержатся все телефоны пользователей, их ФИО и проч. данными. Это сделано больше не для DISA, но тут оно тоже используется – для проверки существования данного номера.

Далее самый интересный момент. Собственно код самой дисы из extension.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; ДИСА Скайпа
; Отвечаем на звонок
exten => disa-skype,1, Answer
exten => disa-skype,n, Wait(3)
exten => disa-skype,n, Set(opernum=100)
; Если ночное время - сразу отправляем на оператора
exten => disa-skype,n, GotoIfTime(21:00-7:30|*|*|*?callop_start)
; Играем приветствие и ждем набора 3х цифр
exten => disa-skype,n(enternum), Read(numread,privetstviye,3)
; Если не набрали добавочный - вызов на оператора
exten => disa-skype,n, GoToIf($["${numread}" = ""]?callop_start)
; Проверка добавочного на корректность по бд. Если ошибка - на повторный набор
exten => disa-skype,n(mysqlchk_start), NoOp
exten => disa-skype,n, MYSQL(Connect connid mysqlhost asteriskdbuser asteriskdbpassword asteriskdb)
exten => disa-skype,n, MYSQL(Query resultid ${connid} SELECT\ name\ from\ abonents\ where\ num=${numread})
exten => disa-skype,n, MYSQL(Fetch fetchid ${resultid} numread_name)
exten => disa-skype,n, NoOp(${numread_name})
exten => disa-skype,n, GoToIf($["${numread_name}" = ""] ?numerror_start)
exten => disa-skype,n(mysqlchk_end), NoOp
; Говорим номер абонента и уходим на экстеншн набора номера
exten => disa-skype,n(callint_start), NoOp
exten => disa-skype,n, Playback(priv-trying)
exten => disa-skype,n, Playback(digits/${numread:0:1}00)
exten => disa-skype,n, Playback(${IF($[ ${numread:1:2} < 21] ?"digits/${numread:1:2}":"digits/${numread:1:1}0&digits/${numread:2:1}")})
exten => disa-skype,n, Playback(${IF($[ ${numread:1:2} < 10] ?"digits/${numread:2:1}":"silent")})
exten => disa-skype,n, Goto(${numread},1)
exten => disa-skype,n, Hangup
exten => disa-skype,n(callint_end), NoOp
; Набраем оператора.
exten => disa-skype,n(callop_start), NoOp
exten => disa-skype,n, Playback(queue-callswaiting)
exten => disa-skype,n, GoTo(${opernum},1)
exten => disa-skype,n, Hangup
exten => disa-skype,n(callop_end), NoOp
; Неверный набор номера. Говорим мол ошибка и сбрасываем.
exten => disa-skype,n(numerror_start), NoOp
exten => disa-skype,n, Playback(privacy-incorrect)
exten => disa-skype,n, Playback(check-number-dial-again)
exten => disa-skype,n, Wait(3)
exten => disa-skype,n, Hangup
exten => disa-skype,n(numerror_end), NoOp

Саунд privetstvye.gsm лежит там же, где и все остальные звуки. Это собственно и есть фраза «здравствуйте, наберите добавочный номер абонента или дождитесь ответа оператора». Поскольку целой такой фразы не было – он был собран из нескольких отдельных. Получилось в общем-то ничего. А с 1.6 версии он уже может проигрывать несколько звуковых файлов подряд и не придется страдать подобной фигней.

К сожалению, не удалось побороть иногда возникающее «проглатывание» нескольких секунд начальной фразы, которая произносится при ответе на звонок. Скайп как-то долго контачит с астериском и пользователь слышит уже середину фразы. Аналогичную дису с добавлением фишек а ля «получение факса» и «скрытое меню» позже прикрутил на обычный городской номер.

Другие публикации по данной теме:

6 Ответов к “DISA для Skype в Asterisk”

  1. Замечательная статья!
    Но есть одно маленькое но, каким образом ты смог прикрутить SFA под Freebsd?
    бьюсь уже неделю, был очень признателен за статью или маленькое howto =)

    • Спасибо!
      К сожалению сам Skype и модуль siptosis работают под виндой. Делал по этой инструкции: http://www.asterisk-pbx.ru/wiki/doku.php/artikle/siptoskype . Еще один важный момент – на компьютере должна быть звуковая плата с установленными драйверами настроенным микрофонным входом и выходом. Иначе звук не шел..

  2. siptosis я тоже пытался завести на freebsd не получилось, программа стартует но вываливаются ошибки что не может найти какой то класс…. ИМХО siptosis это большой костыль, но SFA поддержку freebsd не заявила, так что за неимением другого приходится пользоваться костылями.
    Есть идеи как разрулить тему с siptosis на фряхе?

    • Даже не пытался, поскольку для его работы нужен запущенный Skype , а у меня все фри чисто консольные, без GUI – на них скайп не встанет. В перспективе думаю поднять все это на фре, но пока нет на это времени.. В целом костыль довольно стабильный, но имеет свойство глотать звук в первые несколько секунд начала разговора.

  3. все в июле заканчиватся продажа skype для asterisk !

Оставить комментарий

(обязательно)

(обязательно)

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой:

Условия перепечатки материалов

При использовании материалов сайта на других ресурсах, прошу оставлять прямую, незаскриптованную и незакрытую от поисковых роботов ссылку на оригинал статьи.
© 2011 mahn0::Записки системного администратора
Кабинеты тут. Крепкая офисная мебель по приемлемым ценам в офисе продаж "ПРОСПЕКТ". Звоните .