본문 바로가기

업무

Asterisk 설치(2)

반응형

이전 글에서 인증서 발급까지 진행

 

4. Install Asterisk from Source Code

$ sudo apt-get install xmlstarlet libopus-dev libopusfile-dev

$ wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-<버전>-current.tar.gz

$ tar -xvf asterisk-[tab키]

$ cd aster[tab키]

$ sudo su

# contrib/scripts/install_prereq install

# ./configure --with-pjproject-bundled

# make menuselect

# make

# make install 

# make config

# make sample // test용 환경 구축

# make basic-pbx // test용 환경 구축

# exit

chan_sip은 Asterisk 13에서 정상적으로 작동하지만 chan_pjsip은 에러가 발생할 수 있음. chan_pjsip을 사용하는 경우 Asterisk 16을 사용하는 것이 좋음. x86 서버에 있는 경우 메뉴 선택에서 opus를 활성화하거나 github 프로젝트에서 다운로드할 수 있으며, 그렇지 않으면 엔드포인트의 allow= 섹션에서 opus 코덱을 꺼낼 수 있음.

버전에 따라 폴더 명이 다르기 때문에 tab키로 자동완성 하라고 작성함

버전선택시 참고

 

# contrib/scripts/install_prereq install을 수행하다보면 아래와 같은 창이 한번 뜨는데 국제전화 사용시 국가번호를 입력하라는 내용이다. 입력 후 enter를 누르면 계속 진행된다.

# make menuselect시 아래와 같은 설정 창이 뜬다. 화살표로 이동가능.

Github에는 CDR(Call Detail Recording), CEL(Channel Event Logging)을 끄고, MOH를 WAV로 변환하게 하라고 한다.

MOH를 변환하는 것은 우측 사진처럼 좌측 메뉴에서 내려가면 있다.

# make시 추가 라이브러리 설치가 필요한 경우가 있다.

안에 친절하게 .sh로 된 명령어가 나오니 명령어를 입력해주면

이런식으로 불러와진다.(안하고 make install시 addon없다고 에러남)

 

5. Configure Asterisk with Github files

여기서 부터는 초기세팅을 설정한다. 만약 기존에 구성했던 파일들이 있다면 사용이 가능하다.

$ cd ~

$ git clone https://github.com/InnovateAsterisk/Browser-Phone.git

