LLM(Open AI)

Asterisk PBK 란? 간단한 설명/설정과 구조

code2772 2024. 11. 4. 09:28
728x90
반응형

Asterisk PBX( 사설교환기)

 

1. 개요

통신회사에서 음성 및 메세징 발송 관리를 하면서 이번에  Astrisk를 활용한 음성 메세지 시스템을 구축하면서 간단하게 공부한 내용을 정리하게 되었다.

 

Asterisk란?

  • 오픈소스 PBX(Private Branch Exchange) 시스템
  • 1999년 Mark Spencer가 개발
  • 소프트웨어 기반 전화교환 시스템
  • 기존 하드웨어 기반 교환기의 대안

 

실제 회사 프로젝트와는 관계 없습니다.

 

주요 특징

  • 유연한 확장성
  • 다양한 프로토콜 지원 (SIP, H.323, IAX2 등)
  • 무료 오픈소스
  • 커스터마이징 가능
  • 강력한 API 지원

 

통화 흐름 기본 구조

Asterisk Call Flow

주요 구성 요소

  1. Caller (발신자) : 통화를 시작하는 주체, 내선 전화기 또는 외부 전화 -> 수신 요청 !
  2. Channel Driver (채널 드라이버) : 다양한 통신 프로토콜 처리 (SIP, IAX2 등), 물리적 연결을 논리적 채널로 변환 -> 채널 생성!
  3. Dialplan (다이얼플랜) : 통화 처리 규칙 정의, 호출 경로 결정 -> 통화 규칙 적용!
  4. Applications (애플리케이션) : 실제 통화 처리 기능 수행, 통화 연결, 녹음, 대기열 등 -> 실제 동작 수행!
  5. Callee (수신자) : 통화를 받는 대상, 내선 전화기 또는 외부 전화 -> 통화 연결!

 

1. SIP 채널 드라이버 설정 (sip.conf)

[general]
; 기본 SIP 설정
context=from-external     ; 외부에서 들어오는 모든 호출이 시작되는 컨텍스트
bindaddr=0.0.0.0         ; 모든 네트워크 인터페이스에서 SIP 요청 수신
                         ; 특정 IP만 허용하려면 해당 IP 입력
                         
transport=udp,tcp        ; SIP 통신에 사용할 프로토콜
                         ; udp: 빠른 전송, tcp: 신뢰성 있는 전송

; 내선 전화기 설정
[1000]                   ; 내선 번호 (전화기 ID)
type=friend              ; 양방향 통신 가능 (peer: 발신전용, user: 수신전용)
host=dynamic             ; IP 주소 동적 할당 (고정 IP의 경우 직접 IP 입력)
secret=password123       ; 인증용 비밀번호
context=internal         ; 이 내선에서 사용할 다이얼플랜 컨텍스트

; 사용방법:
; 1. sip show peers - 등록된 모든 SIP 장치 확인
; 2. sip reload - 설정 변경 후 리로드
; 3. sip show registry - SIP 트렁크 등록 상태 확인

 

 

2. 다이얼플랜 설정 (extensions.conf)

[internal]
; 기본 내선 통화 처리
exten => _1XXX,1,NoOp(수신 통화 시작: ${EXTEN})   ; 로그용 메시지 출력
                                                  ; _1XXX는 1000-1999 범위의 내선
                                                  
same => n,Set(CALLERID(name)=${DB(users/${EXTEN}/name)})  ; DB에서 발신자 이름 가져오기

same => n,Dial(SIP/${EXTEN},20,m)    ; SIP 전화기로 통화 시도
                                     ; 20: 20초 동안 벨 울림
                                     ; m: 음악 재생
                                     
same => n,Hangup()                   ; 통화 종료

; 통화 처리 옵션:
; Dial 명령어 옵션:
; t: 수신자가 통화 전송 가능
; T: 발신자가 통화 전송 가능
; r: 벨소리 재생
; m: 대기음악 재생

 

 

3. 통화 상태 처리

[accepted-calls]
; 통화 수락 시 처리 로직
exten => s,1,NoOp(통화 수락 처리)    ; 디버깅용 메시지

same => n,Bridge(SIP/${EXTEN})       ; 두 채널 연결 (실제 통화 시작)

same => n,Monitor(wav,${UNIQUEID})   ; 통화 녹음 시작
                                     ; wav: 녹음 형식
                                     ; ${UNIQUEID}: 고유 통화 ID로 파일명 지정
same => n,Hangup()

[rejected-calls]
; 통화 거절 시 처리 로직
exten => s,1,NoOp(통화 거절 처리)              ; 디버깅용 메시지

same => n,Playback(vm-nobodyavail)            ; "부재중" 안내 메시지 재생

same => n,VoiceMail(${EXTEN}@default,u)       ; 음성메일로 전환
                                              ; u: 응답없음 상태
same => n,Hangup()

; 사용방법:
; 1. 통화 녹음 확인: /var/spool/asterisk/monitor/
; 2. 음성메일 확인: *97로 다이얼

 

 

4. 고급 라우팅 설정

[time-based-routing]
; 시간 기반 통화 라우팅
exten => _X.,1,GotoIfTime(9:00-18:00,mon-fri,*,*?business-hours,${EXTEN},1)
; 시간 조건: 평일 9시-18시
; 조건 만족 시 business-hours로 이동
; 조건 불만족 시 다음 줄 실행

same => n,Goto(after-hours,${EXTEN},1)


[conditional-routing]
; 우선순위 기반 라우팅
exten => _2XX,1,GotoIf($[${DB(user/${EXTEN}/priority)} = high]?high-priority,1:normal-priority,1)
; DB에서 사용자 우선순위 확인
; high인 경우 high-priority로 이동
; 그 외의 경우 normal-priority로 이동

; 사용방법:
; 1. 시간 조건 수정: GotoIfTime의 매개변수 수정
; 2. 우선순위 설정: asterisk DB에 저장
;    Set(DB(user/201/priority)=high)

 

 

5. 모니터링 및 로깅 설정

[monitor-settings]
; 통화 품질 모니터링
exten => _X.,1,Set(CHANNEL(audioquality_reporting)=yes)  ; 오디오 품질 보고 활성화
same => n,Set(CDR(audioquality)=${CHANNEL(audioquality)}) ; CDR에 품질 정보 저장

; 통화 로그 기록
exten => h,1,System(echo "${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)}${CHANNEL(name)} ${DIALSTATUS}" >> /var/log/asterisk/calls.log)
; 통화 종료 시 로그 기록
; 시간, 채널명, 통화 상태 기록

; 사용방법:
; 1. 로그 확인: tail -f /var/log/asterisk/calls.log
; 2. 통화 품질 확인: asterisk -rx 'core show channels'

 

 

6. 오류 처리 설정

[error-handling]
; 통화 실패 시 처리
exten => failed,1,NoOp(통화 실패 처리)        ; 디버깅용 메시지
same => n,Playback(sorry-error)              ; 오류 안내 메시지 재생
same => n,Goto(fallback,${EXTEN},1)          ; 대체 경로로 이동

[fallback]
; 대체 경로 처리
exten => _X.,1,Dial(SIP/backup-${EXTEN},30)  ; 백업 시스템으로 통화 시도
same => n,Queue(emergency,t)                  ; 비상 대기열로 전환
same => n,Hangup()

; 사용방법:
; 1. 오류 로그 확인: asterisk -rx 'core show hints'
; 2. 대기열 상태 확인: asterisk -rx 'queue show'

 

 

 

다음 포스팅에서는 메세징 음성 메세지 구축간 공부한 내용에 대해서 작성을 해보도록 하겠습니다.

반응형