[ 목차 ]
728x90
반응형
Asterisk PBX( 사설교환기)
1. 개요
통신회사에서 음성 및 메세징 발송 관리를 하면서 이번에 Astrisk를 활용한 음성 메세지 시스템을 구축하면서 간단하게 공부한 내용을 정리하게 되었다.
Asterisk란?
- 오픈소스 PBX(Private Branch Exchange) 시스템
- 1999년 Mark Spencer가 개발
- 소프트웨어 기반 전화교환 시스템
- 기존 하드웨어 기반 교환기의 대안
주요 특징
- 유연한 확장성
- 다양한 프로토콜 지원 (SIP, H.323, IAX2 등)
- 무료 오픈소스
- 커스터마이징 가능
- 강력한 API 지원
통화 흐름 기본 구조
주요 구성 요소
- Caller (발신자) : 통화를 시작하는 주체, 내선 전화기 또는 외부 전화 -> 수신 요청 !
- Channel Driver (채널 드라이버) : 다양한 통신 프로토콜 처리 (SIP, IAX2 등), 물리적 연결을 논리적 채널로 변환 -> 채널 생성!
- Dialplan (다이얼플랜) : 통화 처리 규칙 정의, 호출 경로 결정 -> 통화 규칙 적용!
- Applications (애플리케이션) : 실제 통화 처리 기능 수행, 통화 연결, 녹음, 대기열 등 -> 실제 동작 수행!
- 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'
다음 포스팅에서는 메세징 음성 메세지 구축간 공부한 내용에 대해서 작성을 해보도록 하겠습니다.
반응형
'업무 기록 > ETC' 카테고리의 다른 글
QueryDSL 란, 주요 메서드 및 장단점 기본 설명 (0) | 2024.08.13 |
---|---|
테스트 코드 작성 이유 및 방법 - SpringBoot, Kotlin (0) | 2024.08.09 |
L4 로드벨런싱과 암호화 및 VIP (0) | 2024.06.11 |
[Oracle] PL/SQL정의, 기능, 대량 데이터 추가 (1) | 2024.05.22 |
SSL 인증서 확인 및 Nginx 인증서 변경 Openssl (2) | 2024.04.22 |