Установка и настройка VoIP сервера Asterisk-1.8.20

05.04.2013 - 10:44

В этой заметке хочу расказать о настройке сервера IP-телефонии для интернет-магазина.

voip_shem_0.png

На входе имеем:

1 - входящяя IP линии CDMA (многоканальный номер по IP адресу)
2 - входящие линии GSM "Kyivstar" (через голосовые модемы Huawei E1550)
2 - входящие линии GSM "МТС" (через голосовые модемы Huawei E1550)

На выходе:

5 - внутренних телефонных линий с номерами (201-205) по SIP и (210-211) по IAX2.

Требования заказчика:
1. Прием всех входящих звонков, одновременно на все внутренние номера.
2. Набор исходящих вызовов с автовыбором не занятой линии.
3. Звонки между внутренними абонентами.

Настраивать данную связку буду на FreeBSD 9.1-RELEASE i386, asterisk-1.8.20.1.

Подготовка GSM модемов
В качестве GSM шлюзов будем испозовать 3G модемы Huawei E1550, которые предварительно нужно сконфигурировать:
1. Модемы должны быть разлочены и актывны голосовые функции.
2. Прошивка должна быть "11.608.14.15.311", перед этим у меня стояла "11.608.12.10.209", с ней были реальные глюки, пропадал голос.
2. Необходимо перевести модем в режим "Только модем", далее опишу как это сделать.
3. С SIM карты, которая будет стоять в модеме, необходимо снять PIN-код.

Переводим все наши модемы в режим "Только модем", у меня их 4-ре:

[root@voip ~]# cu -l /dev/cuaU0.0 -s 9600
Connected
AT^U2DIAG=0
OK
~.
[root@voip ~]# cu -l /dev/cuaU1.0 -s 9600
Connected
AT^U2DIAG=0
OK
~.
[root@voip ~]# cu -l /dev/cuaU2.0 -s 9600
Connected
AT^U2DIAG=0
OK
~.
[root@voip ~]# cu -l /dev/cuaU3.0 -s 9600
Connected
AT^U2DIAG=0

Для выхода из терминала используем "~."
Теперь необходимо вытянуть и вставить все USB модемы для переинициализации.Или просто перегрузить USB Hub.
Все модемы готовы. В устройствах мы увидим их как /dev/cuaUx.x:
[root@voip /dev]# ls /dev | grep cua
cuaU0.0
cuaU0.0.init
cuaU0.0.lock
cuaU0.1
cuaU0.1.init
cuaU0.1.lock
cuaU0.2
cuaU0.2.init
cuaU0.2.lock
cuaU1.0
cuaU1.0.init
cuaU1.0.lock
cuaU1.1
cuaU1.1.init
cuaU1.1.lock
cuaU1.2
cuaU1.2.init
cuaU1.2.lock
cuaU2.0
cuaU2.0.init
cuaU2.0.lock
cuaU2.1
cuaU2.1.init
cuaU2.1.lock
cuaU2.2
cuaU2.2.init
cuaU2.2.lock
cuaU3.0
cuaU3.0.init
cuaU3.0.lock
cuaU3.1
cuaU3.1.init
cuaU3.1.lock
cuaU3.2
cuaU3.2.init
cuaU3.2.lock

В качестве USB хаба: D-link DUB-H7.

Установка Asterisk
Теперь можем перейти к установке Asterisk, которую будем производить из портов:

[root@voip2 /]#cd /usr/ports/net/asterisk
[root@voip2 /usr/ports/net/asterisk]# make config
[x] CURL      Data transfer via cURL
[x] DAHDI     DAHDI support  
[ ] EXCHANGE  Exchange calendar support
[x] FREETDS   FreeTDS library
[x] GSM       GSM codec support
[x] H323      H.323 support
[x] JABBER    Jabber support
[ ] LDAP      LDAP support
[ ] LUA       Lua scripting language
[ ] MYSQL     MySQL database
[x] NEWG711   New G711 Codec
[x] OOH323    ooh323 support
[x] PGSQL     PostgreSQL database
[ ] RADIUS    RADIUS protocol
[x] SNMP      SNMP protocol
[ ] SPANDSP   Spandsp faxing
[x] SQLITE    SQLite database
[ ] SRTP      SecureRTP support
[x] VORBIS    Ogg Vorbis audio code
( ) IODBC     ODBC backend via iODBC
(*) UNIXODBC  ODBC backend via unixODBC

