[C#] DTMF (Dual Tone Multi Frequency) 전송 방식 정리 및 RTP 패킷 구현
DTMF 신호 전송은 VoIP 및 전화 시스템에서 숫자 입력을 처리할 때 핵심적인 요소입니다.
이 글에서는 C#으로 구현하는 DTMF RTP 패킷 생성 방법과 함께, In-band와 Out-of-band 전송 방식의 차이점도 정리합니다.
1. DTMF 전송 방식: In-band vs Out-of-band
In-band 방식
- DTMF 신호를 음성 주파수 대역 내에서 전송
- 추가 경로가 필요 없고 구현이 간단
- 음성 압축, 잡음 등의 영향으로 신호 왜곡 가능성 있음
Out-of-band 방식
- DTMF 신호를 음성 신호와 별도로 RTP 또는 SIP 메시지로 전송
- 정확하고 신뢰도 높은 전송 가능
- VoIP 시스템에서 표준적으로 사용됨
2. RTP를 이용한 DTMF Out-of-band 전송
VoIP 환경에서는 RTP(Real-time Transport Protocol)을 통해 DTMF 신호를 전송하는 것이 일반적입니다.
RFC 4733에 따라 DTMF 이벤트를 위한 Payload Type(보통 101)을 사용합니다.
RTP 패킷 주요 필드
- eventId: 전송할 키 (0~9, *, #, A~D)
- duration: 신호 지속 시간 (ms)
- end: 시작 또는 종료 여부
- volume: DTMF 톤의 음량
3. C# RTP 패킷 생성 예제
다음은 C# 코드로 DTMF RTP 패킷을 생성하는 예시입니다:
public RTPPacket MakeDtmfRTPPacket(int eventId, int duration, bool end, int volume)
{
RTPPacket rtpPacket = new RTPPacket();
byte[] dtmfRtpPayload = new byte[4];
dtmfRtpPayload[0] = (byte)eventId;
dtmfRtpPayload[1] = (byte)((end ? 1 : 0) << 7 | (volume & 0x1F));
dtmfRtpPayload[2] = (byte)((duration >> 8) & 0xFF);
dtmfRtpPayload[3] = (byte)(duration & 0xFF);
rtpPacket.data = dtmfRtpPayload;
rtpPacket.sequenceNumber = NextSeqNo();
rtpPacket.timestamp = NextTimeStamp(dtmfRtpPayload.Length);
rtpPacket.sourceId = SourceId;
rtpPacket.version = 2;
rtpPacket.marker = end;
rtpPacket.PayloadType = 101;
rtpPacket.headerLength = RTPPacket.MinHeaderLength;
return rtpPacket;
}
이 함수는 DTMF 정보를 담은 RTP 패킷을 생성하여 VoIP 시스템과 연동하는 데 사용할 수 있습니다.
4. Wireshark에서 RTP DTMF 패킷 필터링
Wireshark를 사용하면 DTMF RTP 패킷을 분석할 수 있습니다.
RTP 패킷의 Payload Type이 DTMF 전용인 경우(보통 101), 아래 필터를 사용하면 DTMF 패킷만 필터링할 수 있습니다.
((rtp) && (rtp.p_type == 101))
이 필터는 실시간 패킷 분석 중 DTMF 신호 전송 흐름을 모니터링할 때 유용합니다.
DTMF는 전화 시스템과 VoIP 환경에서 핵심적인 입력 방식입니다.
In-band 방식은 구현이 간단하지만 음질에 영향을 받을 수 있고,
Out-of-band 방식은 RTP를 통해 더 정확하고 안정적인 전송이 가능합니다.
'c#' 카테고리의 다른 글
[C#] WPF Button 이미지 (0) | 2024.07.17 |
---|---|
[C#] 오디오 입력장치 조회 (0) | 2024.07.11 |
[C#] AES256 암/복호화 (0) | 2024.07.10 |