Яндекс.Метрика

    Ни о чём

    Asterisk для дома

    Что такое Asterisk и зачем он нужен дома



    Asterisk это открытая виртуальная PBX (телефонный коммутатор). Подробнее про Asterisk можно почитать в блоге Asterisk IP-PBX. Началось все с того, что я получил довольно крупный счет от местной телефонной компании за меджугородные переговоры. Вариантов платить меньше было собственно два: либо покупать карты IP телефонии и звонить с домашнего телефона по карте, либо звонить с ПК через SIP провайдеров. Первый вариант неудобен тем, что надо искать и покупать карты нужного провайдера IP телефонии, а второй тем, что привязан к компьютеру. Решение пришло, когда я узнал про Asterisk. Его можно было подключить и к городской телефонной линии и к SIP провайдеру и к домашнему стационарному телефону. Дома у меня уже имелся сервер, на котором можно было все установить.

    Установка и настройка



    Итак, первым делом надо установить Asterisk. В дебиане это делается исключительно просто. Надо всего лишь установить пакет asterisk. Я рекомендую ставить версию 1.6 из squeeze(testing на данный момент, в последствии это будет версия 6.0) дистрибутива дебиана, так как для него есть addon chan_mobile, но об этом позже.

    Про найстройку SIP подключений и dialplan'ов есть много рускоязычных статей, поэтому я не буду на этом останавливаться.

    Во вторых надо подключить Asterisk к городской телефонной линии и к домашнему телефону. Для этого компания Digium выпускает специальные PCI и PCI-e карты. Стоят они достаточно дорого, но на eBay можно найти их аналоги выпущеные китайской компанией OpenVox, которые стоят намного дешевле. Я приобрел двухпортовую PCI-e карту OpenVox A400E с одним FXO портом и одним FXS портом.

    Далее, настройка катры:
    chan_dahdi.conf:
    [trunkgroups]

    [channels]
    switchtype=national
    usecallerid=yes
    hidecallerid=no
    callwaiting=yes
    callwaitingcallerid=yes
    threewaycalling=yes
    transfer=yes
    echocancel=yes
    busydetect=yes
    ;callprogress=yes
    adsi=yes

    ;cidsignalling=bell
    ;cidstart=ring

    callerid=asreceived

    immediate=yes

    context=phones
    signalling=fxo_ks
    faxdetect=both
    channel => 1

    context=incoming-city
    signalling=fxs_ks
    faxdetect=both
    channel => 2


    Настройка SIP:
    sip.conf:
    [general]

    register => login:password@provider
    [authentication]
    [user_login]
    type=friend
    context=phones
    host=dynamic
    secret=user_password
    callerid="User" <1001>

    [sip]
    type=friend
    username=sip_login
    secret=sip_password
    callerid=SIP
    host=provider
    nat=no
    fromuser=
    fromdomain=provider
    dtmfmode=rfc2833
    insecure=very
    context=incoming-sip
    disallow=all
    allow=alaw

    sip_login, sip_password, provider — это соответственно ваш логин пароль и провайдер.
    user_login, user_password — логин и пароль для подключения SIP телефона к Asterisk.

    Простой extensions.conf:
    [globals]

    [general]

    [default]
    exten => s,n,Answer()
    exten => s,n,Playback(tt-weasels)
    exten => s,n,Hangup()

    [phones]
    exten => s,n,Answer()
    exten => s,n,WaitExten(30)
    exten => _0.,1,NoOp()
    exten => _0.,n,Goto(outbound-city,${EXTEN},1)
    exten => _NXXXXXX,1,NoOp()
    exten => _NXXXXXX,n,Goto(outbound-city,${EXTEN},1)
    exten => _NXXNXXXXXX,1,NoOp()
    exten => _NXXNXXXXXX,n,Goto(outbound-sip,${EXTEN},1)

    exten => t,1,Playback(vm-goodbye)
    exten => t,n,Hangup()
    exten => i,1,Playback(invalid)
    exten => i,n,Hangup()

    [incoming-sip]
    exten => s,n,Answer()
    exten => s,n,Dial(SIP/user_login)
    exten => s,n,Hangup()

    [incoming-city]
    exten => s,n,Answer()
    exten => s,n,Dial(DAHDI/1)
    exten => s,n,Hangup()

    [outbound-sip]
    exten => _XXXXXXXXXX,1,Dial(SIP/$[7${EXTEN}]@provider)
    exten => _XXXXXXXXXX,n,Hangup()

    [outbound-city]
    exten => _0.,1,Dial(DAHDI/2/${EXTEN})
    exten => _0.,n,Hangup()
    exten => _NXXXXXX,1,Dial(DAHDI/2/${EXTEN})
    exten => _NXXXXXX,n,Hangup()


    Такой extension.conf позволяет звонить с домашнего телефона на семизначные номера и номера начинающиеся на 0 через городскую телефонную сеть, а на междугородние номера через SIP провайдера.

    Дополнительные возможности



    1. Запись всех телефонных разговоров

    Для этого надо в dialplan (extensions.conf) вставить вызов приложения MixMonitor.
    [phones]
    exten => s,n,Answer()
    exten => s,n,MixMonitor(phone-${UNIQUEID}.wav)
    exten => s,n,WaitExten(30)

    Записи разговоров будут складываться в папку /var/spool/asterisk/monitor

    2. Прием и передача факсов

    Для передачи факса надо вызвать приложение SendFax и передать в качестве аргумента имя TIFF файла. TIFF можно получить из PDF с помощью команды
    $ /usr/bin/gs -q -sDEVICE=tiffg3 -sPAPERSIZE=a4 -r204x196 -dNOPAUSE -sOutputFile=/var/spool/asterisk/outgoing/mydocument.tif -- /var/spool/asterisk/outgoing/mydocument.pdf
    Обратите внимание, что не любой TIFF файл может быть отправлен как факс, а только в формате TIFF/F (tiffg3).
    Для передачи факса вручную запускаем консоль астериска и выполняем команду:
    # asterisk -r
    server*CLI> originate originate DAHDI/1 application SendFax /tmp/test.tif

    Для того, что бы настроить прием факса надо в dialplan добавить следующее:
    extensions.conf:
    [incoming-city]
    exten => s,n,Answer()
    exten => s,n,Wait(5)
    exten => s,n,Dial(DAHDI/1)
    exten => s,n,Hangup()

    exten => fax,1,ReceiveFax(/var/spool/asterisk/fax/${CALLERID(num)}-${UNIQUEID}.tif)
    exten => fax,n,Hangup()

    Задержка на 5 секунд после Answer() необходима, для того, что бы Asterisk распознал сигнал входящего факса и переключился на extension fax.
    Не забудте указать faxdetect=both в chan_dahdi.conf.

    Входящие факсы будут складываться в формате TIFF в папку /var/spool/asterisk/fax
    Существуют скрипты, позволяющие автоматизировать процесс приема/передачи факсов с конвертацией в PDF и обратно, а так же отправкой принятых факсов на e-mail.

    3. Фильтрация звонков по CALLERID


    Для того, чтобы работал CALLERID мне пришлось отдельно заказывать соответствующую услугу у телефонного оператора. К счастью она бесплатна, но подключали мне ее пару дней. Если CALLERID работает, то можно управлять исполнением диалплана в зависимости от номера с которого приходит звонок.
    [incoming-city]
    exten => s,1,Wait(2)
    exten => s,n,GotoIf($["${CALLERID(num):-10}" = "5555555555"]?1000)
    exten => s,n,Dial(DAHDI/1)
    exten => s,n,Hangup()

    exten => s,1000,Wait(600)
    exten => s,n,Answer()
    exten => s,n,Congestion()
    exten => s,n,Hangup()


    В этом примере звонки с номера 5555555555 игнорируются.
    Важное замечание: CALLERID передается до того как трубка поднята, а сигналы факса передаются после того как трубка поднята. Поэтому для устойчивого приема сигнала факса надо поставить задержку после Answer, я для устойчивого приема CALLERID иногда приходится добавлять задержку до Answer.

    4. Подключение к сети GSM


    Для того, что бы звонить через сеть GSM есть специальные PCI-e карты стоимостью больше $1000, что не приемлемо в домашних условиях. Но, к счастью, есть addon к Asterisk, который позволяет использовать обычный сотовый телефон в качестве шлюза в GSM сеть. Для этого надо установить пакет asterisk-mobile. Он не так давно появился в дистрибутиве Debian. Кроме того понадобится USB Bluetooth адаптер. Подойдет любой работающий под Linux (Asterisk умеет работать через bluez), ну и собственно телефон, поддерживающий Bluetooth.
    Настройка:
    в mobile.conf пишем:
    [general]

    [adapter]
    id=blue
    address=00:11:22:33:44:55

    Где вместо 00:11:22:33:44:55 адрес вашего Bluetooth адаптера.
    Запускаем консоль Asterisk и ищем телефон:
    server*CLI> mobile search
    Address Name Usable Type Port
    66:77:88:99:AA:BB Nokia Yes Phone 13


    Добавляем в mobile.conf секцию для телефона:
    [GSM]
    address=66:77:88:99:AA:BB
    port=13
    type=phone
    adapter=blue
    context=incoming-gsm

    Где вместо 66:77:88:99:AA:BB адрес вашего телефона, а вместо port=13 надо вписать порт на котором ваш телефон работает. После этого можно перезагрузить модуль chan_mobile и проверить, что все работает.
    server*CLI> module unload chan_mobile
    server*CLI> module load chan_mobile
    server*CLI> mobile show devices
    ID Address Group Adapter Connected State SMS
    GSM 66:77:88:99:AA:BB 0 blue Yes Free Yes


    В диалплан надо добавить входящий и исходящий контексты:
    [phones]
    exten => _913NXXXXXX,1,NoOp()
    exten => _913NXXXXXX,n,Goto(outbound-gsm,${EXTEN},1)

    [incoming-gsm]
    exten => s,n,Answer()
    exten => s,n,Dial(DAHDI/1)
    exten => s,n,Hangup()

    [outbound-gsm]
    exten => _NXXNXXXXXX,1,Dial(Mobile/GSM/${EXTEN})
    exten => _NXXNXXXXXX,n,Hangup()


    Звонки на мобильные номера сибирского региона будут направляться через GSM.

    Важное замечание: не забудте спарить сервер с вашим телефоном. Это делается с помощью команды /usr/bin/bluetooth-agent

    Если ваш телефон поддерживает отправку СМС, то можно настроить отправку СМС из диалплана. Например при получении факса:
    [incoming-city]
    exten => fax,1,ReceiveFax(/var/spool/asterisk/fax/${CALLERID(num)}-${UNIQUEID}.tif)
    exten => fax,n,MobileSendSMS(GSM,+75555555555,incoming fax #${UNIQUEID} from ${CALLERID(num)})
    exten => fax,n,Hangup()


    Заключение



    У Asterisk много дополнительных возможностей, о которых не сказано в этом топике. Для примера можно привести: голосовые меню и интеграция с системой синтеза голоса Festival, голосовые почтовые ящики, постановка звонков в очередь, и т. д. Но этим возможностям сложно придумать применение в быту, поэтому мы их опускаем. Возможно читатели придумают как еще можно использовать домашний Asterisk PBX.