[root@voip2 /usr/ports/net/asterisk]# make install clean

echo 'asterisk_enable="YES"' >> /etc/rc.conf

Далее необходимо отредактировать основные конфигурационные файлы сервера:

[root@voip /usr/local/etc/asterisk]#cat /usr/local/etc/asterisk/asterisk.conf
[directories](!)
astetcdir => /usr/local/etc/asterisk
astmoddir => /usr/local/lib/asterisk/modules
astvarlibdir => /usr/local/share/asterisk
astdbdir => /var/db/asterisk
astkeydir => /usr/local/share/asterisk
astdatadir => /usr/local/share/asterisk
astagidir => /usr/local/share/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk

[options]
defaultlanguage = ru           ; Default language
documentation_language = en_US  ; Set the language you want documentation

[files]
astctlpermissions = 0777
astctlowner = root
astctlgroup = apache
astctl = asterisk.ctl

[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6

Установка модуля chan_dongle
Скачиваем и устанавливаем модуль канала https://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz или читаем INSTALL (метод установки может отличаться):

tar zxvf chan_dongle-1.1.r14.tgz
cd chan_dongle-1.1.r14
./configure
gmake install
cp etc/dongle.conf /usr/local/etc/asterisk/

Для консоли Asterisk, приведу некоторые полезные команды:
CLI>module load chan_dongle.so
CLI>module unload chan_dongle.so
CLI>module reload chan_dongle.so

[root@voip /usr/local/etc/asterisk]# cat dongle.conf
[general]
interval=15                     ; Number of seconds between trying to connect to devices
[Kyivstar1]
context=ks1                         ; Контекст для входящих с GSM шлюза, понадобится в extensions.ael
audio=/dev/cuaU0.1                  ; Порт для голосовых функций
data=/dev/cuaU0.2                   ; Порт для AT команд
group=1                             ; Группа звонка
rxgain=2                            ; Увеличение входящей громкости
txgain=2                            ; Увеличение исходящей громкости
autodeletesms=yes                   ; Автоматически удалять входящие смс
resetdatacard=yes                   ; Сбросить модем во время инициализации
u2diag=0                            ; Установить U2DIAG параметр (0 = отключить все кроме функций модема)
usecallingpres=yes                  ; Предоставлять информацию о CallerID или нет
callingpres=allowed_passed_screen   ; Установить СallerID presentation
disablesms=no                      ; chan_datacard в данный момент глючит с приемом SMS. Когда SMS приходит во время звонка

[Kyivstar2]
context=ks2                         ; Контекст для входящих с GSM шлюза, понадобится в extensions.ael
audio=/dev/cuaU2.1                  ; Порт для голосовых функций
data=/dev/cuaU2.2                   ; Порт для AT команд
group=1                             ; Группа звонка
rxgain=2                            ; Увеличение входящей громкости
txgain=2                            ; Увеличение исходящей громкости
autodeletesms=yes                   ; Автоматически удалять входящие смс
resetdatacard=yes                   ; Сбросить модем во время инициализации
u2diag=0                            ; Установить U2DIAG параметр (0 = отключить все кроме функций модема)
usecallingpres=yes                  ; Предоставлять информацию о CallerID или нет
callingpres=allowed_passed_screen   ; Установить СallerID presentation
disablesms=no                      ; chan_datacard в данный момент глючит с приемом SMS. Когда SMS приходит во время звонка

[UMC1]
context=mts1                         ; Контекст для входящих с GSM шлюза, понадобится в extensions.ael
audio=/dev/cuaU1.1                  ; Порт для голосовых функций
data=/dev/cuaU1.2                   ; Порт для AT команд
group=1                             ; Группа звонка
rxgain=2                            ; Увеличение входящей громкости
txgain=2                            ; Увеличение исходящей громкости
autodeletesms=yes                   ; Автоматически удалять входящие смс
resetdatacard=yes                   ; Сбросить модем во время инициализации
u2diag=0                            ; Установить U2DIAG параметр (0 = отключить все кроме функций модема)
usecallingpres=yes                  ; Предоставлять информацию о CallerID или нет
callingpres=allowed_passed_screen   ; Установить СallerID presentation
disablesms=no                      ; chan_datacard в данный момент глючит с приемом SMS. Когда SMS приходит во время звонка

[UMC2]
context=mts2                         ; Контекст для входящих с GSM шлюза, понадобится в extensions.ae
audio=/dev/cuaU3.1                  ; Порт для голосовых функций
data=/dev/cuaU3.2                   ; Порт для AT команд
group=1                             ; Группа звонка
rxgain=2                            ; Увеличение входящей громкости
txgain=2                            ; Увеличение исходящей громкости
autodeletesms=yes                   ; Автоматически удалять входящие смс
resetdatacard=yes                   ; Сбросить модем во время инициализации
u2diag=0                            ; Установить U2DIAG параметр (0 = отключить все кроме функций модема)
usecallingpres=yes                  ; Предоставлять информацию о CallerID или нет
callingpres=allowed_passed_screen   ; Установить СallerID presentation
disablesms=no                      ; chan_datacard в данный момент глючит с приемом SMS. Когда SMS приходит во время звонка

[root@voip /usr/local/etc/asterisk]# cat sip.conf
[general]
register => 445050505:12345678@pbx.cdma.ua
[OFFICE](!)
type=friend ; может как принимать, так и совершать звонки
host=dynamic
nat=no ;если сервер за натом ставим yes, что бы удаленные клиенты могли подключаться к серверу.
canreinvite=no ;блокирует отправку сообщений re-INVITE
context=for-office ; контекст с таким именем должен существовать в dialplanе
disallow=all ; разрешить только определенные кодэки
allow=ulaw ; данная конфигурация лучше подходит
allow=alaw ; для локальной сети - без сжатия.
monitor=yes
language=ru ; язык
dtmfmode=rfc2833
allowguest=no
alwaysauthreject=yes ;ошибках авторизации отвечает 401 Unauthorized
localnet=192.168.1.0/255.255.255.0


[201](OFFICE)
defaultuser=user1
secret=12345678
call-limit=1
callerid="user1" <201>

[202](OFFICE)
defaultuser=user2
secret=12345678
call-limit=1
callerid="user2" <202>

[203](OFFICE)
defaultuser=user3
secret=12345678
call-limit=1
callerid="user3" <203>

[204](OFFICE)
defaultuser=user4
secret=12345678
call-limit=1
callerid="user4" <204>

[205](OFFICE)
defaultuser=user5
secret=12345678
call-limit=1
callerid="user5" <205>

[intertelecom]
host=pbx.cdma.ua
defaultuser=445050505 ;логин
secret=12345678 ;пароль
type=friend
insecure=invite
qualify=yes
nat=yes ;если наш сервер находится за натом
dtmfmode=rfc2833
diallow=all
context=it1
canreinvite=yes
allow=alaw
allow=g729
allow=ulaw
allow=gsm
registerattempts=0
rtpkeepalive=10
callerid=it750
fromdomain=83.81.91.51 ;тут указываем наш внешний IP

Удаленных сотрудников будем подключать по протоколу IAX2, который использует всего один порт 4569 (UDP).
Можно и по SIP, тогда необходимо открыть порт 5060(UDP), А так же диапазон портов 10000:20000(UDP), который описано в rtp.conf.

[root@voip /usr/local/etc/asterisk]# cat iax.conf
[210]
auth=md5
secret=12345678
context=for-office
type=friend
host=dynamic

[211]
auth=md5
secret=12345678
context=for-office
type=friend
host=dynamic

[root@voip /usr/local/etc/asterisk]# cat extensions.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no

;=============IN-CALL=======================================================

;КиевСтар-1
[ks1]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205&IAX2/211,20)
exten => s,2,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s,3,Answer() ; поднять трубку
exten => s,4,Playback(vm-nobodyavail) ; в данный момент никто не может принять Ваш звонок
exten => s,n,Hangup() ; положить трубку

;exten => s,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205&IAX2/211,30,tT)
;exten => s,2,GotoIf(${DIALSTATUS} = BUSY,3)
;exten => s,3,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
;exten => s,4,GotoIf(${DIALSTATUS} = NOANSWER,5)
;exten => s,5,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
;exten => s,6,GotoIf(${DIALSTATUS} = CANCEL,7)
;exten => s,7,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
;exten => s,n,Hangup() ; положить трубку

;КиевСтар-2
[ks2]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

;exten => s,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205&IAX2/211,60)
;exten => s,2,Answer() ; поднять трубку
;exten => s,3,Playback(vm-nobodyavail) ; в данный момент никто не может принять Ваш звонок
;exten => s,n,Hangup() ; положить трубку

;МТС-1
[mts1]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205&IAX2/211,20)
exten => s,2,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s,3,Answer() ; поднять трубку
exten => s,4,Playback(vm-nobodyavail) ; в данный момент никто не может принять Ваш звонок
exten => s,n,Hangup() ; положить трубку

;МТС-2
[mts2]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205,20)
exten => s,2,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s,3,Answer() ; поднять трубку
exten => s,4,Playback(vm-nobodyavail) ; в данный момент никто не может принять Ваш звонок
exten => s,n,Hangup() ; положить трубку

