Home > Без рубрики > Asterisk+N900+FXO

Asterisk+N900+FXO

После приобретения Nokia N900, как обычно стали возникать идеи как использовать нового электронного помошника с максимальным КПД, одна из них – получить доступ к АТС на работе, чтобы иметь самый дешевый вид связи как с миром так и с коллегами на время командировок и отсуствия на рабочем месте. Самым оптимальным будет реализовать связку N900-Asterisk-FXO-АТС.

АТС у нас в офисе старенькая – гибридная Panasonic KX-TD 1232. Внутренние номера разделены – есть цифровые и есть аналоговые. Мой номер аналоговый, поэтому чтобы астериск работал с ним нужна плата FXO. Самый дешевый вариант приобрести X100P или её клон. К сожалению в России это затруднительно, поэтому пришлось потратить 20$ на eBay и подождать месяц пока плата не приедет из сингапура. Найдя в почтовом ящике квитанцию, несемся на почту а от туда в офис поднимать сервер.

В качестве сервера использовалась машинка со стажем, Duron 1100/396 Mb RAM/20 Gb HDD. Чтобы не было искажений звука или других проблем, надо установить плату в такой слот чтобы она не делила свое прерывание ни с кем другим, это можно потом проверить в линуксе:

[root@asterisk ~]$ cat /proc/interrupts
CPU0
0:  879069739    XT-PIC-XT        timer
1:          2    XT-PIC-XT        i8042
2:          0    XT-PIC-XT        cascade
3:  877914025    XT-PIC-XT        wcfxo
4:      17541    XT-PIC-XT        serial
8:          0    XT-PIC-XT        rtc0
10:        138    XT-PIC-XT        uhci_hcd:usb1, uhci_hcd:usb2
11:    4066464    XT-PIC-XT        eth0
12:          4    XT-PIC-XT        i8042
14:     269771    XT-PIC-XT        pata_via
15:        111    XT-PIC-XT        pata_via
NMI:          0   Non-maskable interrupts
LOC:          0   Local timer interrupts
SPU:          0   Spurious interrupts
PMI:          0   Performance monitoring interrupts
PND:          0   Performance pending work
RES:          0   Rescheduling interrupts
CAL:          0   Function call interrupts
TLB:          0   TLB shootdowns
TRM:          0   Thermal event interrupts
THR:          0   Threshold APIC interrupts
MCE:          0   Machine check exceptions
MCP:       2931   Machine check polls
ERR:          0
MIS:          0

Скачиваем Fedora 13 для сетевой установки:

http://mirror.yandex.ru/fedora/linux/releases/13/Fedora/i386/iso/Fedora-13-i386-netinst.iso

Прожигаем на болванку и засовываем в привод. В процессе установки ничего особенного выбирать не нужно, практически все время нажимаем Next. Единственное если установка происходит в графическом режиме на этапе выбора пакетов программ можно выбрать минимальную конфигурацию, в текстовом режиме минимальная конфигурация ставится по умолчанию. Система установлена. Можно ставить Asterisk. В репозиториях Fedora он уже есть, хотя и отстает на пару релизов от официальной. Если установить из репозитория, то мы не найдем поддержки iLBC кодека, его можно собрать из исходных текстов сервера именно этой же версии сервера, но почему то в репозитории исходных текстов она отсутствует. Не будем печалиться и скачаем с asterisk.org.

Обновляем систему:

[root@asterisk ~]# yum install yum-presto yum-plugin-fastestmirror ;для скорейшего апдейта
[root@asterisk ~]# yum update ;обновляем систему
[root@asterisk ~]# yum install wget ;устанавливаем загрузчик файлов
[root@asterisk ~]# yum install make gcc gcc-c++ perl kernel-devel ncurses-devel  ;дополнительные пакеты для сборки, возможно у вас что то уже стоит, а что то еще надо доставить

Устанавливать Астериск надо в определенной последовательности — LibPRI (хотя в описании и не говорится об FXO модемах, тем ни менее он нужен), DAHDI, DAHDI Tools и сам Астериск. Если сделать наоборот, то при компиляции не будет собран модуль chan_dahdi.so.
Качаем исходники сервера и драйверов:

[root@asterisk ~]# cd /usr/src
[root@asterisk src]# wget http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.11.3.tar.gz
[root@asterisk src]# wget http://downloads.asterisk.org/pub/telephony/dahdilinux/releases/dahdi-linux-2.3.0.1.tar.gz
[root@asterisk src]# wget http://downloads.asterisk.org/pub/telephony/dahditools/releases/dahdi-tools-2.3.0.tar.gz
[root@asterisk src]# wget http://www.asterisk.org/downloads/asterisk/releases/asterisk-1.6.2.10.tar.gz

Установим библиотеку:

[root@asterisk src]# tar xvf libpri-1.4.11.3.tar.gz
[root@asterisk src]# cd libpri-1.4.11.3
[root@asterisk libpri-1.4.11.3]# make
[root@asterisk libpri-1.4.11.3]# make install

Установим драйвера:

[root@asterisk libpri-1.4.11.3]# cd ..
[root@asterisk src]# tar xvf dahdi-linux-2.3.0.1.tar.gz
[root@asterisk src]# cd dahdi-linux-2.3.0.1
[root@asterisk dahdi-linux-2.3.0.1]# make
[root@asterisk dahdi-linux-2.3.0.1]# make install
[root@asterisk dahdi-linux-2.3.0.1]# cd ..
[root@asterisk src]# tar xvf dahdi-tools-2.3.0.tar.gz
[root@asterisk src]# cd dahdi-tools-2.3.0
[root@asterisk dahdi-tools-2.3.0]# ./configure
[root@asterisk dahdi-tools-2.3.0]# make
[root@asterisk dahdi-tools-2.3.0]# make install
[root@asterisk dahdi-tools-2.3.0]# make config

Наконец переходим к установке астериска

[root@asterisk dahdi-tools-2.3.0]# cd ..
[root@asterisk src]# tar xvf asterisk-1.6.2.10.tar.gz

скачиваем исходника кодека iLBC

[root@asterisk src]# cd asterisk-1.6.2.10/contrib/scripts
[root@asterisk scripts]# ./get_ilbc_source.sh
[root@asterisk scripts]# cp -R codecs/ ../../

Напишу сразу чтобы к этому не возвращаться и не пересобирать астериск. Иногда возникает проблема с созданием DAHDI канала, это проявляется следующим образом: из sip вы не можете позвонить через DAHDI пока не
поступит входящий звонок. Это проблема лечится патчем: выложен он уже давно но почему то до сих пор исходники не поправили, возможно это не самая лучшая реализация решения этой ошибки, но главное что она работает.

{ Update: с версии 1.6.2.11 и выше этот патч включен в исходники Asterisk }

[root@asterisk script]# cd ../../
[root@asterisk asterisk-1.6.2.10]# ./configure –disable-xmldoc

Нам надо включить в компиляцию наш кодек.

[root@asterisk asterisk-1.6.2.10]# make menuconfig

Выбираем Codec Translators и ставим звездочку пробелом напротив codec_ilbc.
Жмем два раза ESC и S чтобы сохранить изменения. Далее сборка и установка сервера и файлов конфигурации.

[root@asterisk asterisk-1.6.2.10]# make
[root@asterisk asterisk-1.6.2.10]# make samples
[root@asterisk asterisk-1.6.2.10]# make install

Проблема аналоговых телефонных подключений – эхо. По умолчанию в DAHDI используется эхоподавитель mg2. В моей конфигурации он работал не столь эффективно, при отключенном echotranning, эхо более менее затухало только после 80 секунд разговора, при включенном — 12 секунд. Можно было бы поэкспериментировать с подбором показателей txgain и rxgain, но координально решило эту проблему установка OSLEC эхоподавителя. У меня он работает просто замечательно (бывают случаи эха со стороны звонящего и опонента, но они довольно редки).

Чтобы его установить надо скачать исходники впринципе любого ядра линукса версии выше 2.6.28, так как исходники OSLEC включены в него:

cd /usr/src
wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2
tar xjf linux-2.6.28.tar.bz2
mkdir /usr/src/dahdi/drivers/staging
cp -fR /usr/src/linux-2.6.28/drivers/staging/echo /usr/src/dahdi/drivers/staging
sed -i "s|#obj-m += dahdi_echocan_oslec.o|obj-m += dahdi_echocan_oslec.o|" /usr/src/dahdi/drivers/dahdi/Kbuild
sed -i "s|#obj-m += ../staging/echo/|obj-m += ../staging/echo/|" /usr/src/dahdi/drivers/dahdi/Kbuild
echo 'obj-m += echo.o' > /usr/src/dahdi/drivers/staging/echo/Kbuild
cd /usr/src/dahdi/
make
make install

Затем включаем OSLEC для нашего FXO модема. Открываем /etc/dahdi/system.conf и правим echocanceller=mg2,1 на echocanceller=oslec,1. Еще надо в файле /etc/dahdi/init.conf раскоментировать строчку DAHDI_UNLOAD_MODULES=»dahdi echo». Теперь все готово, тушим астериск и перезапускаем DAHDI /etc/init.d/dahdi restart.

Команда dahdi_cfg -vvv, должна показать следующее:

DAHDI Tools Version – 2.3.0

DAHDI Version: 2.3.0.1
Echo Canceller(s): OSLEC
Configuration

======================

Channel map:

Channel 01: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 01)

1 channels to configure.

Setting echocan for channel 1 to oslec

Настраиваем подключение к серверу. Правим  на основе дефолтного /etc/asterisk/sip.conf:

[general]
context=default ; Default context for incoming calls
allowguest=no ; Allow or reject guest calls (default is yes)
;match_auth_username=yes ; if available, match user entry using the
; ‘username’ field from the authentication line
; instead of the From: field.
allowoverlap=no ; Disable overlap dialing support. (Default is yes)
udpbindaddr=0.0.0.0 ; IP address to bind UDP listen socket to (0.0.0.0 binds to all)
; Optionally add a port number, 192.168.1.1:5062 (default is port 5060)
externip=111.122.133.144 ; внешний IP сервера
localnet=192.168.0.0/24
canreinvite=no
tcpenable=no ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0 ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
; Optionally add a port number, 192.168.1.1:5062 (default is port 5060)
srvlookup=yes ; Enable DNS SRV lookups on outbound calls
; Note: Asterisk only uses the first host
; in SRV records
; Disabling DNS SRV lookups disables the
; ability to place SIP calls based on domain
; names to some other SIP users on the Internet
; Specifying a port in a SIP peer definition or
; when dialing outbound calls will supress SRV
; lookups for that peer or call.
maxexpiry=3600 ; Maximum allowed time of incoming registrations
; and subscriptions (seconds)
minexpiry=20 ; Minimum length of registrations/subscriptions (default 60)
;defaultexpiry=120 ; Default length of incoming/outgoing registration
;mwiexpiry=3600 ; Expiry time for outgoing MWI subscriptions
qualifyfreq=30 ; Qualification: How often to check for the
; host to be up in seconds
; Set to low value if you use low timeout for
; NAT of UDP sessions
language=ru ; Default language setting for all users/peers
; This may also be set for individual users/peers
dtmfmode = rfc2833 ; Set default dtmfmode for sending DTMF. Default: rfc2833
; Other options:
; info : SIP INFO messages (application/dtmf-relay)
; shortinfo : SIP INFO messages (application/dtmf)
; inband : Inband audio (requires 64 kbit codec -alaw, ulaw)
; auto : Use rfc2833 if offered, inband otherwise
directmedia=no ; Asterisk by default tries to redirect the
; RTP media stream to go directly from
; the caller to the callee. Some devices do not
; support this (especially if one of them is behind a NAT).
; The default setting is YES. If you have all clients
; behind a NAT, or for some other reason want Asterisk to
; stay in the audio path, you may want to turn this off.
; This setting also affect direct RTP
; at call setup (a new feature in 1.4 – setting up the
; call directly between the endpoints instead of sending
; a re-INVITE).

[900]
type=friend
host=dynamic
username=900
secret=1234
language=ru
nat=yes
context=office
callerid=»Admin-mobile» <900>
allow=ilbc
allow=g729
canreinvite=no
qualify=4000 ; время за которое телефон должен пингануть сервер
directmedia=no

extensions.conf:

[office]
exten => 900,1, Macro(stdexten,900,SIP/900)
exten =>_+7X.,1,Dial(DAHDI/1/98${EXTEN:2},,tT) ; преобразование номеров телефонов вида +7ххх в вид 98ххх (9 – выход на внешнюю линию)
exten =>_8X.,1,Dial(DAHDI/1/9${EXTEN},,tT)
exten =>_1X.,1,Dial(DAHDI/1/${EXTEN},,tT) ; дозвон на внутренние номера 1хх
exten =>_2X.,1,Dial(DAHDI/1/${EXTEN},,tT) ; дозвон на внутренние номера 2хх
[from-pstn]
exten => s,1,Wait(1) ; Действия при поступления звонка НА модем
exten => s,n,Answer
exten => s,n,DIAL(SIP/900,20) ; переадресация на N900

Запускаем наконец то сервер.

[root@asterisk ~]# asterisk

Настраиваем Nokia. Добавляем учетную запись SIP. В поле адрес указыаем: login@server (например 900@test.ru). В расширенных настройках ставим галочку «использовать для телефонных номеров». Период поддержания активности я ставил 1 минуту иначе если телефон не отзовется то сервер посчитает что вы не на связи и люди смогут дозвониться от АТС до вас. Вы сможете звонить всегда когда есть интернет.

В принципе все должно работать. :)

P.S. долго думал как выбрать кодек – g729 или iLBC. При субьективной одинаковой отценке уровня качества звука и не смотря на большее потребление трафика я все таки выбрал iLBC. На мой взгляд он лучше справляется с потерями и искажениями пакетов (слова не обрываются а немного искажаются, но смысл остается понятен). На некоторых форумах видел отзывы что он плохо работает по WiFi, не ощутил, думаю это из разряда, «пиратский видео диск хуже показывает».

Tags: asterisk linux n900

Comments:1

  1. Сергей Ответить
    10.02.2017 at 00:31

    Спасибо, у меня поднят asterisk на n900 ,не подскажешь как прописать транк , чтобы входящий на симку перекидывал на ivr asterisk.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *