Интеграция OpenMeetings с Asterisk

Интеграция OpenMeetings с Asterisk

В данной статье мы расскажем как интегрировать установленную платформу видеоконференций OpenMeetings с Asterisk. Ранее мы подробно разбирали установку OpenMeetings, а также одна из последних статей по установке Asterisk 16.

Подготовка
apt-get update && apt-get install jsvc

Мы предполагаем, что Asterisk уже установлен и нам необходимо лишь включить модуль для реалтайма в файле /etc/asterisk/modules.conf:

load => res_config_mysql.so

OpenMeetings создаст MySQL таблицы, необходимые для Asterisk при установке. Если мы будем управлять Asterisk вручную, нам нужно создать таблицы в MySQL. По умолчанию OpenMeetings создает таблицы:

USE openmeetings;

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 '',
 `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=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

CREATE TABLE `meetme` (
 `confno` varchar(80) NOT NULL DEFAULT '0',
 `pin` varchar(20) DEFAULT NULL,
 `adminpin` varchar(20) DEFAULT NULL,
 `members` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`confno`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

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=4 DEFAULT CHARSET=utf8

Далее настраиваем реалтайм и для этого в файле /etc/asterisk/res_config_mysql.conf добавляем следующие строки:

[general]
dbhost = 127.0.0.1
dbname = openmeetings
dbuser = root
dbpass =
dbport = 3306
dbsock = /var/lib/mysql/mysql.sock
dbcharset = utf8
requirements=warn

Редактируем файл /etc/asterisk/sip.conf, добавив следующие опции:

videosupport=yes
rtcachefriends=yes
maxexpiry=43200

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

[red5sip_user]
type=friend
secret=12345
disallow=all
allow=ulaw
allow=h263
host=dynamic
nat=force_rport,comedia
context=rooms-red5sip

Добавляем следующие строки в фале /etc/asterisk/extconfig.conf:

[settings]
sipusers => mysql,general,sipusers
sippeers => mysql,general,sipusers
extensions => mysql,general,extensions
meetme => mysql,general,meetme

И, наконец, добавляем в файл /etc/asterisk/extensions.conf следующую конфигурацию:

[rooms]
exten => _400X!,1,GotoIf($[${DB_EXISTS(openmeetings/rooms/${EXTEN})}]?ok:notavail)
exten => _400X!,n(ok),SET(PIN=${DB(openmeetings/rooms/${EXTEN})})
exten => _400X!,n,Set(CONFBRIDGE(user,template)=sip_user)
exten => _400X!,n,Set(CONFBRIDGE(user,pin)=${PIN})
exten => _400X!,n(ok),Confbridge(${EXTEN},default_bridge,)
exten => _400X!,n,Hangup
exten => _400X!,n(notavail),Answer()
exten => _400X!,n,Playback(invalid)
exten => _400X!,n,Hangup
[rooms-originate]
exten => _400X!,1,Confbridge(${EXTEN},default_bridge,sip_user)
exten => _400X!,n,Hangup
[rooms-out]
; *****************************************************
; Extensions for outgoing calls from Openmeetings room.
; *****************************************************
[rooms-red5sip]
exten => _400X!,1,GotoIf($[${DB_EXISTS(openmeetings/rooms/${EXTEN})}]?ok:notavail)
exten => _400X!,n(ok),Confbridge(${EXTEN},default_bridge,red5sip_user)
exten => _400X!,n(notavail),Hangup

Добавляем Confbridge в Asterisk в файле /etc/asterisk/confbridge.conf:

[general]
[red5sip_user]
type=user
marked=yes
dsp_drop_silence=yes
denoise=true

[sip_user]
type=user
end_marked=yes
wait_marked=yes
music_on_hold_when_empty=yes
dsp_drop_silence=yes
denoise=true

[default_bridge]
type=bridge
video_mode=follow_talker

Создаем API подключение в файле /etc/asterisk/manager.conf:

[general]
enabled = yes
webenabled = no
port = 5038
bindaddr = 127.0.0.1

[openmeetings]
secret = 12345
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = all
write = all

Редактируем файл /opt/om/webapps/openmeetings/WEB-INF/classes/applicationContext.xml. Находим строку, на

<bean id="sipDao" class="org.apache.openmeetings.db.dao.room.SipDao">

и приводим к следующему виду:

<bean id="sipDao" class="org.apache.openmeetings.db.dao.room.SipDao">
        <constructor-arg index="0" value="127.0.0.1"/>
        <constructor-arg index="1" value="5038" type = "int"/>
        <constructor-arg index="2" value="openmeetings"/>
        <constructor-arg index="3" value="12345"/>
        <constructor-arg index="4" value="10000" type = "long"/>
        <property name="uid" value="87dddad4-9ca5-475b-860f-2e0825d02b76"/>
</bean>

Перезапускаем службу Asterisk:

systemctl restart asterisk
Установка red5sip
cd /opt
git clone https://github.com/openmeetings/red5sip.git
cd red5sip
mvn clean package

Вставляем в файл /opt/red5sip/settings.properties следующие настройки:

red5.host=127.0.0.1 # red5 server address
om.context=openmeetings # Openmeetings context
red5.codec=asao
red5.codec.rate=22 # should correlate with mic setting in Admin->Config `flash.mic.rate`
sip.obproxy=127.0.0.1 # asterisk adderss
sip.phone=red5sip_user # sip phone number
sip.authid=red5sip_user # sip auth id
sip.secret=12345 # sip password
sip.realm=asterisk # sip realm
sip.proxy=127.0.0.1 # address of sip proxy
rooms.forceStart=no # TBD
uid=87dddad4-9ca5-475b-860f-2e0825d02b76 #can be generated here: https://www.uuidtools.com/
rooms=1 # TBD (not in use)

Настройки доступа

chown -R nobody:nogroup /opt/red5sip
cp /opt/red5sip/red5sip /etc/init.d/
chmod a+x /etc/init.d/red5sip
update-rc.d red5sip defaults
service red5 start

Далее открываем веб-интерфейс OpenMeetings и в меню Administration->Configuration-> устанавливаем параметр:

  • red5sip.enable == yes

Активируем SIP в меню Administration->Conference rooms->Room->Включаем SIP транспорт:

  • room == checked
service red5sip start

Для примера добавим SIP-пользователя с именем “test1”:

insert into sipusers (allow, context, disallow, host, name, secret) values ('g729;ilbc;gsm;ulaw;alaw' , 'rooms' , NULL, 'dynamic' , 'test1', '12345');

Затем создадим MeetMe комнату (конференцию):

insert into extensions (context, exten, priority, app, appdata) values (‘rooms’, ‘400’,   1, ‘MeetMe’, ‘400,dM’);
insert into meetme (confno, adminpin) values (‘400’, ‘12345’);

Теперь мы можем зарегистрировать SIP-аккаунт на SIP-телефоне по следующим настрйокам:

name: test1
domain: example
password: 12345
auth id: test1
sip proxy: <address of asterisk server>:5060

Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.