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 DATABASEasterisk
; GRANT ALL PRIVILEGES ONasterisk
.* TO '<имя пользователя>'@'localhost' IDENTIFIED BY '<евоный пароль>'; USEasterisk
; -- ---------------------------- -- Table structure for extensions -- ---------------------------- DROP TABLE IF EXISTSextensions
; CREATE TABLEextensions
(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 '', KEYid
(id
) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251; -- ---------------------------- -- Table structure for sipusers -- ---------------------------- DROP TABLE IF EXISTSsipusers
; CREATE TABLEsipusers
(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 KEYname
(name
), KEYname_2
(name
) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 ROW_FORMAT=DYNAMIC; -- ---------------------------- -- Table structure for voicemail -- ---------------------------- DROP TABLE IF EXISTSvoicemail
; CREATE TABLEvoicemail
(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 '',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
), KEYmailbox_context
(mailbox
,context
) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251; -- ---------------------------- -- Records -- ---------------------------- INSERT INTOextensions
VALUES ('1', 'factory', '_XXXXXXX', '1', 'NoOp', ''); INSERT INTOsipusers
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
выдаст тот же самый результат
задолбался вкуривая мануалы, но ведь работает жеж падла.
Спасибо Добрый Человек! Доступно и без отсыла в Гуглу. Я бы у себя Вашу статейку выложил. Вы согласны?
Да, конечно. Со ссылкой 🙂
А то. Я же не плагиатор какой нибудь 🙂
У меня просьба написать статейку о том, как установить, что бы все было под эту инструкцию.
что, простите, установить? автор статьи ставил и настраивал asterisk на голую freeBSD. ну, разве что MySQL на ней был поднят. всё остальное описано в статье…