;Интертелеком-1
[it1]
exten => 445371750,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204&SIP/205&IAX2/211,20)
exten => 445371750,2,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${CALLERID(name)} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => 445371750,3,Answer()
exten => 445371750,4,Playback(vm-nobodyavail)
exten => 445371750,5,Hangup()

[for-office]
;Который час?
exten => 200,1,Answer()
exten => 200,n,SayUnixTime(,,QdhAR)
exten => 200,n,WaitMusicOnHold(10)
exten => 200,n,Goto(200,1)

; Обычный SIP пользователь 201
exten => 201,1, Dial(SIP/201,60)
exten => 201,n, Hangup

; Обычный SIP пользователь 202
exten => 202,1, Dial(SIP/202,60)
exten => 202,n, Hangup

; Обычный SIP пользователь 203
exten => 203,1, Dial(SIP/203,60)
exten => 203,n, Hangup

; Обычный SIP пользователь 204
exten => 204,1, Dial(SIP/204,60)
exten => 204,n, Hangup

; Обычный SIP пользователь 205
exten => 205,1, Dial(SIP/205,60)
exten => 205,n, Hangup

;IAX2
; Обычный IAX2 пользователь 210
exten => 210,1, Dial(IAX2/210,60)
exten => 210,n, Hangup

; Обычный IAX2 пользователь 211
exten => 211,1, Dial(IAX2/211,60)
exten => 211,n, Hangup

;=============OUT-CALL=======================================================
;to GoldenTelecom
exten => _039XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},60)
exten => _039XXXXXXX,n,Hangup

exten => _+38039XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},60)
exten => _+38039XXXXXXX,n,Hangup

;to Kyivstar,Beeline,Life:)
;exten => _06[3,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},60)
;exten => _06[3,7,8]XXXXXXX,n,Hangup
;exten => _+3806[3,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},60)
;exten => _+3806[3,7,8]XXXXXXX,n,Hangup

exten => _06[3,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},30,tT)
exten => _06[3,7,8]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _06[3,7,8]XXXXXXX,3,Dial(Dongle/Kyivstar2/${EXTEN},30,tT)
exten => _06[3,7,8]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _06[3,7,8]XXXXXXX,5,Hangup

exten => _+3806[3,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},30,tT)
exten => _+3806[3,7,8]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _+3806[3,7,8]XXXXXXX,3,Dial(Dongle/Kyivstar2/${EXTEN},30,tT)
exten => _+3806[3,7,8]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _+3806[3,7,8]XXXXXXX,5,Hangup

;to Kyivstar,Djuice,Utel,Peoplenet,Life,
;exten => _09[1,2,3,6,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},30)
;exten => _09[1,2,3,6,7,8]XXXXXXX,n,Hangup
;exten => _+3809[1,2,3,6,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},60)
;exten => _+3809[1,2,3,6,7,8]XXXXXXX,n,Hangup

exten => _09[1,2,3,6,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},30,tT)
exten => _09[1,2,3,6,7,8]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _09[1,2,3,6,7,8]XXXXXXX,3,Dial(Dongle/Kyivstar2/${EXTEN},30,tT)
exten => _09[1,2,3,6,7,8]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _09[1,2,3,6,7,8]XXXXXXX,5,Hangup

exten => _+3809[1,2,3,6,7,8]XXXXXXX,1,Dial(Dongle/Kyivstar1/${EXTEN},30,tT)
exten => _+3809[1,2,3,6,7,8]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _+3809[1,2,3,6,7,8]XXXXXXX,3,Dial(Dongle/Kyivstar2/${EXTEN},30,tT)
exten => _+3809[1,2,3,6,7,8]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _+3809[1,2,3,6,7,8]XXXXXXX,5,Hangup

;to MTS (095,099)
exten => _09[5,9]XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _09[5,9]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _09[5,9]XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _09[5,9]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _09[5,9]XXXXXXX,5,Hangup


exten => _+3809[5,9]XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _+3809[5,9]XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _+3809[5,9]XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _+3809[5,9]XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _+3809[5,9]XXXXXXX,5,Hangup

;to MTS (050)
exten => _050XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _050XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _050XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _050XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _050XXXXXXX,5,Hangup

exten => _+38050XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _+38050XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _+38050XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _+38050XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _+38050XXXXXXX,5,Hangup

;to MTS (066)
exten => _066XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _066XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _066XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _066XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _066XXXXXXX,5,Hangup

exten => _+38066XXXXXXX,1,Dial(Dongle/UMC1/${EXTEN},30,tT)
exten => _+38066XXXXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _+38066XXXXXXX,3,Dial(Dongle/UMC2/${EXTEN},30,tT)
exten => _+38066XXXXXXX,4,GotoIf(${DIALSTATUS} = BUSY,5)
exten => _+38066XXXXXXX,5,Hangup

;to intertelecom (094)
exten => _094XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _094XXXXXXX,n,Hangup

exten => _+38094XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _+38094XXXXXXX,n,Hangup


;==================================intertelecom=====================================
;=========================Телефонный план нумерации Украины=========================
;1
exten => _03[1,2,3,4,5,6,7,8]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _03[1,2,3,4,5,6,7,8]XXXXXXX,n,Hangup

exten => _+3803[1,2,3,4,5,6,7,8]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _+3803[1,2,3,4,5,6,7,8]XXXXXXX,n,Hangup

;2
exten => _04[1,3,4,5,6,7,8]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _04[1,3,4,5,6,7,8]XXXXXXX,n,Hangup

exten => _+3804[1,3,4,5,6,7,8]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _+3804[1,3,4,5,6,7,8]XXXXXXX,n,Hangup

;3
exten => _05[1,2,3,4,5,6,7]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _05[1,2,3,4,5,6,7]XXXXXXX,n,Hangup

exten => _+3805[1,2,3,4,5,6,7]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _+3805[1,2,3,4,5,6,7]XXXXXXX,n,Hangup

;4
exten => _06[1,2,4,5,9]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _06[1,2,4,5,9]XXXXXXX,n,Hangup

exten => _+3806[1,2,4,5,9]XXXXXXX,1,Dial(SIP/intertelecom/${EXTEN},60)
exten => _+3806[1,2,4,5,9]XXXXXXX,n,Hangup

;default to Cherkassy
exten => _[3,4,5,6,7]XXXXX,1,Dial(SIP/intertelecom/0472${EXTEN},30,tT)
exten => _[3,4,5,6,7]XXXXX,2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _[3,4,5,6,7]XXXXX,3,Hangup

;for Intertelecom info
exten => _10[1-4],1,Dial(SIP/intertelecom/0472${EXTEN},30,tT)
exten => _10[1-4],2,GotoIf(${DIALSTATUS} = BUSY,3)
exten => _10[1-4],3,Hangup

;Отправляем в /dev/null
[default]
exten => _X.,1,Hangup

Если у Вас периодически "отваливаются" модемы (меняются местами в /dev), рекомендую лучше создавать екстеншены с указанием по IMEI, например:

exten => _+3806[3,7,8]XXXXXXX,1,Dial(Dongle/i:341617086939491/${EXTEN},30)

или по IMSI (индивидуальный номер абонента), указываем префикс первых пять цифр (25503):
exten => _+3806[3,7,8]XXXXXXX,1,Dial(Dongle/s:25503/${EXTEN},30)

При этом в dongle.conf будет иметь такой вид:
[UMC-1]
;audio=/dev/ttyUSB4             ; tty port for audio connection;        no default value
;data=/dev/ttyUSB5              ; tty port for AT commands;             no default value
context=mts-in-01                         ; Контекст для входящих с GSM шлюз
group=1                             ; Группа звонка
rxgain=0                            ; Увеличение входящей громкости
txgain=0                            ; Увеличение исходящей громкости
autodeletesms=yes                   ; Автоматически удалять входящие смс
resetdatacard=yes                   ; Сбросить модем во время инициализации
u2diag=0                            ; Установить U2DIAG параметр (0 = отключить все кроме функций модема)
usecallingpres=yes                  ; Предоставлять информацию о CallerID или нет
callingpres=allowed_passed_screen   ; Установить СallerID presentation
disablesms=no                      ; chan_datacard в данный момент глючит с приемом SMS. Когда SMS приходит во время звонка
imei=341617086939491

А в CLI увидим лог:

[UMC-1] IMEI 341617086939491 found on data_tty=/dev/ttyUSB5 audio_tty=/dev/ttyUSB4
    -- [UMC-1] Trying to connect on /dev/ttyUSB5...
    -- [UMC-1] Dongle has connected, initializing...
    -- [UMC-1] Dongle initialized and ready

Также добавим набор русских диалогов: http://downloads.asterisk.org/pub/telephony/sounds/releases/asterisk-cor..., которые
распакуем в /usr/local/share/asterisk/sounds/ru.

Для того чтобы небыло проблем с доступом к устройству модема, добавим юзера asterisk в группу dialer:

[root@voip /]#pw groupmod dialer -m asterisk

Отключаем USB хаб и включаем в rc.local

usbconfig -d ugen2.2 set_config 255                                                                                                        
sleep 10                                                                                                                                    
usbconfig -d ugen2.2 set_config 0                                                                                                          
sleep 10                                                                                                                                    
/usr/local/etc/rc.d/asterisk restart

[root@voip ~]# usbconfig list
ugen0.1: <OHCI root HUB nVidia> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
ugen1.1: <OHCI root HUB nVidia> at usbus1, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE
ugen2.1: <EHCI root HUB nVidia> at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen2.2: <USB 2.0 Hub MTT vendor 0x1a40> at usbus2, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=SAVE
ugen2.3: <HUAWEI Mobile HUAWEI Technology> at usbus2, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON
ugen2.4: <HUAWEI Mobile HUAWEI Technology> at usbus2, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON
ugen2.5: <HUAWEI Mobile HUAWEI Technology> at usbus2, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON
ugen2.6: <HUAWEI Mobile HUAWEI Technology> at usbus2, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON

[root@voip-srv /usr/local/etc/rc.d]# ./asterisk start
Starting asterisk.

Проверяем подгрузился ли модуль dongle:
[root@voip ~]# asterisk -r
voip*CLI> module show like chan_dongle
Module                         Description                              Use Count
chan_dongle.so                 Huawei 3G Dongle Channel Driver          1        
1 modules loaded            

Проверим увидел ли Asterisk наши модемы, так же необходимо обратить внимание на уровень сигнала RSSI, если значение будет меньше 10, модемы отвалятся:
voip*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
Kyivstar1    1     Free       19   3    3       UA-KYIVSTAR    E1550      11.608.14.15.311  322052220225221  2550300000000006  +            
Kyivstar2    1     Free       23   0    0       KYIVSTAR       E1550      11.608.14.15.311  322052022692216  255030000000000  Unknown      
UMC1         1     Free       16   3    3       MTS UKR        E1550      11.608.14.15.311  326052220223122  25500000000000  Unknown      
UMC2         1     Free       18   0    0       MTS UKR        E1550    11.608.14.15.311    321212042820262  255000000000000  +380500010001

voip*CLI> sip show peers
Name/username              Host                                    Dyn Forcerport ACL Port     Status    
201/user1                  (Unspecified)                            D                 0        Unmonitored
202/user2                  (Unspecified)                            D                 0        Unmonitored
203/user3                  (Unspecified)                            D                 0        Unmonitored
204/user4                  (Unspecified)                            D                 0        Unmonitored
205/user5                  (Unspecified)                            D                 0        Unmonitored
intertelecom/445878965     XXX.XXX.XXX.XXX                                N             5060     OK (90 ms)
6 sip peers [Monitored: 1 online, 0 offline Unmonitored: 0 online, 5 offline]

voip*CLI> iax2 show peers
Name/Username    Host                 Mask             Port          Status    
210              (null)          (D)  255.255.255.255  0             Unmonitored
211              (null)          (D)  255.255.255.255  0             Unmonitored
2 iax2 peers [0 online, 0 offline, 2 unmonitored]

