Mediastreamer2 VoIP เชเชจเซเชœเชฟเชจเชจเซ€ เชถเซ‹เชงเช–เซ‹เชณ. เชญเชพเช— 7

เชฒเซ‡เช–เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชฎเชพเชฐเชพ เชชเชฐเชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เชเซ‡เชจ เชšเซ‡เชจเชฒ.

Mediastreamer2 VoIP เชเชจเซเชœเชฟเชจเชจเซ€ เชถเซ‹เชงเช–เซ‹เชณ. เชญเชพเช— 7

RTP เชชเซ‡เช•เซ‡เชŸเซเชธเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ TShark เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

Mediastreamer2 VoIP เชเชจเซเชœเชฟเชจเชจเซ€ เชถเซ‹เชงเช–เซ‹เชณ. เชญเชพเช— 7

เช›เซ‡เชฒเซเชฒเชพเชฎเชพเช‚ เชฒเซ‡เช– เช…เชฎเซ‡ เชŸเซ‹เชจ เชœเชจเชฐเซ‡เชŸเชฐ เช…เชจเซ‡ เชŸเซ‹เชจ เชกเชฟเชŸเซ‡เช•เซเชŸเชฐเชฎเชพเช‚เชฅเซ€ เชฐเชฟเชฎเซ‹เชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชธเชฐเซเช•เชฟเชŸ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซเชฏเซเช‚, เชœเซ‡เชจเซ€ เชตเชšเซเชšเซ‡ เช†เชฐเชŸเซ€เชชเซ€ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เชšเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹.

เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ RTP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‘เชกเชฟเช“ เชธเชฟเช—เซเชจเชฒ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช เช›เซ€เช. เชชเซเชฐเชฅเชฎ, เชšเชพเชฒเซ‹ เช…เชฎเชพเชฐเซ€ เชŸเซ‡เชธเซเชŸ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช…เชจเซ‡ เชฐเซ€เชธเซ€เชตเชฐเชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเซ€เช เช…เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชŸเซเชฐเชพเชซเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ RTP เชธเซเชŸเซเชฐเซ€เชฎเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชถเซ€เช–เซ€เช.

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เชตเชงเซ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เช•เชฏเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชคเชคเซเชตเซ‹ RTP เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เช•เชฏเชพ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ mstest6.c เชซเชพเช‡เชฒเชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช…เชจเซ‡ เชฐเซ€เชธเซ€เชตเชฐ เชฎเชพเชŸเซ‡ เชฌเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซ€เช เช›เซ€เช; เช…เชฎเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เช•เชพเชฐเซเชฏเซ‹ เชฎเซ‚เช•เซ€เชถเซเช‚ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฌเช‚เชจเซ‡ เช•เชฐเซ‡ เช›เซ‡. เชคเซเชฐเซ€เชœเซ€ เชซเชพเช‡เชฒเชฎเชพเช‚, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€เชถเซเช‚ mstest_common.c, เชคเซ‡ เชถเชพเชฎเซ‡เชฒ เชจเชฟเชฐเซเชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช…เชจเซ‡ เชฐเซ€เชธเซ€เชตเชฐ เชฆเซเชตเชพเชฐเชพ เช•เชจเซ‡เช•เซเชŸ เชฅเชถเซ‡:

/* ะคะฐะนะป mstest_common.c ะžะฑั‰ะธะต ั„ัƒะฝะบั†ะธะธ ะดะปั ะฟะตั€ะตะดะฐั‚ั‡ะธะบะฐ ะธ ะฟั€ะธะตะผะฝะธะบะฐ. */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/msrtp.h>
#include <ortp/rtpsession.h>
#include <ortp/payloadtype.h>

define PCMU 0

/*---------------------------------------------------------*/
/* ะคัƒะฝะบั†ะธั ั€ะตะณะธัั‚ั€ะฐั†ะธะธ ั‚ะธะฟะพะฒ ะฟะพะปะตะทะฝั‹ั… ะฝะฐะณั€ัƒะทะพะบ. */
void register_payloads(void)
{  
 /* ะ ะตะณะธัั‚ั€ะธั€ัƒะตะผ ั‚ะธะฟั‹ ะฝะฐะณั€ัƒะทะพะบ ะฒ ั‚ะฐะฑะปะธั†ะต ะฟั€ะพั„ะธะปะตะน. ะŸะพะทะดะฝะตะต, ะฟะพ ะธะฝะดะตะบััƒ    ะฒะทัั‚ะพะผัƒ 
     ะธะท ะทะฐะณะพะปะพะฒะบะฐ RTP-ะฟะฐะบะตั‚ะฐ ะธะท ัั‚ะพะน ั‚ะฐะฑะปะธั†ั‹ ะฑัƒะดัƒั‚ ะธะทะฒะปะตะบะฐั‚ัŒัั    ะฟะฐั€ะฐะผะตั‚ั€ั‹ 
     ะฝะฐะณั€ัƒะทะบะธ, ะฝะตะพะฑั…ะพะดะธะผั‹ะต ะดะปั ะดะตะบะพะดะธั€ะพะฒะฐะฝะธั ะดะฐะฝะฝั‹ั… ะฟะฐะบะตั‚ะฐ. */
  rtp_profile_set_payload (&av_profile, PCMU, &payload_type_pcm8000);
}

