воскресенье, 16 августа 2015 г.

Realtime config SIP для Asterisk 13

 Я понимаю, что SIP устарел в пользу PJSIP, но задача была именно SIP в реалтайме.
 В Астериске должны присутствовать модули res_odbc.so и res_config_odbc, в системе должны быть unixODBC и mysql-connector-odbc ( или другой, если используется PG или еще что-то другое). 
 Итого - заходим в консоль MySQL, создаем базу для asterisk:

create database asterisk;
grant all privileges on asterisk.* to asterisk@localhost identified by 'PASSWORD';

Заливаем туда таблицу для SIP-

CREATE TABLE `sip_peers` (
`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,
`callbackextension` 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 '',
`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=InnoDB ROW_FORMAT=DYNAMIC;


Выходим из консоли MySQL. Открываем /etc/odbcinst.ini и проверяем чтобы драйвер MySQL был включен. В моем случае в CentOS 7 это выглядит так-

[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1


Открываем /etc/odbc.ini и описываем в нем подключение к базе

[asterisk]
Driver=MySQL
SERVER=localhost
PORT=3306
DATABASE=asterisk
USER=asterisk
PASSWORD= PASSWORD


Далее, открываем /etc/asterisk/res_odbc.conf и опишем в нем подключение к ODBC ( в данном случае dsn- это название секции в odbc.ini, username и password прежние )

[sql]
enabled => yes
dsn => asterisk
username => asterisk
password => PASSWORD
pooling => no
pre-connect => yes

Следущим шагом настроим подключение конфигурации к ODBC. Открываем /etc/asterisk/extconfig.conf (  если у вас в системе валяется res_config_odbc.conf - удаляйте, он устарел).

[settings]
sipusers => odbc,sql,sip_peers
sippeers => odbc,sql,sip_peers


Здесь первое значение это драйвер ( mysql или odbc), второе- название подключения в res_odbc.conf, третье- название таблицы в базе.

Теперь осталось включить конфигурацию. Откроем /etc/asterisk.modules.conf. Ищем строчки ( если их нет - пишем )
preload = res_odbc.so
preload = res_config_odbc.so

Заходим в консоль Asterisk и передергиваем модули
module unload res_config_odbc.so
module unload res_odbc.so
module load res_odbc.so
module load res_config_odbc.so

Если не ругнулось - проверяем

CLI> odbc show all

ODBC DSN Settings
-----------------

  Name:   sql
  DSN:    asterisk
    Last connection attempt: 1969-12-31 18:00:00
  Pooled: No
  Connected: Yes


Последняя строчка говорит что все нормально, есть подключение.
На всякий случай передергиваем SIP

sip reload

Если не ругнулось на неправильно настроенный realtime- значит все нормально.

После этого  можно заводить SIP-учетки в базе, к примеру так ( в консоли MySQL)-

INSERT INTO asterisk.sip_peers ( NAME, username, secret, context, HOST, nat, qualify, TYPE) VALUES ('1001', '1001', 'USERPASSWORD', 'USERCONTEXT', 'dynamic', 'yes', 'no', 'friend');

Реалтайм-абоненты в sip show peers не отображаются. Единственный известный мне способ вытащить их на свет это внести в sip.conf в секцию general строчку

rtcachefriends=yes

После первого подключения телефона он появится в списке SIP-пиров.





7 комментариев:

  1. Пробовали вы таким образом iax транки настроить ?

    ОтветитьУдалить
  2. Не было нужды, но в сети куча подобных инструкций про IAX. Например - http://asterisk.ru/knowledgebase/Asterisk+Realtime+IAX ,

    ОтветитьУдалить
    Ответы
    1. К сожалению тупо не работает, в моем случае :(

      Удалить
  3. А что именно не работает? ODBC подключен, база создана, подключение конфига описано?

    ОтветитьУдалить
    Ответы
    1. Так вроде как все и настроено, и ошибок нет, но вот регистрация не проходит с другого астера. Вот тут я описал что сделал https://forum.asterisk.ru/viewtopic.php?f=5&t=7622&p=67730

      Удалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Firm unload failed for res_odbc.so
    как быть ?

    ОтветитьУдалить