$ sudo cp /home/<계정명>/Browser-Phone/config/* /etc/asterisk/

$ sudo rm /var/lib/asterisk/static-http/*

$ sudo cp -r /home/<계정명>/Browser-Phone/Phone/* /var/lib/asterisk/static-http/

$ sudo chmod 744 /var/lib/asterisk/static-http/*

$ vi /etc/asterisk/http.conf
...
[general]
enabled=no ; HTTP // HTTP 사용 안함
tlsenable=yes ; HTTPS // HTTPS 사용
tlsbindaddr=0.0.0.0:443 // 접근 포트 설정
tlscertfile=/home/<계정명>/certs/raspberrypi.crt // 인증서 파일
tlsprivatekey=/home/<계정명>/certs/raspberrypi.key // 인증서 키 파일
enablestatic=yes
sessionlimit=1000
redirect=/ /static/index.html // URI 구성
...

$ sudo cp /home/<계정명>/Browser-Phone/modules/ast-<버전>/codec_opus_arm.so /usr/lib/asterisk/modules

### 만약 버전이 16이라면 아래 3개 라인을 확인하고 수행해야 한다.
### $ cat /home/<계정명>/asterisk-<버전>/include/asterisk/buildopts.h
### Take note of the AST_BUILDOPT_SUM (copy the value)
### $ sudo sed -i 's/1fb7f5c06d7a2052e38d021b3d8ca151/<value of AST_BUILDOPT_SUM>/g' /usr/lib/asterisk/modules/codec_opus_arm.so

$ sudo service asterisk restart
$ sudo asterisk -r
> [tab]
> http show status // HTTP구성 현황을 보여줌
> exit

 

6.chan_sip / chan_pjsip설정

실행시 동작은 하나 추가 설정이 필요하다. 필자의 경우 16버전이라 chan_pjsip관련 설정이 없다고 에러가 발생한다.

 

chan_sip와 chan_pjsip의 차이점(참조)

  chan_sip chan_pjsip
Supportability No longer receives core support from Asterisk (in 2017) Has Core support from Asterisk
SRV Record Lookup Only reads the first SRV entry As many as assigned
Architecture Integral Modular (easy to modify for new feature support).
Functionality Limited
- WebRTC
- More NAT Aware
- Better STUN/ICE Support
Usability/Migration N/A Requires some time for adaptation for CLI system users
Signaling throughput
(beg. Asterisk 13.x)
~300 calls per second ~500 calls per second
Resources Uses less CPU Is more efficient with system resources

6-1. chan_sip

설정 파일 수정

 

$ /etc/astrisk/sip.conf
...
websocket_enabled=yes
maxcallbitrate=5120
...
[general]
...
accept_outofcall_message=yes
auth_message_requests=no
outofcall_message_context=textmessages
...
; == Users

[User1](basic,webrtc)
callerid="Conrad de Wet" <100>
secret=1234

[User2](basic,webrtc)
callerid="User 2" <200>
secret=1234

[User3](basic,phones)
callerid="User 3" <300>
secret=1234

chan_pjsip비활성화

$ vi /etc/asterisk/modules.conf
...
noload => res_pjsip.so
noload => res_pjsip_pubsub.so
noload => res_pjsip_session.so
noload => chan_pjsip.so
noload => res_pjsip_exten_state.so
noload => res_pjsip_log_forwarder.so

extensions설정

$ vi /etc/asterisk/extensions.conf
...
[general]
static=yes
writeprotect=yes
priorityjumping=no
autofallthrough=no

[globals]
ATTENDED_TRANSFER_COMPLETE_SOUND=beep

[textmessages]
exten => 100,1,Gosub(send-text,s,1,(User1))
exten => 200,1,Gosub(send-text,s,1,(User2))
exten => 300,1,Gosub(send-text,s,1,(User3))
exten => e,1,Hangup()

[subscriptions]
exten => 100,hint,SIP/User1
exten => 200,hint,SIP/User2
exten => 300,hint,SIP/User3

[from-extensions]
; Feature Codes:
exten => *65,1,Gosub(moh,s,1)
; Extensions 
exten => 100,1,Gosub(dial-extension,s,1,(User1))
exten => 200,1,Gosub(dial-extension,s,1,(User2))
exten => 300,1,Gosub(dial-extension,s,1,(User3))
; Anything else, Hangup
exten => _[+*0-9].,1,NoOp(You called: ${EXTEN})
exten => _[+*0-9].,n,Hangup(1)
exten => e,1,Hangup()

[moh]
exten => s,1,NoOp(Music On Hold)
exten => s,n,Ringing()
exten => s,n,Wait(2)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,MusicOnHold()

[dial-extension]
exten => s,1,NoOp(Calling: ${ARG1})
exten => s,n,Dial(SIP/${ARG1},30)
exten => s,n,Hangup()
exten => e,1,Hangup()

[send-text]
exten => s,1,NoOp(Sending Text To: ${ARG1})
exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)})
exten => s,n,Set(FROM=${SHELL(asterisk -rx 'sip show peer ${PEER}' | grep 'Callerid' | cut -d':' -f2- | sed 's/^\ *//' | tr -d '\n')})
exten => s,n,Set(CALLERID_NUM=${CUT(CUT(FROM,>,1),<,2)})
exten => s,n,Set(FROM_SIP=${STRREPLACE(MESSAGE(from),<sip:${PEER}@,<sip:${CALLERID_NUM}@)})
exten => s,n,MessageSend(sip:${ARG1},${FROM_SIP})
exten => s,n,Hangup()

설정 재적용

