안녕하세요. 이번에는 U5PVR 에 음성통화 서버를 설치해 보겠습니다.
프로토콜로써 SIP 을 사용하며 서버로 asterisk 가 사용됩니다.
실제로 asterisk 를 상세하게? 사용하기 위해서는 컴파일 작업을 해야 최신버전을 설치할 수 있고 마음대로 기능을 넣었다가 뺐다가 할 수 있습니다.
asterisk 의 홈페이지는 아래와 같습니다.
기본적으로 웹 UI 를 통해서 관리를 하도록 FreePBX 나 digium-gui 를 설치할 수 있지만, 이번 게시글의 목표는 통화가 되게 하는 것임으로 최대한 간단한 방법으로 설치하는 방법을 작성하겠습니다.
그럼 시작합니다~~
1. asterisk 패키지 설치하기 및 작동 테스트
아래의 명령어를 통하여 asterisk 를 설치합니다. 실제로 설치되는 버전은 asterisk 11 버전이네요.
root@u5pvr-debian:~# apt-get install asterisk
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
asterisk-config asterisk-core-sounds-en asterisk-core-sounds-en-gsm asterisk-modules asterisk-moh-opsound-gsm asterisk-voicemail freetds-common gnupg-agent gnupg2 libassuan0 libcfg4 libcoroipcc4 libcpg4
libfreeradius-client2 libgmime-2.6-0 libgomp1 libgpgme11 libgsm1 libical1a libiksemel3 libjack-jackd2-0 libksba8 libneon27-gnutls libodbc1 libopencore-amrnb0 libopencore-amrwb0 libopus0 libpci3 libperl5.20
libpj2 libpjlib-util2 libpjmedia-audiodev2 libpjmedia-codec2 libpjmedia-videodev2 libpjmedia2 libpjnath2 libpjsip-simple2 libpjsip-ua2 libpjsip2 libpjsua2 libportaudio2 libpq5 libpth20 libresample1
libsamplerate0 libsensors4 libsnmp-base libsnmp30 libsox-fmt-alsa libsox-fmt-base libsox2 libspandsp2 libspeex1 libspeexdsp1 libsqlite0 libsrtp0 libsybdb5 libwavpack1 pinentry-gtk2 sox
Suggested packages:
asterisk-doc asterisk-dev asterisk-ooh323 asterisk-dahdi asterisk-vpb gnupg-doc parcimonie xloadimage gpgsm jackd2 libmyodbc odbc-postgresql tdsodbc unixodbc-bin opus-tools lm-sensors snmp-mibs-downloader
libsox-fmt-all speex srtp-utils pinentry-doc
The following NEW packages will be installed:
asterisk asterisk-config asterisk-core-sounds-en asterisk-core-sounds-en-gsm asterisk-modules asterisk-moh-opsound-gsm asterisk-voicemail freetds-common gnupg-agent gnupg2 libassuan0 libcfg4 libcoroipcc4
libcpg4 libfreeradius-client2 libgmime-2.6-0 libgomp1 libgpgme11 libgsm1 libical1a libiksemel3 libjack-jackd2-0 libksba8 libneon27-gnutls libodbc1 libopencore-amrnb0 libopencore-amrwb0 libopus0 libpci3
libperl5.20 libpj2 libpjlib-util2 libpjmedia-audiodev2 libpjmedia-codec2 libpjmedia-videodev2 libpjmedia2 libpjnath2 libpjsip-simple2 libpjsip-ua2 libpjsip2 libpjsua2 libportaudio2 libpq5 libpth20
libresample1 libsamplerate0 libsensors4 libsnmp-base libsnmp30 libsox-fmt-alsa libsox-fmt-base libsox2 libspandsp2 libspeex1 libspeexdsp1 libsqlite0 libsrtp0 libsybdb5 libwavpack1 pinentry-gtk2 sox
0 upgraded, 61 newly installed, 0 to remove and 0 not upgraded.
Need to get 19.2 MB of archives.
After this operation, 38.3 MB of additional disk space will be used.
Do you want to continue? [Y/n]
다음으로 asterisk 는 asterisk 계정으로 구동되기 때문에 안드로이드 권한에 맞추어 aid_inet 그룹에 추가해 주어야 정상적으로 포트가 열립니다. 아래의 명령으로 asterisk 계정을 aid_inet 그룹에 추가해 줍니다.
root@u5pvr-debian:~# adduser asterisk aid_inet
Adding user `asterisk' to group `aid_inet' ...
Adding user asterisk to group aid_inet
Done.
그리고 asterisk 를 한번 재시작 해 줍니다.
root@u5pvr-debian:/etc/asterisk# service asterisk restart
Stopping Asterisk PBX: asterisk.
Starting Asterisk PBX: asterisk.
netstat 명령을 통해 아래처럼 포트가 정상적으로 열렸는지 확인해 줍니다.
추가적으로 asterisk 콘솔을 열어서 정상적으로 동작중인지 확인합니다.
root@u5pvr-debian:~# netstat -nlp | grep asterisk
tcp 0 0 0.0.0.0:2000 0.0.0.0:* LISTEN 29173/asterisk
tcp 0 0 127.0.0.1:5038 0.0.0.0:* LISTEN 29173/asterisk
udp 0 0 0.0.0.0:5000 0.0.0.0:* 29173/asterisk
udp 0 0 0.0.0.0:4520 0.0.0.0:* 29173/asterisk
udp 0 0 0.0.0.0:5060 0.0.0.0:* 29173/asterisk
udp 0 0 0.0.0.0:4569 0.0.0.0:* 29173/asterisk
unix 2 [ ACC ] STREAM LISTENING 853931 29173/asterisk /var/run/asterisk/asterisk.ctl
root@u5pvr-debian:~#
root@u5pvr-debian:~# asterisk -rvvvvvvvvvv
Asterisk 11.13.1~dfsg-2+deb8u2, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
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.
=========================================================================
Connected to Asterisk 11.13.1~dfsg-2+deb8u2 currently running on u5pvr-debian (pid = 29173)
u5pvr-debian*CLI>
설치가 정상적으로 되었습니다.
2. asterisk 기초 설정하기 및 계정 N개 추가하기
일단 설정파일들이 위치하고 있는 폴더로 이동합니다.
root@u5pvr-debian:~# cd /etc/asterisk/
root@u5pvr-debian:/etc/asterisk# ls
acl.conf ccss.conf cel.conf codecs.conf extensions.conf iaxprov.conf modules.conf res_config_mysql.conf res_stun_monitor.conf users.conf
adsi.conf cdr.conf cel_custom.conf confbridge.conf extensions.lua indications.conf motif.conf res_config_sqlite.conf rtp.conf voicemail.conf
agents.conf cdr_adaptive_odbc.conf cel_odbc.conf config_test.conf extensions_minivm.conf jabber.conf musiconhold.conf res_config_sqlite3.conf say.conf vpb.conf
alarmreceiver.conf cdr_custom.conf cel_pgsql.conf console.conf features.conf jingle.conf muted.conf res_corosync.conf sip.conf xmpp.conf
alsa.conf cdr_manager.conf cel_sqlite3_custom.conf dbsep.conf festival.conf logger.conf ooh323.conf res_curl.conf sip_notify.conf
amd.conf cdr_mysql.conf cel_tds.conf dnsmgr.conf followme.conf manager.conf osp.conf res_fax.conf skinny.conf
app_mysql.conf cdr_odbc.conf chan_dahdi.conf dsp.conf func_odbc.conf manager.d oss.conf res_ldap.conf sla.conf
app_skel.conf cdr_pgsql.conf chan_mobile.conf dundi.conf gtalk.conf meetme.conf phone.conf res_odbc.conf smdi.conf
asterisk.adsi cdr_sqlite3_custom.conf cli.conf enum.conf h323.conf mgcp.conf phoneprov.conf res_pgsql.conf telcordia-1.adsi
asterisk.conf cdr_syslog.conf cli_aliases.conf extconfig.conf http.conf minivm.conf queuerules.conf res_pktccops.conf udptl.conf
calendar.conf cdr_tds.conf cli_permissions.conf extensions.ael iax.conf misdn.conf queues.conf res_snmp.conf unistim.conf
root@u5pvr-debian:/etc/asterisk#
sip.conf 파일과 extensions.conf 파일을 삭제합니다.
root@u5pvr-debian:/etc/asterisk# rm sip.conf extensions.conf
sip.conf 파일을 아래과 같이 생성합니다.
저는 테스트로 계정 3개를 생성하였습니다.
root@u5pvr-debian:/etc/asterisk# nano sip.conf
[general]
context=public
allowoverlap=no
udpbindaddr=0.0.0.0:8000 <-- UDP 바인트 포트를 지정합니다. 본래 5060 이나 8000번으로 설정하였습니다.
tcpenable=no
tcpbindaddr=0.0.0.0:8000
transport=udp
srvlookup=yes
language=en
disallow=all
allow=ulaw
allow=ilbc
allow=alaw
allow=gsm
externhost=djjproject.iptime.org <-- 외부 도메인 주소 혹은 외부 아이피 주소를 넣습니다.
externhostrefresh=10
localnet=192.168.100.0/255.255.255.0 <-- 로컬 네트워크 설정을 넣습니다.
# 로컬 네트워크가 192.168.0.XXX 이면 192.168.0.0/255.255.255.0 입니다.
nat=yes
[2001]
type=friend
username=2001 <-- 유저 이름을 지정합니다.
secret=test11!! <-- 비밀번호를 지정합니다.
callerid=nexus5 <-- 닉네임으로 사용할 이름을 적습니다.
host=dynamic
context=lan
canreinvite =no
qualify=yes
transport=udp
# 이하는 동일하게 계속 추가하실 수 있습니다.
[2002]
type=friend
username=2002
secret=test11!!
callerid=galaxy nexus
host=dynamic
context=lan
canreinvite =no
qualify=yes
transport=udp
[2003]
type=friend
username=2003
secret=test11!!
callerid=pc
host=dynamic
callerid=pc
host=dynamic
context=lan
canreinvite =no
qualify=yes
transport=udp
다음으로 extensions.conf 파일을 아래의 내용으로 생성합니다.
root@u5pvr-debian:/etc/asterisk# nano extensions.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no
[public]
include => lan
[default]
include => lan
[lan]
exten => _XXXX,1,Dial(SIP/${EXTEN},30)
exten => _XXXX,n,Congestion
exten => _XXXX,n,Busy
exten => _XXXX,n,Hangup
다음으로 rtp 범위를 약간 수정하기 위해서 아래의 파일을 수정합니다.
동시 통화 수가 많을 경우에는 기본값인 10000 ~ 20000 을 사용하시거나 겹치는 경우 범위를 조정해 주시면 됩니다. 이번에는 소규모이기 때문에 1000개만 할당하였습니다.
root@u5pvr-debian:/etc/asterisk# nano rtp.conf
; RTP Configuration
;
[general]
;
; RTP start and RTP end configure start and end addresses
;
; Defaults are rtpstart=5000 and rtpend=31000
;
rtpstart=19000 <-- RTP 시작 포트
rtpend=20000 <-- RTP 끝 포트
;
; Whether to enable or disable UDP checksums on RTP traffic
;
;rtpchecksums=no
;
; The amount of time a DTMF digit with no 'end' marker should be
; allowed to continue (in 'samples', 1/8000 of a second)
이렇게 설정이 끝났습니다.
설정이 끝났음으로 서비스를 재시작 해 줍니다.
root@u5pvr-debian:/etc/asterisk# service asterisk restart
Stopping Asterisk PBX: asterisk.
Starting Asterisk PBX: asterisk.
3. 공유기 포트포워딩 하기
asterisk 의 경우는 아래의 포트를 사용합니다.
아래의 값은 2번에서 설정한 것에 따라 다를 수 있습니다.
UDP 8000
UDP 19000~20000
아이피타임 공유기상으로는 아래와 같이 등록하시면 됩니다.
4. 통화 해보기 (2명 , 다자간 통화)
먼저 안드로이드에서는 아래의 앱을 주로 사용합니다.
https://play.google.com/store/apps/details?id=com.csipsimple&hl=ko
이 앱을 설치해 줍니다.
앱을 켜게 되면 아래의 설정창이 뜨는데 마음에 드시는 쪽으로 설정해 주시길 바랍니다.
안드로이드 다이얼러와 통합은 비추천입니다.
한편, UDP 로 통신을 대기하기 때문에 배터리가 상당히 빨리 빠지는 것을 느끼실 수 있습니다. 상황에 맞게 설정해 주시면 됩니다 ㅎㅎ
다음으로 계정을 설정하라는 알림이 뜨고 Basic 으로 추가를 하시면 됩니다.
아래의 양식에 맞추어 입력해 주시면 됩니다.
한편 3G 4G 모드에서는 사용할 수 없게 되어 있는데 설정 -> 네트워크로 이동하여 아래의 설정을 해 주시면 됩니다.
왼쪽 아래의 열쇄 모양을 누르면 계정 리스트가 나옵니다.
인액티브 상태 및 연결중에서 에러가 났거나 하면 안드로이드 모양을 눌러 연결을 시도합니다.
정상적으로 연결이 되면 등록 완료 라고 뜹니다.
동일하게 갤럭시 넥서스에도 2002번으로 설정을 하여 전화를 걸어 보도록 하겠습니다.
정상적으로 신호가 울리고 통화가 잘 됩니다.
반대로 갤럭시 넥서스 2002 -> 넥서스5 2001 로도 잘 옵니다.
이때 asterisk 서버 로그를 살펴보도록 하겠습니다.
큰 문제가 없이 작동이 잘 됩니다.
root@u5pvr-debian:/etc/asterisk# asterisk -rvvvvv
Asterisk 11.13.1~dfsg-2+deb8u2, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
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.
=========================================================================
Connected to Asterisk 11.13.1~dfsg-2+deb8u2 currently running on u5pvr-debian (pid = 3859)
-- Unregistered SIP '2002'
-- Registered SIP '2002' at 192.168.100.1:55133
[Apr 5 16:27:16] NOTICE[3894]: chan_sip.c:27868 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 2002
-- Unregistered SIP '2001'
-- Registered SIP '2001' at 110.70.54.124:22120
[Apr 5 16:27:20] NOTICE[3894]: chan_sip.c:27868 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 2001
== Using SIP RTP CoS mark 5
-- Executing [2002@lan:1] Dial("SIP/2001-00000008", "SIP/2002,30") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/2002
-- SIP/2002-00000009 is ringing
# 아래는 RTP 흐름을 나타냅니다.
> 0xb620b2c8 -- Probation passed - setting RTP source address to 192.168.100.37:4000
> 0xb620b2c8 -- Probation passed - setting RTP source address to 192.168.100.37:4000
-- SIP/2002-00000009 answered SIP/2001-00000008
-- Locally bridging SIP/2001-00000008 and SIP/2002-00000009
> 0xb620b2c8 -- Probation passed - setting RTP source address to 192.168.100.37:4000
> 0xb8281570 -- Probation passed - setting RTP source address to 110.70.54.124:37151
> 0xb8281570 -- Probation passed - setting RTP source address to 110.70.54.124:37151
> 0xb8281570 -- Probation passed - setting RTP source address to 110.70.54.124:37151
> 0xb8281570 -- Probation passed - setting RTP source address to 110.70.54.124:37151
== Spawn extension (lan, 2002, 1) exited non-zero on 'SIP/2001-00000008'
== Using SIP RTP CoS mark 5
-- Executing [2001@lan:1] Dial("SIP/2002-0000000a", "SIP/2001,30") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/2001
-- SIP/2001-0000000b is ringing
-- SIP/2001-0000000b is ringing
> 0xb620b2c8 -- Probation passed - setting RTP source address to 110.70.54.124:63990
> 0xb620b2c8 -- Probation passed - setting RTP source address to 110.70.54.124:63990
-- SIP/2001-0000000b answered SIP/2002-0000000a
> 0xb620b2c8 -- Probation passed - setting RTP source address to 110.70.54.124:63990
> 0xb620b2c8 -- Probation passed - setting RTP source address to 110.70.54.124:63990
> 0xb8267558 -- Probation passed - setting RTP source address to 192.168.100.37:4002
> 0xb8267558 -- Probation passed - setting RTP source address to 192.168.100.37:4002
== Spawn extension (lan, 2001, 1) exited non-zero on 'SIP/2002-0000000a'
u5pvr-debian*CLI>
다음으로 다자간 통화를 해보도록 하겠습니다.
일단 설정 -> 통화옵션으로 이동하여 멀티콜 설정을 켜 줍니다.
그리고 2002 번에 전화를 겁니다.
다음으로 아래쪽에 + 버튼을 통해 2003 번으로 통화를 겁니다.
결론적으로는 3명과 동시에 통화가 되고 화면상으로는 아래와 같이 뜹니다.
추가적으로 PC 클라이언트의 경우 X-lite 프로그램을 사용합니다.
http://www.counterpath.com/x-lite/
소프트폰 -> 계정설정으로 이동하여 아래와 비슷하게 입력해 주시면 됩니다.
감사합니다.