voip*CLI> sip show users
Username                   Secret           Accountcode      Def.Context      ACL  ForcerPort
205                        12345678                          for-office       No   No        
204                        12345678                          for-office       No   No        
203                        12345678                          for-office       No   No        
202                        12345678                          for-office       No   No        
201                        12345678                          for-office       No   No        
intertelecom               12345678                          it1              No   Yes    

voip*CLI> iax2 show users
Username         Secret                Authen           Def.Context      A/C    Codec Pref
210              12345678        000000000000002  for-office       No     Host
211              12345678             000000000000002  for-office       No     Host

Проверяем регистрацию SIP-транка у провайдера:

voip*CLI>  sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time                
pbx.cdma.ua:5060                        N      445576760          105 Registered           Tue, 30 Apr 2013 07:53:00
1 SIP registrations.
voip*CLI>

voip*CLI> dongle show device state UMC1
-------------- Status -------------
  Device                  : UMC1
  State                   : Free
  Audio                   : /dev/cuaU1.1
  Data                    : /dev/cuaU1.2
  Voice                   : Yes
  SMS                     : Yes
  Manufacturer            : huawei
  Model                   : E1550
  Firmware                : 11.608.12.10.209
  IMEI                    : 111111111111111
  IMSI                    : 111111111111111
  GSM Registration Status : Registered, home network
  RSSI                    : 17, -115 dBm
  Mode                    : GSM/GPRS
  Submode                 : EDGE
  Provider Name           : MTS UKR
  Location area code      : 582
  Cell ID                 : 7AA
  Subscriber Number       : Unknown
  SMS Service Center      : +38050000501
  Use UCS-2 encoding      : Yes
  USSD use 7 bit encoding : Yes
  USSD use UCS-2 decoding : No
  Tasks in queue          : 0
  Commands in queue       : 0
  Call Waiting            : Disabled
  Current device state    : start
  Desired device state    : start
  When change state       : now
  Calls/Channels          : 0
    Active                : 0
    Held                  : 0
    Dialing               : 0
    Alerting              : 0
    Incoming              : 0
    Waiting               : 0
    Releasing             : 0
    Initializing          : 0

Скрипт для перекодировки mp3 в wav для Asterisk:

#!/bin/sh                                                                                                                                  
for i in *.mp3                                                                                                                              
do                                                                                                                                          
        ffmpeg -i $i -acodec pcm_s16le -vol 550 -ar 8000 -ac 1  -y  done/"${i%mp3}wav"                                                      
done

Если Asterisk сообщает "SMS storage is full", необходимо очистить командой:

voip*CLI> dongle cmd datacard0 AT+CMGD=1,4

Так же можно задать номер телефона для сим-карт с номером Unknown:

voip*CLI> dongle cmd KS-1 AT+CPBS=\"ON\"
voip*CLI> dongle cmd KS-1 AT+CPBW=1,\"+38097XXXXXXX\",145

Написал скрипт-подпорку так как модемы иногда виснут, проверка по значению IMSI оператора, если не совпадает - перезагружаем сервер и пишем в лог:

#cat imsi_check.sh
#!/usr/local/bin/bash                                                                                                                      
umc=`/usr/local/sbin/asterisk -rx "dongle show devices" | grep UMC-1 | awk '{print $12}'`                                                  
ks=`/usr/local/sbin/asterisk -rx "dongle show devices" | grep KS-1 | awk '{print $11}'`                                                    
                                                                                                                                           
if                                                                                                                                          
                                                                                                                                           
[ $umc = 255045850618153 ];                                                                                                                
                                                                                                                                           
then                                                                                                                                        
    echo "UMC положительный IMSI"                                                                                                          
else                                                                                                                                        
    echo "UMC-1 restart"                                                                                                                    
    echo "UMC-1 restart: `date`" >> /modem_down.log                                                                                        
    /usr/local/etc/rc.d/asterisk restart                                                                                                    
fi                                                                                                                                          

if                                                                                                                                          
                                                                                                                                           
[ $ks = 255020004216236 ];                                                                                                                  
                                                                                                                                           
then                                                                                                                                        
    echo "KS положительный IMSI"                                                                                                            
else                                                                                                                                        
    echo "KS-1 restart"                                                                                                                    
    echo "KS-1 restart: `date`" >> /modem_down.log                                                                                          
    /usr/local/etc/rc.d/asterisk restart                                                                                                    
fi

Заносим в крон:
*/5     *       *       *       *       root    /imsi_check.sh > /dev/null 2>&1

