Asterisk + MySQL + RealTime SIP/Extensions/Voicemail

Итак, настраиваем связку Asterisk и MySQL + RealTime SIP/Extensions/Voicemail

Плюсы — не нужно править конфиги для управления пользователями, все данные хранятся в базе и подцепляются сразу после добавления в базу.
Простенький самописный фейс решил для меня вообще все проблемы

Начинаем с того, что обновляем порты, после этого идем в порты и ставим сам asterisk:

asterisk# cd /usr/ports/net/asterisk16
asterisk# make install clean

при конфигурировании указываем устанавливать sample’сы

после окончания установки идем ставить addon’ы, т.к. в стандартной поставке asterisk не поддерживает MySQL:

asterisk# cd /usr/ports/net/asterisk16-addons
asterisk# make install clean

а теперь можно и поправить конфиги.

asterisk# cd /usr/local/etc/asterisk

 

для начала установим уровень отладки и вывода информации в консоль, в файле asterisk.conf:

[options]
; уровень вывода в консоль
verbose = 64
; уровень дебага
debug = 64
; параметры установлены по умолчанию и менять не советую :)
[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6

 

теперь настроим доступ к базе данных в файле res_mysql.conf:

[general]
dbhost = 127.0.0.1
dbname = asterisk
dbuser = <имя пользователя>
dbpass = <евоный пароль>
dbport = 3306

дальше правим extconfig.conf, указываем что хранить в БД и где, формат строки очень прост:

семейство => <драйвер БД>,<имя БД>,<имя таблицы с данными>

[settings]
sipusers => mysql,asterisk,sipusers
sippeers => mysql,asterisk,sipusers
voicemail => mysql,asterisk,voicemail
extensions => mysql,asterisk,extensions

таким образом у меня в БД всего 3 таблицы. полный список семейств, поддерживающих realtime можно почитать закомментированных строках extconfig.conf, а именно:

;iaxusers => odbc,asterisk
;iaxpeers => odbc,asterisk
;sipregs => odbc,asterisk
;meetme => mysql,conferences
;queues => odbc,asterisk
;queue_members => odbc,asterisk
;musiconhold => mysql,asterisk
;queue_log => mysql,aasterisk

кроме тех, что используются у меня

теперь укажем какие именно диалпланы брать из БД, extensions.conf:

[general]
static = no; параметр сохранения диалплана, не до конца понял что это...
writeprotect = no; Если writeprotect=no и static=yes, тогда вы можете сохранить текущий Диалплан CLI-командой "save dialplan"
autofallthrough = yes; если да, то при завершении проверок системой вызов
; будет завершен со статусом звонка (DIALSTATUS) BUSY
; или HANGUP или т.п., иначе астериск будет ждать набора
; нового exten'а
; стоит сказать, что exten (расширение) для астериска не есть
; нечто расширяющее его возможности, это всего лишь
; телефонный номер
clearglobalvars = no; не реинициализировать глобальные переменные астериска
; при перезагрузке
priorityjumping = no; параметр запрещающий приложениям, поддерживающим
; "перепрыгивание" по приоритетам, делать это

; а вот и глобальные переменные
[globals]
; у меня есть и статичные диалпланы и тут я объявил параметры подключения к бд,
; чтобы постоянно не писать их в диалпланах
DBHOST=127.0.0.1
DBUSER=asterisk
DBPASS=<имя пользователя>
DBNAME=<евоный пароль>

; диалплан "завод"
[factory]
; а следующая строка указывает, что нужно смотреть в базу данных
switch => Realtime/@

 

Дальше правим sip.conf:

[general]
context=factory ; контекст по умолчанию для входящих звонков
realm=asterisk.zrto.int ; я пишу просто hostname
bindport=5060 ; порт UDP который "слушает" asterisk
bindaddr=0.0.0.0 ; интерфейс который "слушает" asterisk, если 0.0.0.0 - то слушаются
; все интерфейсы

srvlookup=yes ; разблокирует поиск DNS SRV по исходящим звонкам
language=ru ; язык для голосовых сообщений
disallow=all ; запрещаем всем все кодеки
; всем - потому что для каждого конкретного sip-аккаунта можно
; запретить и разрешить что угодно, а в разделе general хранятся
; глобальные настройки
; дальше кодеки, которые разрешаем всем по умолчанию
allow=ulaw
allow=alaw
allow=gsm

type=friend ; тип по умолчанию для всех
; user - разрешены исходящие звонки
; peer - разрешены входящие звонки
; friend - разрешены и входящие, и исходящие звонки
rtcachefriends = yes ; этот и следующий параметры нужны для realtime
; они заставляют asterisk кэшировать данные о "друзьях"
; и команда sip show peers будет нормально отображать
; всех зарегистрированных realtime клиентов
rtcache=yes

; дальше опять же параметры базы данных
; в принципе в версиях старше 1.2 указывать их в файле sip.conf
; не обязательно, но я пишу по привычке :)
localnet=192.168.0.0/255.255.0.0
dbhost = 127.0.0.1
dbname = asterisk
dbuser = <имя пользователя>
dbpass = <евоный пароль>
dbport = 3306

 

теперь
создаем базу данных:

CREATE DATABASE asterisk;
GRANT ALL PRIVILEGES ON asterisk.* TO '<имя пользователя>'@'localhost' IDENTIFIED BY '<евоный пароль>';
USE asterisk;
-- ----------------------------
-- Table structure for extensions
-- ----------------------------
DROP TABLE IF EXISTS extensions;
CREATE TABLE extensions (
id int(11) NOT NULL AUTO_INCREMENT,
context varchar(20) NOT NULL DEFAULT '',
exten varchar(20) NOT NULL DEFAULT '',
priority tinyint(4) NOT NULL DEFAULT '0',
app varchar(20) NOT NULL DEFAULT '',
appdata varchar(128) NOT NULL DEFAULT '',
KEY id (id)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251;

-- ----------------------------
-- Table structure for sipusers
-- ----------------------------
DROP TABLE IF EXISTS sipusers;
CREATE TABLE sipusers (
id int(11) NOT NULL AUTO_INCREMENT,
accountcode varchar(20) DEFAULT NULL,
disallow varchar(100) DEFAULT 'all',
allow varchar(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw',
allowoverlap enum('yes','no') DEFAULT 'yes',
allowsubscribe enum('yes','no') DEFAULT 'yes',
allowtransfer varchar(3) DEFAULT NULL,
amaflags varchar(13) DEFAULT NULL,
autoframing varchar(3) DEFAULT NULL,
auth varchar(40) DEFAULT NULL,
buggymwi enum('yes','no') DEFAULT 'no',
callgroup varchar(10) DEFAULT NULL,
callerid varchar(80) DEFAULT NULL,
cid_number varchar(40) DEFAULT NULL,
fullname varchar(40) DEFAULT NULL,
call-limit int(8) DEFAULT '0',
callingpres varchar(80) DEFAULT NULL,
canreinvite char(6) DEFAULT 'yes',
context varchar(80) DEFAULT NULL,
defaultip varchar(15) DEFAULT NULL,
dtmfmode varchar(7) DEFAULT NULL,
fromuser varchar(80) DEFAULT NULL,
fromdomain varchar(80) DEFAULT NULL,
fullcontact varchar(80) DEFAULT NULL,
g726nonstandard enum('yes','no') DEFAULT 'no',
host varchar(31) NOT NULL DEFAULT 'dynamic',
insecure varchar(20) DEFAULT NULL,
ipaddr varchar(15) NOT NULL DEFAULT '',
language char(2) DEFAULT NULL,
lastms varchar(20) DEFAULT NULL,
mailbox varchar(50) DEFAULT NULL,
maxcallbitrate int(8) DEFAULT '384',
mohsuggest varchar(80) DEFAULT NULL,
md5secret varchar(80) DEFAULT NULL,
musiconhold varchar(100) DEFAULT NULL,
name varchar(80) NOT NULL DEFAULT '',
nat varchar(5) NOT NULL DEFAULT 'no',
outboundproxy varchar(80) DEFAULT NULL,
deny varchar(95) DEFAULT NULL,
permit varchar(95) DEFAULT NULL,
pickupgroup varchar(10) DEFAULT NULL,
port varchar(5) NOT NULL DEFAULT '',
progressinband enum('yes','no','never') DEFAULT 'no',
promiscredir enum('yes','no') DEFAULT 'no',
qualify char(3) DEFAULT NULL,
regexten varchar(80) NOT NULL DEFAULT '',
regseconds int(11) NOT NULL DEFAULT '0',
rfc2833compensate enum('yes','no') DEFAULT 'no',
rtptimeout char(3) DEFAULT NULL,
rtpholdtimeout char(3) DEFAULT NULL,
secret varchar(80) DEFAULT NULL,
sendrpid enum('yes','no') DEFAULT 'yes',
setvar varchar(100) NOT NULL DEFAULT '',
subscribecontext varchar(80) DEFAULT NULL,
subscribemwi varchar(3) DEFAULT NULL,
t38pt_udptl enum('yes','no') DEFAULT 'no',
trustrpid enum('yes','no') DEFAULT 'no',
type varchar(6) NOT NULL DEFAULT 'friend',
useclientcode enum('yes','no') DEFAULT 'no',
username varchar(80) NOT NULL DEFAULT '',
usereqphone varchar(3) NOT NULL DEFAULT 'no',
videosupport enum('yes','no') DEFAULT 'yes',
vmexten varchar(80) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY name (name),
KEY name_2 (name)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 ROW_FORMAT=DYNAMIC;

-- ----------------------------
-- Table structure for voicemail
-- ----------------------------
DROP TABLE IF EXISTS voicemail;
CREATE TABLE voicemail (
uniqueid int(11) NOT NULL AUTO_INCREMENT,
customer_id int(11) NOT NULL DEFAULT '0',
context varchar(50) NOT NULL DEFAULT '',
mailbox int(5) NOT NULL DEFAULT '0',
password varchar(4) NOT NULL DEFAULT '0',
fullname varchar(50) NOT NULL DEFAULT '',
email varchar(50) NOT NULL DEFAULT '',
pager varchar(50) NOT NULL DEFAULT '',
stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
attach varchar(3) NOT NULL DEFAULT 'no',
saycid varchar(3) NOT NULL DEFAULT 'yes',
hidefromdir varchar(3) NOT NULL DEFAULT 'no',
PRIMARY KEY (uniqueid),
KEY mailbox_context (mailbox,context)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO extensions VALUES ('1', 'factory', '_XXXXXXX', '1', 'NoOp', '');
INSERT INTO sipusers VALUES ('1', null, 'all', 'g729;ilbc;gsm;ulaw;alaw', 'yes', 'yes', null, null, null, null, 'no', null, null, null, null, '0', null, 'yes', null, null, null, null, null, null, 'no', 'dynamic', null, '', 'en', '0', null, '384', null, null, null, 'neo', 'no', null, null, null, null, '', 'no', 'no', null, '1000001', '0', 'no', null, null, 'password', 'yes', '', null, null, 'no', 'no', 'friend', 'no', '', 'no', 'yes', null); 

в последней строке для сипа указаны разрешенные кодеки через символ «;», это тоже самое, что указать в файле sip.conf:

allow=g729
allow=ilbc
allow=gsm
allow=ulaw
allow=alaw

 

 

ну вот и все, запускаем asterisk и коннектимся к нему консольно:

asterisk# asterisk
Parsing /usr/local/etc/asterisk/extconfig.conf
asterisk# asterisk -r
Asterisk 1.6.0.15, Copyright (C) 1999 - 2009 Digium, Inc. and others.
Created by Mark Spencer
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
== Parsing '/usr/local/etc/asterisk/extconfig.conf': Parsing /usr/local/etc/asterisk/extconfig.conf
== Found
== Binding sipusers to mysql/asterisk/sipusers
== Binding sippeers to mysql/asterisk/sipusers
== Binding voicemail to mysql/asterisk/voicemail
== Binding extensions to mysql/asterisk/extensions
Connected to Asterisk 1.6.0.15 currently running on asterisk (pid = 48637)
Verbosity is at least 64
Core debug is at least 64
asterisk*CLI>

как видим уровень вывода и дебага сразу установлен в значения указанные в настройках

регистрируемся любым ip-телефоном, в консоли при регистрации видим нечто наподобие:

-- Registered SIP 'neo' at 192.168.2.10 port 5060
Saved useragent "SJphone/1.65.377a (SJ Labs)" for peer neo

 

и проверяем состояние пиров:

asterisk*CLI> sip show peers
Name/username Nat ACL Port Status Realtime
neo/neo D Unmonitored Cached RT
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 0 offline]

 

можно посмотреть полную информацию о клиенте:

asterisk*CLI> realtime load sippeers name neo
Name Value
--------------------
id
disallow

allowoverlap
allowsubscribe
buggymwi
call-limit

host
language
lastms
maxcallbitrate
name

progressinband
promiscredir
regexten
regseconds

secret
sendrpid

type

videosupport

 

в команде sippeers — таблица, откуда будем брать данные
name — поле в базе данных
neo — значение поля
команда

asterisk*CLI> realtime load sippeers regexten 1000001

выдаст тот же самый результат

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

Помогла заметка - поделись с другом:
  1. Спасибо Добрый Человек! Доступно и без отсыла в Гуглу. Я бы у себя Вашу статейку выложил. Вы согласны?

    • Wide
    • Июнь 29th, 2012

    У меня просьба написать статейку о том, как установить, что бы все было под эту инструкцию.

      • an0maly
      • Ноябрь 21st, 2012

      что, простите, установить? автор статьи ставил и настраивал asterisk на голую freeBSD. ну, разве что MySQL на ней был поднят. всё остальное описано в статье…

  1. Трэкбэков пока нет.

Оставьте эти два поля как есть:

 
Яндекс.Метрика