/*---------------------------------------------------------*/
/* ะญั‚ะฐ ั„ัƒะฝะบั†ะธั ัะพะทะดะฐะฝะฐ ะธะท ั„ัƒะฝะบั†ะธะธ create_duplex_rtpsession() ะฒ audiostream.c   ะผะตะดะธะฐัั‚ั€ะธะผะตั€ะฐ2. */
 static RtpSession *create_rtpsession (int loc_rtp_port, int loc_rtcp_port,  bool_t ipv6, RtpSessionMode mode)
{  
  RtpSession *rtpr;  rtpr = rtp_session_new ((int) mode);  
  rtp_session_set_scheduling_mode (rtpr, 0);  
  rtp_session_set_blocking_mode (rtpr, 0);
  rtp_session_enable_adaptive_jitter_compensation (rtpr, TRUE);
  rtp_session_set_symmetric_rtp (rtpr, TRUE); 
  rtp_session_set_local_addr (rtpr, ipv6 ? "::" : "0.0.0.0", loc_rtp_port,  loc_rtcp_port); 
  rtp_session_signal_connect (rtpr, "timestamp_jump",  (RtpCallback) rtp_session_resync, 0);
  rtp_session_signal_connect (rtpr, "ssrc_changed",  (RtpCallback) rtp_session_resync, 0);
  rtp_session_set_ssrc_changed_threshold (rtpr, 0);
  rtp_session_set_send_payload_type(rtpr, PCMU);

  /* ะŸะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฒั‹ะบะปัŽั‡ะฐะตะผ RTCP-ัะตััะธัŽ, ั‚ะฐะบ ะบะฐะบ ะฝะฐัˆ ะฟัƒะปัŒั‚ ะฝะต ะฑัƒะดะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ 
  ะตั‘. */  
 rtp_session_enable_rtcp (rtpr, FALSE);
 return rtpr;
}

เชนเชตเซ‡ เช…เชฒเช— เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เชซเชพเช‡เชฒ:

/* ะคะฐะนะป mstest6.c ะ˜ะผะธั‚ะฐั‚ะพั€ ะฟัƒะปัŒั‚ะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั (ะฟะตั€ะตะดะฐั‚ั‡ะธะบะฐ). */
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>
#include "mstest_common.c"

/*----------------------------------------------------------*/
int main()
{ 
  ms_init();

/* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปัั€ั‹ ั„ะธะปัŒั‚ั€ะพะฒ. */
  MSFilter *voidsource = ms_filter_new(MS_VOID_SOURCE_ID); 
  MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);

/* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ ะบะพะดะตั€ะฐ. */
  MSFilter *encoder = ms_filter_create_encoder("PCMU");

/* ะ ะตะณะธัั‚ั€ะธั€ัƒะตะผ ั‚ะธะฟั‹ ะฝะฐะณั€ัƒะทะบะธ. */
  register_payloads();

/* ะกะพะทะดะฐะตะผ RTP-ัะตััะธัŽ ะฟะตั€ะตะดะฐั‚ั‡ะธะบะฐ. */
  RtpSession *tx_rtp_session = create_rtpsession (8010, 8011, FALSE, RTP_SESSION_SENDONLY);  
 rtp_session_set_remote_addr_and_port(tx_rtp_session,"127.0.0.1", 7010, 7011); 
 rtp_session_set_send_payload_type(tx_rtp_session, PCMU);  
 MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID); 
 ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, tx_rtp_session);

/* ะกะพะทะดะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ - ั‚ะธะบะตั€. */ 
 MSTicker *ticker_tx = ms_ticker_new();

/* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฟะตั€ะตะดะฐั‚ั‡ะธะบะฐ. */ 
 ms_filter_link(voidsource, 0, dtmfgen, 0);  
 ms_filter_link(dtmfgen, 0, encoder, 0);
 ms_filter_link(encoder, 0, rtpsend, 0);

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ. */
  ms_ticker_attach(ticker_tx, voidsource);

