Настройка SIP Trunk в Asterisk от Укртелеком

Приведу пример настройки SIP Trunk в Asterisk, то есть Asterisk будет в роли SIP клиента.
От провайдера Укртелеком получены данные: номер, пароль и адрес сервера телефонии (sip.ukrtel.net).
SIP номер брался чтобы сделать многоканальность не обычном городском номере, путем переадресации в случае занятости линии.
Настраивать буду на Linux сервере с реальным IP без использования NAT.

Сначала пропишем в файле /etc/asterisk/sip.conf, в секции [general] строку регистрации SIP:

register => НОМЕР:ПАРОЛЬ@sip.ukrtel.net

Далее, пропишем контекст для SIP в sip.conf или users.conf, я предпочитаю прописывать транки в users.conf, в sip.conf пишу только свои SIP номера:

[ukrtelecom1]
secret=ПАРОЛЬ
remotesecret=ПАРОЛЬ
defaultuser=НОМЕР
trunkname=ukrtelecom1
host=sip.ukrtel.net
context=from-ukrtelecom1
insecure=invite
fromuser=НОМЕР
fromdomain=sip.ukrtel.net
type=peer
disallow=all
allow=alaw
allow=ulaw
allow=g729
nat=no
canreinvite=nonat
dtmfmode=rfc2833
qualifyfreq=30

В /etc/asterisk/extensions.conf пропишем контекст для входящих звонков:

[from-ukrtelecom1]
exten => s,1,DIAL(SIP/205,60)
exten => s,n,Hangup()

Приведу пример шаблона исходящих звонков:

exten => _380892XXXXXX,1,Dial(SIP/ukrtelecom1/${EXTEN},60)
exten => _097XXXXXXX,1,Dial(SIP/ukrtelecom1/${EXTEN},60)
exten => _095XXXXXXX,1,Dial(SIP/ukrtelecom1/${EXTEN},60)
и т.д.

Зарегистрировался ли SIP Укртелекома можно посмотреть в консоли Asterisk:

asterisk -rvv
sip show peers
quit

Все довольно просто.

Настройка GOIP4 c asterisk

На тесте настрою в качестве транка китайский GSM GOIP4 шлюз c Asterisk севрером.

Вставим SIM-карты с выключенным запросом PIN-кода.

Зайдем в веб-интерфейс GOIP4 шлюза, его стандартный IP — 192.168.8.1 при подключении к порту PC, логин и пароль одинаковы — admin.
Еще есть аккаунты с ограниченными возможностями user и sms.

В ConfigurationsPreferences укажем часовой пояс, у меня Time Zone: GMT+2 и отключим IVR.

В ConfigurationsNetwork пропишем нужный статический IP адрес для LAN порта, стандартно он получается по DHCP.

В ToolsChange Password сменим пароли для пользователей.
Кстати при подключении по telnet используется имя пользователя limitsh и пароль который указан в веб-интерфейсе пользователю admin.

Теперь в asterisk, в конфигурационном файле users.conf добавим SIP транк, например:

[goip4]
type=peer
usecallerid = yes
hidecallerid=no
host=192.168.50.50
context=goip4

Приступим к настройке GSM каналов в GOIP4 шлюзе.
Пропишем параметры SIP транка:
В ConfigurationsBasic VoIPConfig Mode выберем «Trunk Gateway Mode«.
В SIP Trunk Gateway1 укажем IP-адрес asterisk сервера.
Остальные поля оставим как есть пустыми, в Re-register Period (s) стандартно 0.
В самом низу для первого канала где «Line 1 Routing Prefix» укажем 1, для второго 2, третьего 3 и 4 для четвертого.
Жмем Save Changes для сохранения изменений.

Настроим правила для входящих GSM звонков.
В ConfigurationsCall In укажем CID Forward Mode: «Use CID as SIP Caller ID».
Для каждого канала укажем Forwarding to VoIP Number: goip4, Dial Plan: 1 для первого, для второго 2, третьего 3 и 4 для четвертого.
Жмем Save Changes для сохранения изменений.

Настроим исходящие в ConfigurationsCall Out.
GSM Auto Redial: Disable
GSM Dial Timeout(s): 30
Call OUT via GSM: Enable
Dial Plan: 1:-1 (для первого канала), 2:-2 (для второго) и т.д.