$ sudo asterisk -r
> sip reload
> dialplan reload

 

6-2. chan_pjsip

설정 파일 수정

$ vi /etc/asterisk/pjsip.conf
...
; == Users

[User1](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="Conrad de Wet" <100>
auth=User1
aors=User1
[User1](single_aor)
type=aor
mailboxes=User1@default
[User1](userpass_auth)
type=auth
username=User1
password=1234

[User2](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="User Two" <200>
auth=User2
aors=User2
[User2](single_aor)
type=aor
[User2](userpass_auth)
type=auth
username=User2
password=1234

[User3](basic_endpoint,phone_endpoint)
type=endpoint
callerid="User Three" <300>
auth=User3
aors=User3
[User3](single_aor)
type=aor
[User3](userpass_auth)
type=auth
username=User3
password=1234

chan_sip 비활성화

$ vi /etc/asterisk/modules.conf
...
noload => chan_sip.so

extensions설정

$ vi /etc/asterisk/extensions.conf
...
[general]
static=yes
writeprotect=yes
priorityjumping=no
autofallthrough=no

[globals]
ATTENDED_TRANSFER_COMPLETE_SOUND=beep

[textmessages]
exten => 100,1,Gosub(send-text,s,1,(User1))
exten => 200,1,Gosub(send-text,s,1,(User2))
exten => 300,1,Gosub(send-text,s,1,(User3))

[subscriptions]
exten => 100,hint,PJSIP/User1
exten => 200,hint,PJSIP/User2
exten => 300,hint,PJSIP/User3

[from-extensions]
; Feature Codes:
exten => *65,1,Gosub(moh,s,1)
; Extensions
exten => 100,1,Gosub(dial-extension,s,1,(User1))
exten => 200,1,Gosub(dial-extension,s,1,(User2))
exten => 300,1,Gosub(dial-extension,s,1,(User3))
; Anything else, Hangup
exten => _[+*0-9].,1,NoOp(You called: ${EXTEN})
exten => _[+*0-9].,n,Hangup(1)

exten => e,1,Hangup()

[moh]
exten => s,1,NoOp(Music On Hold)
exten => s,n,Ringing()
exten => s,n,Wait(2)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,MusicOnHold()

[dial-extension]
exten => s,1,NoOp(Calling: ${ARG1})
exten => s,n,Set(JITTERBUFFER(adaptive)=default)
exten => s,n,Dial(PJSIP/${ARG1},30)
exten => s,n,Hangup()

exten => e,1,Hangup()

[send-text]
exten => s,1,NoOp(Sending Text To: ${ARG1})
exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)})
exten => s,n,Set(FROM=${SHELL(asterisk -rx 'pjsip show endpoint ${PEER}' | grep 'callerid ' | cut -d':' -f2- | sed 's/^\ *//' | tr -d '\n')})
exten => s,n,Set(CALLERID_NUM=${CUT(CUT(FROM,>,1),<,2)})
exten => s,n,Set(FROM_SIP=${STRREPLACE(MESSAGE(from),<sip:${PEER}@,<sip:${CALLERID_NUM}@)})
exten => s,n,MessageSend(pjsip:${ARG1},${FROM_SIP})
exten => s,n,Hangup()

설정 재적용

$ sudo asterisk -r
> module reload res_pjsip.so
> dialplan reload

 

 

7. 기타

만약 실행중 아래와 같은 에러가 난다면 파일을 만들어주면 된다.

$ touch /etc/asterisk/pjsip_wizard.conf

그냥 단순히 설치중 파일을 못만들어서 그렇다는것 같다(빈파일인데 무슨 의미가 있는지..)

반응형

'업무' 카테고리의 다른 글

WSL 고정 IP지정  (0) 2023.08.31
Asterisk 설치 관련(기타)  (0) 2023.08.30
Asterisk 설치(1)  (0) 2023.08.29
DBeaver CSV Export 한글깨짐  (0) 2023.08.16
Git 관련  (0) 2023.07.12