/* ะะฐัั‚ั€ะฐะธะฒะฐะตะผ ัั‚ั€ัƒะบั‚ัƒั€ัƒ, ัƒะฟั€ะฐะฒะปััŽั‰ัƒัŽ ะฒั‹ั…ะพะดะฝั‹ะผ ัะธะณะฝะฐะปะพะผ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ. */ 
 MSDtmfGenCustomTone dtmf_cfg; 
 dtmf_cfg.tone_name[0] = 0; 
 dtmf_cfg.duration = 1000; 
 dtmf_cfg.frequencies[0] = 440;

/* ะ‘ัƒะดะตะผ ะณะตะฝะตั€ะธั€ะพะฒะฐั‚ัŒ ะพะดะธะฝ ั‚ะพะฝ, ั‡ะฐัั‚ะพั‚ัƒ ะฒั‚ะพั€ะพะณะพ ั‚ะพะฝะฐ ัƒัั‚ะฐะฝะพะฒะธะผ ะฒ 0. */  
 dtmf_cfg.frequencies[1] = 0; 
 dtmf_cfg.amplitude = 1.0; 
 dtmf_cfg.interval = 0.;  
 dtmf_cfg.repeat_count = 0.;

/* ะžั€ะณะฐะฝะธะทัƒะตะผ ั†ะธะบะป ัะบะฐะฝะธั€ะพะฒะฐะฝะธั ะฝะฐะถะฐั‚ั‹ั… ะบะปะฐะฒะธัˆ. ะ’ะฒะพะด ะฝัƒะปั ะทะฐะฒะตั€ัˆะฐะตั‚
* ั†ะธะบะป ะธ ั€ะฐะฑะพั‚ัƒ ะฟั€ะพะณั€ะฐะผะผั‹. */  
 char key='9'; 
 printf("ะะฐะถะผะธั‚ะต ะบะปะฐะฒะธัˆัƒ ะบะพะผะฐะฝะดั‹, ะทะฐั‚ะตะผ ะฒะฒะพะด.n"  
"ะ”ะปั ะทะฐะฒะตั€ัˆะตะฝะธั ะฟั€ะพะณั€ะฐะผะผั‹ ะฒะฒะตะดะธั‚ะต 0.n");  
while(key != '0')  
{
 key = getchar();   
 if ((key >= 49) && (key <= 54)) 
   {
      printf("ะžั‚ะฟั€ะฐะฒะปะตะฝะฐ ะบะพะผะฐะฝะดะฐ: %cn", key);
      /* ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‡ะฐัั‚ะพั‚ัƒ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ ะฒ ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั
       * ะบะพะดะพะผ ะฝะฐะถะฐั‚ะพะน ะบะปะฐะฒะธัˆะธ. */
      dtmf_cfg.frequencies[0] = 440 + 100*(key-49);

      /* ะ’ะบะปัŽั‡ะฐะตะผ ะทะฒัƒะบะพะฒะพะน ะณะตะฝะตั€ะฐั‚ะพั€ c ะพะฑะฝะพะฒะปะตะฝะฝะพะน ั‡ะฐัั‚ะพั‚ะพะน. */
      ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,      (void*)&dtmf_cfg); 
   }
   /* ะฃะบะปะฐะดั‹ะฒะฐะตะผ ั‚ั€ะตะด ะฒ ัะฟัั‡ะบัƒ ะฝะฐ 20ะผั, ั‡ั‚ะพะฑั‹ ะดั€ัƒะณะธะต ั‚ั€ะตะดั‹ 
   * ะฟั€ะธะปะพะถะตะฝะธั ะฟะพะปัƒั‡ะธะปะธ ะฒั€ะตะผั ะฝะฐ ั€ะฐะฑะพั‚ัƒ. */ 
  ms_usleep(20000);
  }
}

เช…เชจเซ‡ เช…เช‚เชคเซ‡, เชฐเซ€เชธเซ€เชตเชฐ เชซเชพเช‡เชฒ:

/* ะคะฐะนะป mstest7.c ะ˜ะผะธั‚ะฐั‚ะพั€ ะฟั€ะธะตะผะฝะธะบะฐ. */
include <mediastreamer2/mssndcard.h>
include <mediastreamer2/mstonedetector.h>
include <mediastreamer2/msrtp.h>

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะทะฐะณะพะปะพะฒะพั‡ะฝั‹ะน ั„ะฐะนะป ั ั„ัƒะฝะบั†ะธัะผะธ ัƒะฟั€ะฐะฒะปะตะฝะธั ัะพะฑั‹ั‚ะธัะผะธ  ะผะตะดะธะฐัั‚ั€ะธะผะตั€ะฐ.*/
include <mediastreamer2/mseventqueue.h>
/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ั„ะฐะนะป ะพะฑั‰ะธั… ั„ัƒะฝะบั†ะธะน. */
include "mstest_common.c"

