5 May 2011

Asterisk для дома

Lumber room

Что такое 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.
Tags:asteriskvoipchan_mobileopenvox
Hubs: Lumber room
+18
5.4k 55
Comments 11