ЗЫ: Столкнулся с проблемой, если у Вас есть два номера зарегистрированные у одного провайдера с одного IP, то Asterisk путает каналы, решается эта проблема договоренностью с провайдером, чтобы отдавали регистрацию с разных портов или серверов.

Немного полезных команд и кода
Показывает текущие звонки в реальном времени:

core show channels concise

Быстрое добавление 55-ти номеров:

#!/bin/bash
for i in `seq 1 9`;
do
echo "[10$i](HOUSE)"
echo "secret=qwer"
echo "call-limit=5"
echo "callerid=\"Operator\" <30$i>"
echo "mailbox=010$i@voicemailcontext"
echo ""
done

for i in `seq 10 55`;
do
echo "[1$i](HOUSE)"
echo "secret=qwer"
echo "call-limit=5"
echo "callerid=Phone-$i"
echo "mailbox=01$i@voicemailcontext"
echo ""
done

Логирование звонков:

<code>exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,System(echo '${STRFTIME(${EPOCH},,%d-%m-%Y в %H:%M нет ответа от абонента)} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s-CANCEL,1,System(echo '${STRFTIME(${EPOCH},,%d-%m-%Y в %H:%M звонящий абонент повесил трубку)} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s-CHANUNAVAIL,1,System(echo '${STRFTIME(${EPOCH},,%d-%m-%Y в %H:%M абонент недоступен, все телефоны выключены)} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)
exten => s-BUSY,1,System(echo '${STRFTIME(${EPOCH},,%d-%m-%Y в %H:%M абонент занят)} - ${CALLERID(num)}' >> /var/log/asterisk/missed.txt)

Перезапуск GSM модема:

dongle restart now <dongle_name>

Информация о текущих звонках:

core show channels

Ваша оценка: Нет Средняя: 4.6 (42 голосов)

Комментарии:


Подскажите пожалуйста, что делать если у модема e171 нет заветных /dev/cuaU1.1 и /dev/cuaU1.2 ? Есть только /dev/ugen1.2 и всё.
(по интернету много свидетельств, что e171 на моей прошивке нормально работают)
FreeBSD10.3, chan_dongle для 13 версии астериска.



Возможно вы не перевели модем в режим "Только модем", у вас должен поменяться id устройства.



Отличная статья! У меня проблема: при звонке на 1 модем идет переадресация и внешний звонок через 2 донгл, т.е. 2 модема работают одновременно. При этом, разговор заикается, что затрудняет общение. Кто нибудь сталкивался с этой проблемой.



Статья просто бімба!!!



по поводу этого:
"ЗЫ: Столкнулся с проблемой, если у Вас есть два номера зарегистрированные у одного провайдера с одного IP, то Asterisk путает каналы, решается эта проблема договоренностью с провайдером, чтобы отдавали регистрацию с разных портов или серверов."
можно подробнее?
у меня VEGA и два номера на одном астере. работает только тот, что первым зарегистрировался с порта 5060



Они регистрируются и работают оба, но вся проблема в том,что не получается разделить 2 транка по отдельным контекстам. Вроде тут есть решение http://asterisk-support.ru/question/15552/2-trunka-ne-razdeliaiutsia-po-...



в sip коннекте к интертелекому добавьте
fromuser=472383280
defaultuser=472383280

иначе в ответ будете получать
handle_response_invite: Received response: "Forbidden" from



Спасибо, за Ваш труд очень полезная статья.
Подскажите, а как сделать так чтобы оператор связи не блокировал SIM карты в Huawei E1550?

У меня больше чем 60 минут трафика через данную связку не получалось получить. Карту блокируют, и оператор говорит что карта блокирована системой безопасности автоматически (говорят что есть вероятность, что я перемаршрутизирую звонок). Скажите как вы решаете эту проблему? Я думаю для многих это будет интересно.



Добрый день. У меня эта проблема возникла только с одним опреатором имя ему - Life. Блокируют без уведомления, на вопрос за что? Говорят, что тарифный план для физ. лиц не имеем права использовать в корпоративных целях, переходите мол на более дорогой для бизнес клиентов, я просто выкидываю симку и ставлю новую на месяца 3-6 хватает, благо он у меня только на исходящие вызовы.



Похвал тут мало! Статя супер!



Спасибо



Примите искреннюю благодарность!