본문 바로가기
AndroidOverLinux

U5PVR 음성통화 서버 구축하기 (asterisk, voip, sip)

by ㅋㅋ잠자 2017. 4. 5.
반응형

안녕하세요. 이번에는 U5PVR 에 음성통화 서버를 설치해 보겠습니다.


프로토콜로써 SIP 을 사용하며 서버로 asterisk 가 사용됩니다.


실제로 asterisk 를 상세하게? 사용하기 위해서는 컴파일 작업을 해야 최신버전을 설치할 수 있고 마음대로 기능을 넣었다가 뺐다가 할 수 있습니다. 


asterisk 의 홈페이지는 아래와 같습니다.


http://www.asterisk.org/



기본적으로 웹 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/


소프트폰 -> 계정설정으로 이동하여 아래와 비슷하게 입력해 주시면 됩니다.





감사합니다.

반응형

댓글