Установка и настройка VoIP сервера Asterisk-1.8.20
В этой заметке хочу расказать о настройке сервера IP-телефонии для интернет-магазина.
На входе имеем:
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-ре:
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:
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 /usr/ports/net/asterisk]# make config
[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
Далее необходимо отредактировать основные конфигурационные файлы сервера:
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 (метод установки может отличаться):
cd chan_dongle-1.1.r14
./configure
gmake install
cp etc/dongle.conf /usr/local/etc/asterisk/
Для консоли Asterisk, приведу некоторые полезные команды:
CLI>module unload chan_dongle.so
CLI>module reload chan_dongle.so
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 приходит во время звонка
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.
auth=md5
secret=12345678
context=for-office
type=friend
host=dynamic
[211]
auth=md5
secret=12345678
context=for-office
type=friend
host=dynamic
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, например:
или по IMSI (индивидуальный номер абонента), указываем префикс первых пять цифр (25503):
При этом в dongle.conf будет иметь такой вид:
;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] 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:
Отключаем USB хаб и включаем в rc.local
sleep 10
usbconfig -d ugen2.2 set_config 0
sleep 10
/usr/local/etc/rc.d/asterisk restart
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
Starting asterisk.
Проверяем подгрузился ли модуль dongle:
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, модемы отвалятся:
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
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]
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]
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
Username Secret Authen Def.Context A/C Codec Pref
210 12345678 000000000000002 for-office No Host
211 12345678 000000000000002 for-office No Host
Проверяем регистрацию SIP-транка у провайдера:
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>
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:
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", необходимо очистить командой:
Так же можно задать номер телефона для сим-карт с номером Unknown:
voip*CLI> dongle cmd KS-1 AT+CPBW=1,\"+38097XXXXXXX\",145
Написал скрипт-подпорку так как модемы иногда виснут, проверка по значению IMSI оператора, если не совпадает - перезагружаем сервер и пишем в лог:
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
Заносим в крон:
ЗЫ: Столкнулся с проблемой, если у Вас есть два номера зарегистрированные у одного провайдера с одного IP, то Asterisk путает каналы, решается эта проблема договоренностью с провайдером, чтобы отдавали регистрацию с разных портов или серверов.
Немного полезных команд и кода
Показывает текущие звонки в реальном времени:
Быстрое добавление 55-ти номеров:
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
Логирование звонков:
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 модема:
Информация о текущих звонках:
- Войдите на сайт для отправки комментариев
- Версия для печати
Подскажите пожалуйста, что делать если у модема 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 хватает, благо он у меня только на исходящие вызовы.
Похвал тут мало! Статя супер!
Спасибо
Примите искреннюю благодарность!