/* ะคัƒะฝะบั†ะธั ะพะฑั€ะฐั‚ะฝะพะณะพ ะฒั‹ะทะพะฒะฐ, ะพะฝะฐ ะฑัƒะดะตั‚ ะฒั‹ะทะฒะฐะฝะฐ ั„ะธะปัŒั‚ั€ะพะผ, ะบะฐะบ ั‚ะพะปัŒะบะพ ะพะฝ   ะพะฑะฝะฐั€ัƒะถะธั‚ ัะพะฒะฟะฐะดะตะฝะธะต ั…ะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบ ะฒั…ะพะดะฝะพะณะพ ัะธะณะฝะฐะปะฐ ั ะทะฐะดะฐะฝะฝั‹ะผะธ. */
static void tone_detected_cb(void *data, MSFilter *f, unsigned int event_id,MSToneDetectorEvent *ev)
{ 
 printf("ะŸั€ะธะฝัั‚ะฐ ะบะพะผะฐะฝะดะฐ: %sn", ev->tone_name);
}

/*----------------------------------------------------------*/
int main()
{ 
 ms_init();

/* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปัั€ั‹ ั„ะธะปัŒั‚ั€ะพะฒ. */  
 MSSndCard *card_playback =  ms_snd_card_manager_get_default_card(ms_snd_card_manager_get()); 
 MSFilter *snd_card_write = ms_snd_card_create_writer(card_playback); 
 MSFilter *detector = ms_filter_new(MS_TONE_DETECTOR_ID);

/* ะžั‡ะธั‰ะฐะตะผ ะผะฐััะธะฒ ะฝะฐั…ะพะดัั‰ะธะนัั ะฒะฝัƒั‚ั€ะธ ะดะตั‚ะตะบั‚ะพั€ะฐ ั‚ะพะฝะพะฒ, ะพะฝ ะพะฟะธัั‹ะฒะฐะตั‚
* ะพัะพะฑั‹ะต ะฟั€ะธะผะตั‚ั‹ ั€ะฐะทั‹ัะบะธะฒะฐะตะผั‹ั… ัะธะณะฝะฐะปะพะฒ.*/
  ms_filter_call_method(detector, MS_TONE_DETECTOR_CLEAR_SCANS, 0);

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะบ ั„ะธะปัŒั‚ั€ัƒ ั„ัƒะฝะบั†ะธัŽ ะพะฑั€ะฐั‚ะฝะพะณะพ ะฒั‹ะทะพะฒะฐ. */  
ms_filter_set_notify_callback(detector,  (MSFilterNotifyFunc)tone_detected_cb, NULL);

/* ะกะพะทะดะฐะตะผ ะผะฐััะธะฒ, ะบะฐะถะดั‹ะน ัะปะตะผะตะฝั‚ ะบะพั‚ะพั€ะพะณะพ ะพะฟะธัั‹ะฒะฐะตั‚ ั…ะฐั€ะฐะบั‚ะตั€ะธัั‚ะธะบัƒ
* ะพะดะฝะพะณะพ ะธะท ั‚ะพะฝะพะฒ, ะบะพั‚ะพั€ั‹ะน ั‚ั€ะตะฑัƒะตั‚ัั ะพะฑะฝะฐั€ัƒะถะธะฒะฐั‚ัŒ:
ะขะตะบัั‚ะพะฒะพะต ะธะผั
* ะดะฐะฝะฝะพะณะพ ัะปะตะผะตะฝั‚ะฐ, ั‡ะฐัั‚ะพั‚ะฐ ะฒ ะณะตั€ั†ะฐั…, ะดะปะธั‚ะตะปัŒะฝะพัั‚ัŒ ะฒ ะผะธะปะปะธัะตะบัƒะฝะดะฐั…,
* ะผะธะฝะธะผะฐะปัŒะฝั‹ะน ัƒั€ะพะฒะตะฝัŒ ะพั‚ะฝะพัะธั‚ะตะปัŒะฝะพ 0,775ะ’. */
  MSToneDetectorDef scan[6]= 
 {   
    {"V+",440, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะฒะตะปะธั‡ะธั‚ัŒ ะณั€ะพะผะบะพัั‚ัŒ". */
    {"V-",540, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะผะตะฝัŒัˆะธั‚ัŒ ะณั€ะพะผะบะพัั‚ัŒ". */
    {"C+",640, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะฒะตะปะธั‡ะธั‚ัŒ ะฝะพะผะตั€ ะบะฐะฝะฐะปะฐ". */
    {"C-",740, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะฃะผะตะฝัŒัˆะธั‚ัŒ ะฝะพะผะตั€ ะบะฐะฝะฐะปะฐ". */
    {"ON",840, 100, 0.1}, /* ะšะพะผะฐะฝะดะฐ "ะ’ะบะปัŽั‡ะธั‚ัŒ ั‚ะตะปะตะฒะธะทะพั€". */
    {"OFF", 940, 100, 0.1}/* ะšะพะผะฐะฝะดะฐ "ะ’ั‹ะบะปัŽั‡ะธั‚ัŒ ั‚ะตะปะตะฒะธะทะพั€". */
  };

/* ะŸะตั€ะตะดะฐะตะผ "ะฟั€ะธะผะตั‚ั‹" ัะธะณะฝะฐะปะพะฒ ะดะตั‚ะตะบั‚ะพั€ ั‚ะพะฝะพะฒ. */
  int i; 
 for (i = 0; i < 6; i++) 
 { 
   ms_filter_call_method(detector, MS_TONE_DETECTOR_ADD_SCAN,    &scan[i]); 
 }

/* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ ะดะตะบะพะดะตั€ะฐ */
  MSFilter *decoder=ms_filter_create_decoder("PCMU");

/* ะ ะตะณะธัั‚ั€ะธั€ัƒะตะผ ั‚ะธะฟั‹ ะฝะฐะณั€ัƒะทะบะธ. */
  register_payloads();

/* ะกะพะทะดะฐะตะผ RTP-ัะตััะธัŽ ะฟั€ะธะตะผะฝะธะบะฐ. */
  MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
  RtpSession *rx_rtp_session = create_rtpsession (7010, 7011, FALSE, RTP_SESSION_RECVONLY);
  ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rx_rtp_session);

/* ะกะพะทะดะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ - ั‚ะธะบะตั€. */ 
 MSTicker *ticker_rx = ms_ticker_new();

/* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฟั€ะธั‘ะผะฝะธะบะฐ. */
  ms_filter_link(rtprecv, 0, decoder, 0);
  ms_filter_link(decoder, 0, detector, 0);
  ms_filter_link(detector, 0, snd_card_write, 0);

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ. */
  ms_ticker_attach(ticker_rx, rtprecv);
  char key='9';
  printf( "ะ”ะปั ะทะฐะฒะตั€ัˆะตะฝะธั ะฟั€ะพะณั€ะฐะผะผั‹ ะฒะฒะตะดะธั‚ะต 0.n");
  while(key != '0') 
 {
    key = getchar();
   /* ะฃะบะปะฐะดั‹ะฒะฐะตะผ ั‚ั€ะตะด ะฒ ัะฟัั‡ะบัƒ ะฝะฐ 20ะผั, ั‡ั‚ะพะฑั‹ ะดั€ัƒะณะธะต ั‚ั€ะตะดั‹    * ะฟั€ะธะปะพะถะตะฝะธั ะฟะพะปัƒั‡ะธะปะธ ะฒั€ะตะผั ะฝะฐ ั€ะฐะฑะพั‚ัƒ. */
   ms_usleep(20000); 
 }
}

เช…เชฎเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช…เชจเซ‡ เชฐเซ€เชธเซ€เชตเชฐเชจเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ€เช เช›เซ€เช, เชชเช›เซ€ เชฆเชฐเซ‡เช•เชจเซ‡ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชฒเซ‹เช‚เชš เช•เชฐเซ€เช เช›เซ€เช. เชชเช›เซ€ เชคเซ‡ เชชเชนเซ‡เชฒเชพเชจเซ€ เชœเซ‡เชฎ เช•เชพเชฐเซเชฏ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช - เชซเช•เซเชค เช†เชชเชฃเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ 1 เชฅเซ€ 6 เชธเซเชงเซ€เชจเซ€ เชธเช‚เช–เซเชฏเชพเช“ เชฆเชพเช–เชฒ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช, เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฐเซ€เชธเซ€เชตเชฐ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชฆเซ‡เช–เชพเชตเซ‹ เชœเซ‹เชˆเช. เชธเซเชชเซ€เช•เชฐเชฎเชพเช‚ เชŸเซ‹เชจ เชธเชพเช‚เชญเชณเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เชœเซ‹ เชฌเชงเซเช‚ เช†เชตเซเช‚ เช›เซ‡, เชคเซ‹ เช…เชฎเซ‡ เชฐเซ€เชธเซ€เชตเชฐ เช…เชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เชตเชšเซเชšเซ‡ เชœเซ‹เชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซเชฏเซเช‚ เช›เซ‡ - เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐเชฅเซ€ เชฐเซ€เชธเซ€เชตเชฐ เชธเซเชงเซ€ RTP เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซเช‚ เชธเชคเชค เชชเซเชฐเชธเชพเชฐเชฃ เชฅเชพเชฏ เช›เซ‡.

เชนเชตเซ‡ เชŸเซเชฐเชพเชซเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเช• เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡; เช† เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เช‰เชคเซเชคเชฎ เชตเชพเชฏเชฐเชถเชพเชฐเซเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ เช•เชจเซเชธเซ‹เชฒ เชธเช‚เชธเซเช•เชฐเชฃ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚ - เชคเซ‡เชจเซ‡ TShark เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸเชจเชพ เชตเชฐเซเชฃเชจเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ เชตเชงเซ เชšเชฐเซเชšเชพ เชฎเชพเชŸเซ‡ TShark เชชเชธเช‚เชฆ เช•เชฐเซเชฏเซเช‚. เชตเชพเชฏเชฐเชถเชพเชฐเซเช• เชธเชพเชฅเซ‡, เชฎเชจเซ‡ เชธเซเช•เซเชฐเซ€เชจเชถเซ‰เชŸเซเชธเชจเชพ เชธเชฎเซเชฆเซเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡, เชœเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชตเชพเชฏเชฐเชถเชพเชฐเซเช•เชจเซเช‚ เชจเชตเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชฌเชนเชพเชฐ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชเชกเชชเชฅเซ€ เชœเซ‚เชจเซเช‚ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เชœเซ‹ เชคเชฎเซ‡ Wireshark เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹ เชคเซ‡ เชœเชพเชฃเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชชเชฐเช‚เชคเซ เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชชเชฃ, เชนเซเช‚ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚ เช•เซ‡ เชคเชฎเซ‡ TShark เชฎเชพเช‚ เชจเชฟเชชเซเชฃเชคเชพ เชฎเซ‡เชณเชตเซ‹, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเซ€ VoIP เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชจเซเช‚ เชธเซเชตเชšเชพเชฒเชฟเชค เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚, เชคเซ‡เชฎเชœ เชฐเชฟเชฎเซ‹เชŸ เช•เซ‡เชชเซเชšเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.

เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ TShark เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

$ sudo apt-get install tshark

เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฐเซ€เชคเซ‡, เช…เชฎเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชชเซ‚เช›เซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจ เชชเชฐเชฟเชฃเชพเชฎ เชคเชชเชพเชธเซ€เช เช›เซ€เช:

$ tshark --version

เชœเซ‹ เชชเชฐเซเชฏเชพเชชเซเชค เชœเชตเชพเชฌ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ, เชคเซ‹ เช…เชฎเซ‡ เช†เช—เชณ เชšเชพเชฒเซ เชฐเชพเช–เซ€เชถเซเช‚.

เช…เชฎเชพเชฐเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡ เชซเช•เซเชค เช•เชฎเซเชชเซเชฏเซเชŸเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชœ เชœเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ tshark เชจเซ‡ เชซเช•เซเชค เช†เชตเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฌเชคเชพเชตเชตเชพเชจเซเช‚ เช•เชนเซ€ เชถเช•เซ€เช เช›เซ€เช. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชชเซ‡เช•เซ‡เชŸ เช•เซ‡เชชเซเชšเชฐ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชฒเซ‚เชชเชฌเซ‡เช• (เชฒเซ‚เชชเชฌเซ‡เช•) TShark เชตเชฟเช•เชฒเซเชช เชชเชธเชพเชฐ เช•เชฐเซ€เชจเซ‡ -ilo:

$ sudo tshark -i lo

เช…เชฎเชพเชฐเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ เชฆเซเชตเชพเชฐเชพ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชตเชฟเชถเซ‡เชจเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชคเชฐเชค เชœ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชฐเซ‡เชกเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชถเซ‡ (เชธเชคเชค, เช…เชฎเซ‡ เชฐเชฟเชฎเซ‹เชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชชเชฐเชจเซเช‚ เชฌเชŸเชจ เชฆเชฌเชพเชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชจเชนเซ€เช‚ เชคเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ). เช•เชฆเชพเชš เชคเชฎเชพเชฐเชพ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชชเชฐ เชเชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช›เซ‡ เชœเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฒเซ‚เชช เชฆเซเชตเชพเชฐเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฃ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฎเชจเซ‡ เช…เชฎเชพเชฐเชพ เช…เชจเซ‡ เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชจเชพ เชชเซ‡เช•เซ‡เชŸเซเชธเชจเซเช‚ เชฎเชฟเชถเซเชฐเชฃ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡. เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เชธเซ‚เชšเชฟเชฎเชพเช‚ เช…เชฎเชจเซ‡ เชซเช•เซเชค เช…เชฎเชพเชฐเชพ เชฐเชฟเชฎเซ‹เชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฆเซเชตเชพเชฐเชพ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชœ เชฆเซ‡เช–เชพเชฏ เช›เซ‡, เช…เชฎเซ‡ เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐ เชฆเซเชตเชพเชฐเชพ เชซเชฟเชฒเซเชŸเชฐ เช‰เชฎเซ‡เชฐเซ€เชถเซเช‚. Ctrl-C เชฆเชฌเชพเชตเซ€เชจเซ‡ เช…เชฎเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเช•เชจเซ‡ เชฌเช‚เชง เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐ เชฎเชพเชŸเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชฆเชพเช–เชฒ เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชจเซ‹ เชฐเชฟเชฎเซ‹เชŸ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชคเซ‡เชจเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ (8010) เชฎเชพเชŸเซ‡ เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡: -f "เชฏเซเชกเซ€เชชเซ€ เชชเซ‹เชฐเซเชŸ 8010". เชนเชตเซ‡ เช…เชฎเชพเชฐเซ€ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชถเซ‡:

$ sudo tshark -i lo -f "udp port 8010"

เชจเซ€เชšเซ‡เชจเซเช‚ เช†เช‰เชŸเชชเซเชŸ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชฆเซ‡เช–เชพเชถเซ‡ (เชชเซเชฐเชฅเชฎ 10 เชฒเซ€เชŸเซ€เช“):

 1 0.000000000    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172 
 2 0.020059705    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172
 3 0.040044409    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172 
 4 0.060057104    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172
 5 0.080082311    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172  
 6 0.100597153    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172 
 7 0.120122668    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172
 8 0.140204789    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172
 9 0.160719008    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172
10 0.180673685    127.0.0.1 โ†’ 127.0.0.1    UDP 214 8010 โ†’ 7010 Len=172

เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡, เช† เชชเซ‡เช•เซ‡เชŸเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช‡เชตเซ‡เชจเซเชŸเซเชธเชจเซ€ เชเช• เช•เซเชฐเชฎเชพเช‚เช•เชฟเชค เชธเซ‚เชšเชฟ เช›เซ‡, เชœเซเชฏเชพเช‚ เชฆเชฐเซ‡เช• เชฒเชพเช‡เชจ เช เช†เช—เชพเชฎเซ€ เชชเซ‡เช•เซ‡เชŸ เชตเชฟเชถเซ‡เชจเซ‹ เชธเช‚เชฆเซ‡เชถ เช›เซ‡ เชœเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชจเซ‹เช‚เชงเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เช…เชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช—เชจเซ€ เช•เชพเชณเชœเซ€ เชฒเซ€เชงเซ€ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐเชฎเชพเช‚เชฅเซ€ เชซเช•เซเชค เชชเซ‡เช•เซ‡เชŸเซ‹ เชตเชฟเชถเซ‡เชจเชพ เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ‡ เชธเซ‚เชšเชฟเชฎเชพเช‚ เชœเซ‹เชˆเช เช›เซ€เช. เช†เช—เชณ, เชšเชพเชฒเซ‹ เช† เช•เซ‹เชทเซเชŸเช•เชจเซ‡ เช•เซ‰เชฒเชฎ เชจเช‚เชฌเชฐเซ‹ เชฆเซเชตเชพเชฐเชพ เชกเชฟเชธเชฟเชซเชฐ เช•เชฐเซ€เช:

เช‡เชตเซ‡เชจเซเชŸ เชจเช‚เชฌเชฐ.
เชคเซ‡เชจเซ€ เช˜เชŸเชจเชพเชจเซ‹ เชธเชฎเชฏ.
เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เชธเซเชคเซเชฐเซ‹เชค IP เชธเชฐเชจเชพเชฎเซเช‚ เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เช—เช‚เชคเชตเซเชฏ IP เชธเชฐเชจเชพเชฎเซเช‚.
เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ UDP เชคเชฐเซ€เช•เซ‡ เชฌเชคเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ RTP เชชเซ‡เช•เซ‡เชŸเซ‹ UDP เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เช…เช‚เชฆเชฐ เชชเซ‡เชฒเซ‹เชก เชคเชฐเซ€เช•เซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
เชฌเชพเชˆเชŸเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸเชจเซเช‚ เช•เชฆ.
เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชธเซเชคเซเชฐเซ‹เชค เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐ เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เช—เช‚เชคเชตเซเชฏ เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐ.
เชชเซ‡เช•เซ‡เชŸ เชชเซ‡เชฒเซ‹เชกเชจเซเช‚ เช•เชฆ, เช…เชนเซ€เช‚เชฅเซ€ เช†เชชเชฃเซ‡ เชจเชฟเชทเซเช•เชฐเซเชท เชชเชฐ เช†เชตเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซเช‚ เชŸเซเชฐเชพเชจเซเชธเชฎเซ€เชŸเชฐ 172 เชฌเชพเชˆเชŸเชจเชพ เช•เชฆเชจเชพ RTP เชชเซ‡เช•เซ‡เชŸ เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชœเซ‡ เช›เชพเชคเซ€เชฎเชพเช‚ เชฌเชคเช•เชจเซ€ เชœเซ‡เชฎ, 214 เชฌเชพเชˆเชŸเชจเชพ เช•เชฆเชจเชพ UDP เชชเซ‡เช•เซ‡เชŸเชจเซ€ เช…เช‚เชฆเชฐ เชธเซเชฅเชฟเชค เช›เซ‡.
เชนเชตเซ‡ UDP เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เช…เช‚เชฆเชฐ เชœเซ‹เชตเชพเชจเซ‹ เชธเชฎเชฏ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡, เช† เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ TShark เชจเซ‡ เช•เซ€เชจเชพ เชตเชฟเชธเซเชคเซƒเชค เชธเซ‡เชŸ เชธเชพเชฅเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เชถเซเช‚:

sudo tshark -i lo -f "udp port 8010"  -P -V -O rtp -o rtp.heuristic_rtp:TRUE -x

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช†เช‰เชŸเชชเซเชŸ เชธเชฎเซƒเชฆเซเชง เชฅเชถเซ‡ - เชชเซ‡เช•เซ‡เชœเชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชธเชพเชฎเช—เซเชฐเซ€เชจเซเช‚ เชกเชฟเช•เซเชฐเชฟเชชเซเชถเชจ เชœเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เชคเซ‡ เชฆเชฐเซ‡เช• เช‡เชตเซ‡เชจเซเชŸเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เช†เช‰เชŸเชชเซเชŸเชจเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เช•เชพเช‚ เชคเซ‹ Ctrl-C เชฆเชฌเชพเชตเซ€เชจเซ‡ TSharkเชจเซ‡ เชฐเซ‹เช•เซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชฅเชตเชพ เชฐเชจ เช•เชฎเชพเชจเซเชกเชฎเชพเช‚ เชŸเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เช‰เชฎเซ‡เชฐเซ€เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชคเซ‡เชจเชพ เช†เช‰เชŸเชชเซเชŸเชจเซเช‚ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชซเชพเช‡เชฒเชจเซเช‚ เชจเชพเชฎ, tee <filename> เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

$ sudo tshark -i lo -f "udp port 8010"  -P -V -O rtp -o rtp.heuristic_rtp:TRUE -x | tee  log.txt

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เช†เชชเชฃเซ‡ เชซเชพเชˆเชฒเชฎเชพเช‚ เชถเซเช‚ เชฎเซ‡เชณเชตเซเชฏเซเช‚, เช…เชนเซ€เช‚ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชชเชนเซ‡เชฒเซเช‚ เชชเซ‡เช•เซ‡เชœ เช›เซ‡:

1 0.000000000    127.0.0.1 โ†’ 127.0.0.1    RTP 214 PT=ITU-T G.711 PCMU, SSRC=0x6B8B4567, Seq=58366, Time=355368720
Frame 1: 214 bytes on wire (1712 bits), 214 bytes captured (1712 bits) on interface 0
Ethernet II, Src: 00:00:00_00:00:00 (00:00:00:00:00:00), Dst: 00:00:00_00:00:00 (00:00:00:00:00:00)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1User Datagram Protocol, Src Port: 8010, Dst Port: 7010
Real-Time Transport Protocol    [Stream setup by HEUR RT (frame 1)]
        [Setup frame: 1] 
       [Setup Method: HEUR RT]
    10.. .... = Version: RFC 1889 Version (2)
    ..0. .... = Padding: False
    ...0 .... = Extension: False
    .... 0000 = Contributing source identifiers count: 0   
   0... .... = Marker: False
    Payload type: ITU-T G.711 PCMU (0)
    Sequence number: 58366    [Extended sequence number: 58366]
    Timestamp: 355368720
    Synchronization Source identifier: 0x6b8b4567 (1804289383)
    Payload: ffffffffffffffffffffffffffffffffffffffffffffffff...

0000  00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00   ..............E.
0010  00 c8 3c 69 40 00 40 11 ff b9 7f 00 00 01 7f 00   ..<i@.@.........
0020  00 01 1f 4a 1b 62 00 b4 fe c7 80 00 e3 fe 15 2e   ...J.b..........
0030  7f 10 6b 8b 45 67 ff ff ff ff ff ff ff ff ff ff   ..k.Eg..........
0040  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0050  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0060  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0070  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0080  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
0090  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00a0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00b0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00c0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff   ................
00d0  ff ff ff ff ff ff                                  ......

เช…เชฎเซ‡ เช†เช—เชณเชจเซ‹ เชฒเซ‡เช– เช† เชธเซ‚เชšเชฟเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เชฎเชพเชนเชฟเชคเซ€เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เช…เชจเชฟเชตเชพเชฐเซเชฏเชชเชฃเซ‡ RTP เชชเซ‡เช•เซ‡เชœเชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชฐเชšเชจเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