[olive] ask again and over again.

일주일 전, 한가지 풀리지 않는 문제가 있었다.

바로 Call transfer 에 관한 문제였다.

일단 parking 된 channel 을 Transfer 하고 싶은데, AMI 명령어 만으로는 해결이 안되는 것이었다.
물론 AMI 명령어로 Transfer 와 관련된 명령이 있긴했다.

blindtransfer
redirect

하지만 내가 원하는 것은 아니었다. 왜냐하면 위의 명령어들은 peer 로 transfer 를 하는 것이 아닌, context 의 extension 으로 transfer 를 하는 것이기 때문이다.

한참동안 고민을 하다가 Asterisk IRC 채널에 물어보고 답변을 들었다.

“Asterisk 는 그렇게 동작을 안해. 왜냐하면 그렇게 디자인 된 것이 아니거든. Transfer 를 하고자 한다면, 어느 순간에는 Dialplan 을 써야할 때가 올꺼야.”

그랬었다. 애초에 불가능한 것이었다.

그랬는데.. 그새 깜박했다.
왜냐하면.. 오늘 또 똑같은 질문을 했기 때문이다.

I thought it was clear a week ago when you asked the same thing and got the same answer’

하아.. 부끄러운 질문이었다.. ^^;;;;

[olive] fixed stupid bug.

바쁜 주말이었다.

Make call 관련 버그때문에 너무 신경이 쓰이는 주말이었다.
다음에 같은 실수를 하지 않을까 싶은 마음에 버그 내용을 정리한다.

버그 현상은 다음과 같았다.

1. Originate
2. Create new channel
3. Dial begin
4. Hangup – Almost immediate call hangup after dial begin

원래 의도했던 상황은 다음과 같았다.

1. Originate
2. Create new channel
3. Dial begin
4. Dial End – Wait until destination pick up the phone or 30 seconds.5. Parked call
6. Hangup

자꾸만 Dial begin 직후 콜이 끊어지는 것이었다. Asterisk cli 에서 명령어로 거의 같은 옵션으로 originate 를 했을 때는 예상했던 시나리오 대로 흘러갔다.
이상했다… 문제가 될 부분은 없어보였는데, 콜이 너무 빨리 종료되는 것이 이상했다.

무엇이 문제일까?

테스트 환경은 다음과 같았다.

테스트 전화번호는 IBK VIP 고객 센터 전화번호였다.
100% 응대를 하는 곳이었다.

트렁크 관련 설정 역시 문제가 될 부분은 없었다.
다른 VoIP Client 프로그램으로 테스트시 정상이었다.

즉, 테스트 환경으로 인한 문제는 아니었다.

콜이 끊어지는 현상은 크게 두 가지로 분석할 수 있었다.
발신자 쪽에서 끊던가, 수신자 쪽에서 끊던가.

Hangup event 발생시, Hangup 사유가 같이 따라온다.
처음에는 그 부분을 눈여겨 보지 않았다.
단지 문제 해결에만 급급해서 로그분석을 게을리 했기 때문이다.

Hangup 사유는 3번 Remote end is ringing 이었다.

AST_CONTROL_RINGING = 3,        /*!< Remote end is ringing */

이게 무슨 말이냐면.. 상대쪽 전화기에 벨이 울리고 있는데, 우리쪽에서 전화를 끊은 것이다.
이제,상대쪽 전화기의 문제는 아니라는 점이 명백해졌다.

그렇다면 문제는 단 하나, 프로그램상에서 originate 를 할때 전달되는 옵션에 문제가 있는 것이다.
왜냐하면 cli 에서는 문제가 없기 때문이다.

프로그램에서 originate 를 할 때 옵션을 넣는 부분들을 하나씩 하나씩 주석 처리하고 다시 테스트를 했다.
그리고 문제를 찾았다.

문제는 Originate 시, 설정하는 timeout 에 있었다.

https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+ManagerAction_Originate

에 originate 명령에 대한 설명이 나와있다.

본디, originate 시, 30초의 timeout 을 주려고 생각했었다.
그런데, 문제는 단위가 ms(밀리초) 단위였던 것.

그런데 거기까지 생각을 못하고 그냥 30 을 입력해 버린 것이었다.

그렇게 되니, 단지 30 ms 까지만 대기하고 timeout으로 콜을 끊어버린 것이 문제였다.

설정값 30 을 30000 으로 수정 후, 문제가 해결되었다.

고생은 했지만, 이래저래 얻은 것이 많은 버그였다. 🙂

[olive] sip trunk test

Sip trunk 관련 테스트 정리.

register 설정을 했다면, sip peer 설정시, 별도의 defaultuser 항목과 secret 항목은 설정하지 않아도 된다. 하지만 fromuser와 from domain 항목은 설정해야 한다. 하지만 모든 경우에 적용되는 것이 아니라, 이는 sip provider 에서 어떻게 지원하는지에 따른 부분이기 때문에 그때 그때 마다 설정을 맞춰야 한다.

가장 좋은 방법은 register 설정과 peer 설정 모두에 username 과 password 설정을 전부 하는 것.

[olive] consider about sla

Outbound 용 Trunk 관리를 어떻게 할까 고민을 하다가 SLA 까지 생각하게 되었다.

SLA란, 간단히 말해서 Asterisk 에서 제공하는 가상 공유 Device 관리자 같은 것인데.. 여러개의 트렁크를 하나의 가상화된 장치 디바이스로 묶어서 사용할 수 있도록 하는 것이다.

다시 말하자면, SLA를 사용하게 되면 각각의 트렁크의 상태를 일일이 선택할 필요 없이 가상화 디바이스로 콜을 던지면 되는 것이다.

아직 계속 고민 중이지만 충분히 고려해볼만한 가치가 있는 기술인 것 같다.

단점으로는 아직까진 설정이 복잡하고, 실제 사용여부와는 상관없이 DAHDI 모듈 설치가 필요하다는 점이다.

아래의 링크에 분석한 내용을 정리해두었다.

http://wiki.pchero21.com/wiki/Asterisk-sla.conf#SLA_trunk_configuration