В Tools — Send USSD можно отправлять USSD запросы, например проверить состояние счета и т.д.
В Send SMS, SMS InBox и SMS OutBox отправить СМС, посмотреть входящие и исходящие соответственно.

Перезапустим Asterisk, перейдем в консоль и посмотрим активен ли транк goip4:

sudo service asterisk restart
asterisk -rvv
sip show peers
quit

Теперь настроим план набора номеров в файле /etc/asterisk/extensions.conf.
Добавим контекст goip4 отвечающий за входящие звонки (в моем случае при поступлении звонка на любую из SIM — идет вызов одновременно на SIP телефон 204 и 203, потом если нет ответа на 201):

[goip4]
exten => goip4,1,Dial(SIP/204&SIP/203,19)
exten => goip4,2,Dial(SIP/201,19)
exten => goip4,3,Hangup()

К существующему контексту SIP телефонов добавим план набора исходящих (как видно в 1 канале у меня Киевстар, во втором Мегафон, в третьем Lifecell):

;KYIVSTAR
exten => _067XXXXXXX,1,Dial(SIP/goip4/1${EXTEN},60)
exten => _068XXXXXXX,1,Dial(SIP/goip4/1${EXTEN},60)
exten => _096XXXXXXX,1,Dial(SIP/goip4/1${EXTEN},60)
exten => _097XXXXXXX,1,Dial(SIP/goip4/1${EXTEN},60)
exten => _098XXXXXXX,1,Dial(SIP/goip4/1${EXTEN},60)
;Megafon
exten => _095XXXXXXX,1,Dial(SIP/goip4/2${EXTEN},60)
exten => _099XXXXXXX,1,Dial(SIP/goip4/2${EXTEN},60)
exten => _050XXXXXXX,1,Dial(SIP/goip4/2${EXTEN},60)
exten => _066XXXXXXX,1,Dial(SIP/goip4/2${EXTEN},60)
;Lifecell
exten => _073XXXXXXX,1,Dial(SIP/goip4/3${EXTEN},60)
exten => _093XXXXXXX,1,Dial(SIP/goip4/3${EXTEN},60)
exten => _063XXXXXXX,1,Dial(SIP/goip4/3${EXTEN},60)

Кстати отправлять СМС через GoIP4 можно GET запросом, например (где admin и admin — пользователь и пароль, 1 — номер канала с которого слать, потом номер телефона получателя и текст СМС):

http://192.168.1.5/default/en_US/send.html?u=admin&p=admin&l=1&n=телефон&m=текст

Перезагрузить из Linux можно через wget:

sudo wget --user=admin --password=admin --auth-no-challenge http://192.168.1.5/default/en_US/reboot.html -O /dev/nulll

Отправить СМС:

wget --user=admin --password=admin --auth-no-challenge --post-data 'line=1&smskey=0000000e&action=SMS&telnum=НОМЕР&smscontent=ТЕКСТ&send=Send' http://192.168.1.5/default/en_US/sms_info.html -O /dev/null

Для просмотра статуса доставки СМС и USSD ответов:

http://192.168.1.5/default/en_US/send_status.xml?u=admin&p=admin

Уровень сигнала можно увидеть во вкладке Status — колонка RSSI (0 — плохой, это -133dBm; 1 это -111 dBm; 31 — максимальный, это -51dBm или лучше; 99 — нет сигнала).

Частые сообщения «Remote UNIX connection» в Asterisk

Заметил однажды в консоли Asterisk, что часто отображаются следующие сообщения:

— Remote UNIX connection
— Remote UNIX connection disconnected
— Remote UNIX connection
— Remote UNIX connection disconnected
— Remote UNIX connection
— Remote UNIX connection disconnected

Сообщение уведомляет что кто-то подключается к консоли Astersik.
Эти сообщения видны если консоль открыта в режиме отладки выше уровня -rvv (то есть, если например запустить astersik -rvvv, чем больше букв v тем больше подробной информации в консоли отображается).

Причиной этих сообщений в моем случае был Zabbix, который мониторил различную статистику как я описывал в этой статье — Мониторинг Asterisk в Zabbix

То есть он выполнял команды подобно этой и получал таким образом информацию:

asterisk -rx "database show" | grep Registry | wc -l

