본문 바로가기
업무 기록/ETC

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

by code2772 2024. 11. 4.

[ 목차 ]

    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'

     

     

     

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

    반응형