Добавление SIP клиента во FreePBX

Чтобы добавить SIP клиента во FreePBX, откроем меню «Applications» — «Extensions«, выберем например «Generic CHAN SIP Device» и укажем основные параметры:

User Extension: 6000 (номер SIP)
Display Name: Operator (любое имя для отображения)
Secret: ПАРОЛЬ
и нажмем «Submit«.

Все, SIP добавлен, по указанному номеру и паролю он может уже регистрироваться.

Как добавить SIP в конфигурационном файле я описывал в этой статье — Добавление SIP клиентов в Asterisk

Установка и настройка GoIP СМС-сервера

На примере настрою GoIP СМС-сервер в Ubuntu Server 14.04 LTS x64.
Переключимся сразу на root пользователя:

sudo -i

Обновим систему и установим веб-сервер и mysql сервер:

apt-get update
apt-get upgrade
apt-get install apache2 php5 mysql-server

Скачаем во временную директорию архив с goip смс-сервером и запустим скрипт установки:

cd /tmp
wget http://www.hybervoice.com/update/goip_install-v1.23.tar.gz
tar xvfz goip_install-v1.23.tar.gz
cd goip_install
./goip_install.sh

Во время установки ответим на несколько вопросов:
1) Расположение директории с конфигурацией веб-серера (создастся файл с веб настройками), в моем случае это /etc/apache2/conf-enabled
2) Пароль root пользователя к Mysql серверу (создастся база goip)
3) Расположение Mysql, стандартно оно так и есть /usr/bin/mysql, просто жмем Enter

Перезапустим веб-сервер чтоб загрузился файл с настройками из /etc/apache2/conf-enabled:

service apache2 restart

В браузере уже можно открыть панель управления смс-сервером http://сервер/goip
У меня отобразилась ошибка:

Forbidden
You don’t have permission to access /goip on this server.

Причиной этому устаревшие параметры в /etc/apache2/conf-enabled/goip.conf, закомментируем две строки символом # и добавим строку после них:

#    Order allow,deny
#    Allow from all
Require all granted

После этого все открылось, стандартный логин и пароль root.

Приступим к настройке.
В «System Manage» — «Provider Manage» добавим провайдера, для этого укажем в Provider(1) его имя или просто номер самими цифрами.

Теперь перейдем в «System Manage» — «GoIP Manage«, вверху нажмем «Add GoIP» и добавим аккаунт для первого канала GoIP шлюза (первой сим).
ID:ks1
Batch Lines:1
Provider:созданный провайдер
Password:пароль
Confirm Password:пароль

Откроем веб-интерфейс GoIP шлюза и перейдем в «Configurations» — «SMS» где укажем параметры этого аккаунта.
SMS Server:Enable
SMS Server IP: адрес СМС-сервера
SMS Server Port:44444
SMS Client ID: ks1
Password: пароль
Send SMSC Number: Enable

После этого в СМС-сервере «System Manage» — «GoIP Manage» должен отобразится статус «Login«.

Если статус Login не появляется, у меня так было на Ubuntu Server 14.04 LTS x64 и замечал сообщение:

but cannot get response from process named «goipcron»

Для решения этой проблемы пришлось доставить библиотеки:

cd /etc/apt/sources.list.d
echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs
ln -s /var/run/mysqld/mysqld.sock /var/lib/mysql/mysql.sock

И наново запустить goipcron:

cd /usr/local/goip
./run_goipcron

На сервере в случае проблем с соединением можно ловить пакеты через tcpdump например так:

tcpdump -i any -vnn -s0 port 44444

Сервер может принимать POST и GET запросы, приведу пример отправки СМС (номеров получателей можно указать несколько через запятую без пробелов):

http://192.168.1.21/goip/en/dosend.php?USERNAME=логин&PASSWORD=пароль&smsprovider=1&goipname=ks1&smsnum=номерполучателя&method=2&Memo=текст сообщения

Входящие СМС можно увидеть в Send Message — Inbox, исходящие в Send Message — Examine Sendings.
Чтобы не писалась статистика звонков (у меня ее пишет Asterisk), в System ManageSystem Manage поставим Disable напротив GoIP Report Record, а также поставим Disable на Save message before sending(browser should support javascript) чтобы не использовать java со стороны клиента при отправке СМС через API.

Настройка 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']);

Все.