ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 7

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŠΡ‚ Π½Π° статията Π΅ Π²Π·Π΅Ρ‚ ΠΎΡ‚ моя Π΄Π·Π΅Π½ ΠΊΠ°Π½Π°Π».

ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 7

ИзползванС Π½Π° TShark Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° RTP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ

ΠŸΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅ Π½Π° VoIP двигатСля Π½Π° Mediastreamer2. част 7

Π’ послСдния Бтатия Π‘Π³Π»ΠΎΠ±ΠΈΡ…ΠΌΠ΅ Π²Π΅Ρ€ΠΈΠ³Π° Π·Π° дистанционно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΎΠ½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈ Ρ‚ΠΎΠ½ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€, комуникацията ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π°ΡˆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° RTP ΠΏΠΎΡ‚ΠΎΠΊ.

Π’ Ρ‚Π°Π·ΠΈ статия ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π°ΡƒΠ΄ΠΈΠΎ сигнал с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° 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 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΡ‚ прСдаватСля към ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°.

Π‘Π΅Π³Π° Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π΄Π° инсталиратС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°; Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ инсталирамС ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π°Ρ‚Π° вСрсия Π½Π° ΠΎΡ‚Π»ΠΈΡ‡Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Wireshark - тя сС Π½Π°Ρ€ΠΈΡ‡Π° TShark. Π˜Π·Π±Ρ€Π°Ρ… TShark Π·Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎ обсъТданС, Π·Π° Π΄Π° улСсня описаниСто Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π‘ Wireshark Ρ‰Π΅ ΠΈΠΌΠ°ΠΌ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΌΠΎΡ€Π΅ ΠΎΡ‚ Π΅ΠΊΡ€Π°Π½Π½ΠΈ снимки, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π±ΡŠΡ€Π·ΠΎ Π΄Π° остарСят, ΠΊΠΎΠ³Π°Ρ‚ΠΎ бъдС пусната Π½ΠΎΠ²Π° вСрсия Π½Π° Wireshark.

Ако Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Wireshark, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅, Π·Π° Π΄Π° ΠΈΠ·ΡƒΡ‡Π°Π²Π°Ρ‚Π΅ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ. Но Π΄ΠΎΡ€ΠΈ ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ случай Π²ΠΈ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ Π΄Π° ΠΎΠ²Π»Π°Π΄Π΅Π΅Ρ‚Π΅ TShark, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠΉ Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ тСстванСто Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ VoIP прилоТСния, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΡ‚Π΅ дистанционно заснСманС.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ TShark с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°:

$ sudo apt-get install tshark

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ провСрявамС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ инсталацията, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΈΡ‚Π°ΠΌΠ΅ Π·Π° вСрсията Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°:

$ tshark --version

Ако сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π΅Π½ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€, ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ.

Въй ΠΊΠ°Ρ‚ΠΎ засСга Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π²Π»ΠΈΠ·Π°Ρ‚ само Π² ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° tshark Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π° само Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ улавянС Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΡ‚ интСрфСйса ΠΏΡ€ΠΈΠΌΠΊΠ° (loopback) Ρ‡Ρ€Π΅Π· ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° опцията Π½Π° TShark -ΠΈΠ»ΠΎ:

$ sudo tshark -i lo

Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡΡ‚Π° Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ нашия ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π», Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ Π΄Π° сС ΠΈΠ·Π»ΠΈΠ²Π°Ρ‚ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° (Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΎ, нСзависимо Π΄Π°Π»ΠΈ смС натиснали Π±ΡƒΡ‚ΠΎΠ½Π° Π½Π° дистанционното ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅). МоТС Π±ΠΈ Π½Π° вашия ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΡ‰ΠΎ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΏΡ€Π΅Π· Π»ΠΎΠΊΠ°Π»Π½Π° линия, Π² ΠΊΠΎΠΉΡ‚ΠΎ случай Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ смСсица ΠΎΡ‚ наши ΠΈ Ρ‡ΡƒΠΆΠ΄ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Π—Π° Π΄Π° смС сигурни, Ρ‡Π΅ Π² списъка Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ само ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ Π½Π°ΡˆΠ΅Ρ‚ΠΎ дистанционно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠΎΡ€Ρ‚. Π§Ρ€Π΅Π· натисканС Π½Π° Ctrl-C спирамС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ въвСТдамС Ρ„ΠΈΠ»Ρ‚ΡŠΡ€ Π·Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ дистанционното ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ Ρ†Π΅Π»Π΅Π²ΠΈ ΠΏΠΎΡ€Ρ‚ Π·Π° своСто ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ (8010): -f "udp ΠΏΠΎΡ€Ρ‚ 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 ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Π±Π°ΠΉΡ‚ΠΎΠ²Π΅.
ΠΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π° Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π° Π½Π° мСстоназначСниСто Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°.
Π Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° полСзния Ρ‚ΠΎΠ²Π°Ρ€ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΎΡ‚ Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΠΌ, Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚Π΅Π» Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° RTP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ с Ρ€Π°Π·ΠΌΠ΅Ρ€ 172 Π±Π°ΠΉΡ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ‚Π΅ Π² сандък сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π²ΡŠΡ‚Ρ€Π΅ Π² UDP ΠΏΠ°ΠΊΠ΅Ρ‚ с Ρ€Π°Π·ΠΌΠ΅Ρ€ 214 Π±Π°ΠΉΡ‚Π°.
Π‘Π΅Π³Π° Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π²ΡŠΡ‚Ρ€Π΅ Π² UDP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅, Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ стартирамС TShark с Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅:

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

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‰Π΅ бъдС ΠΎΠ±ΠΎΠ³Π°Ρ‚Π΅Π½ - към всяко ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅ Ρ‰Π΅ бъдС Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ Π³ΠΎ Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈΠ». Π—Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΈΠ·Ρ…ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ»ΠΈ Π΄Π° спрСтС TShark, ΠΊΠ°Ρ‚ΠΎ натиснСтС Ctrl-C, ΠΈΠ»ΠΈ Π΄Π° Π΄ΡƒΠ±Π»ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ·Ρ…ΠΎΠ΄Π° ΠΌΡƒ във Ρ„Π°ΠΉΠ», ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ към ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° tee към ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° изпълнСниС, ΠΊΠ°Ρ‚ΠΎ посочитС ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π°, tee :

$ 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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€