Аналогичным образов могут быть другие скрипты или возможно просто кто-то подключается.

Решение ошибки «Unable to create channel of type ‘SIP’ (cause 20 — Subscriber absent)»

Заметил однажды при звонках в консоли Asterisk следующую ошибку:

dial_exec_full: Unable to create channel of type ‘SIP’ (cause 20 — Subscriber absent)

В контексте диалплана у меня выполняется звонок одновременно на два телефона:

exten => s,5,DIAL(SIP/204&SIP/203,19)

Иногда один из IP-телефонов выключен, в связи с чем и возникает эта ошибка, сообщающая что абонент отсутствует.
Для решения нужно просто включить IP-телефон.

Можно посмотреть информацию о SIP в консоли Asterisk:

asterisk -rvv
sip show peers
sip show peer НОМЕР
quit

Если вместо IP-адреса клиента отображается null, а expire равно -1, то SIP клиент не в сети:

Expire: -1
Addr->IP: (null)

Настройка Asterisk CDR и Asterisk CDR Viewer

CDR (Call Data Record), позволяет в MySQL базе данных вести статистику активности звонков.

На тесте настрою Asterisk CDR и Asterisk CDR Viewer в Ubuntu Server.
Предположим что Asterisk уже установлен.

Сначала установим необходимые компоненты:

sudo apt-get install mysql-server php5-mysql apache2 git
sudo service apache2 restart

Приступим к созданию базы данных в которую будут сохранятся записи о звонках.
Подключимся к MySQL:

mysql -u root -p

Создадим базу данных:

CREATE DATABASE asteriskcdrdb;

Создадим пользователя asteriskcdr:

GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO  asteriskcdr@localhost  IDENTIFIED BY 'ПАРОЛЬ';
flush privileges;

Переключимся на базу asteriskcdrdb:

use asteriskcdrdb;

И создадим таблицу:

CREATE TABLE cdr (
   calldate datetime NOT NULL default '0000-00-00 00:00:00',
   clid varchar(80) NOT NULL default '',
   src varchar(80) NOT NULL default '',
   dst varchar(80) NOT NULL default '',
   dcontext varchar(80) NOT NULL default '',
   channel varchar(80) NOT NULL default '',
   dstchannel varchar(80) NOT NULL default '',
   lastapp varchar(80) NOT NULL default '',
   lastdata varchar(80) NOT NULL default '',
   duration int(11) NOT NULL default '0',
   billsec int(11) NOT NULL default '0',
   disposition varchar(45) NOT NULL default '',
   amaflags int(11) NOT NULL default '0',
   accountcode varchar(20) NOT NULL default '',
   uniqueid varchar(32) NOT NULL default '',
   userfield varchar(255) NOT NULL default '',
   did varchar(50) NOT NULL default '',
   recordingfile varchar(255) NOT NULL default '',
   KEY `calldate` (`calldate`),
   KEY `dst` (`dst`),
   KEY `accountcode` (`accountcode`),
   KEY `uniqueid` (`uniqueid`)
);

На этом создание базы завершено, теперь перейдем к настройке конфигурационного файла /etc/asterisk/cdr_mysql.conf, стандартно все строки в нем закомментированы.
Раскомментируем и укажем параметры для подключения к mysql базе в секции [global]:

[global]
hostname=localhost
dbname=asteriskcdrdb
table=cdr
password=ПАРОЛЬ
user=asteriskcdr

В файле конфигурации модулей /etc/asterisk/modules.conf должен быть прописан на загрузку модуль cdr_mysql.so:

load => cdr_mysql.so

Вручную из консоли asterisk его можно загрузить так:

sudo asterisk -rvv
module load cdr_mysql.so
module show like cdr_mysql.so

После загрузки модуля при поступлении звонков должны заносится данные в базу, посмотрим есть ли что-то:

mysql -u root -p
use asteriskcdrdb;
select * from cdr;

По сути теперь можно использовать данные из базы любым удобным способом, например дописать к какому нибудь биллингу скрипты статистики и графиков.
Мы же настроим готовый Asterisk CDR Viewer.
Скачаем файлы и переместим в директорию веб-сервера:

cd /tmp/
git clone https://github.com/g613/asterisk-cdr-viewer/
cd asterisk-cdr-viewer
tar -xzvf asterisk-cdr-viewer-latest.tgz
mv asterisk-cdr-viewer /var/www/asterisk-cdr-viewer
chown -R www-data:www-data /var/www/

Русскую версию можно найти тут https://github.com/prog-it/Asterisk-CDR-Viewer-Mod

Скопируем файл с веб-конфигурацией в директорию с веб-сервером apache2:

cp /var/www/asterisk-cdr-viewer/contrib/httpd/asterisk-cdr-viewer.conf /etc/apache2/conf-enabled/asterisk-cdr-viewer.conf
service apache2 restart

Укажем настройки подключения к базе данных для Asterisk-CDR-viewer в файле /var/www/asterisk-cdr-viewer/include/config.inc.php

После чего уже можно будет просматривать статистику открыв в браузере http://СЕРВЕР/acdr

В версии 1.0.9 заметил опечатку в коде, из-за которой отображался белый экран а в логах была ошибка:

PHP Parse error: syntax error, unexpected ‘[‘ in /var/www/asterisk-cdr-viewer/index.php on line 23

Для исправления откроем файл index.php и в конце 23 строки увидим пропущенный символ $:

$startmonth = is_blank($_REQUEST['startmonth']) ? date('m') : printf('%02d',_REQUEST['startmonth']);

Должно быть так:

$startmonth = is_blank($_REQUEST['startmonth']) ? date('m') : printf('%02d',$_REQUEST['startmonth']);

Все.

Настройка FSK в Asterisk для определения номеров

Чтобы определялся номер, с аналоговых линий, нужно в контексте для транка каждого канала Dahdi указать:

usecallerid = yes
hidecallerid=no
cidstart = ring
cidsignalling = bell
callerid = asreceived

asreceived — означает что номер нужно передавать в виде, в каком он есть.
Я использовал китайскую плату TDM410P.
Также необходимо подать заявку оператору телефонной связи чтобы они включили не старый АОН, а CallerID, то есть FSK (Bellcore).
Я написал сообщение в техническую поддержку на сайта Укртелеком, и на следующий день на стационарный телефон перезвонил местный инженер.
Мы были подключены к АТС SI 3000, спустя еще день с нескольких попыток нам все же включили FSK и номера начали определяться еще до снятия трубки, мобильные, стационарные и т.д., хотя иногда бывали случаи что номер был не определен.

Если у провайдера телефонной связи не включен FSK, то в консоли Asterisk при звонках можно увидеть ошибки:

WARNING[21790][C-00000000]: chan_dahdi.c:1842 my_get_callerid: Failed to decode CallerID
ERROR[21790][C-00000000]: callerid.c:566 callerid_feed: No start bit found in fsk data.

Записать для анализа звук с канала телефонной линии можно командой:

dahdi_monitor 1 -v -r streamrx.wav

Также можно включить(on)/отключить(off) режим отладки звонков открыв консоль Asterisk и набрав команду:

sudo asterisk -rvvvvvv
sip set debug on
sip set debug off

Сгенерированный /etc/asterisk/dahdi-channels.conf я оставил без изменений (на всякий случай приведу его содержимое):

; Span 1: WCTDM/0 "Wildcard TDM410P" (MASTER)
;;; line="1 WCTDM/0/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default

;;; line="2 WCTDM/0/1 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 2
callerid=
group=
context=default

;;; line="3 WCTDM/0/2 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 3
callerid=
group=
context=default

;;; line="4 WCTDM/0/3 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 4
callerid=
group=
context=default

Увеличение громкости звонков в Asterisk

Чтобы увеличить громкость разговора при звонках, необходимо в файле /etc/asterisk/extensions.conf, в начале каждого диалплана добавить пару строк (на которых нужно увеличить громкость):

exten => X.,1,Set(VOLUME(TX)=5)
exten => X.,n,Set(VOLUME(RX)=5)

Минимальное значение 0, а максимальное 10.

Если используется Dahdi, то можно усилить громкость на плате прописав в /etc/asterisk/chan_dahdi.conf или в контексте нужного транка:

rxgain=2.0
txgain=2.0

Тут стандартное значение 0.0, а максимальное 6.0, где rx (receive) — входящая громкость, tx (transmit) — исходящая от Asterisk.