Su'esu'e le afi Mediastreamer2 VoIP. Vaega 7

O mea o le tusiga e maua mai i laʻu zen alavai.

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 7

Fa'aaogā le TShark e fa'avasega ai pusa RTP

Su'esu'e le afi Mediastreamer2 VoIP. Vaega 7

I le mulimuli tusiga Na matou faʻapipiʻiina se taʻavale mamao mamao mai le generator leo ma le leo, o fesoʻotaʻiga i le va na faʻatinoina e faʻaaoga ai le RTP stream.

I lenei tusiga, o loʻo faʻaauau pea ona matou suʻesuʻeina faʻasalalauga faʻalogo leo e faʻaaoga ai le RTP protocol. Muamua, se'i vaevae la tatou su'ega su'ega i se transmitter ma se tagata e talia ma a'oa'o pe fa'apefea ona su'esu'e le RTP stream e fa'aoga ai se su'esu'ega fe'avea'i.

O lea la, ina ia mafai ona sili atu ona tatou vaʻavaʻai poʻo fea elemene polokalame e nafa ma le RTP transmission ma e nafa ma le mauaina, matou te vaevaeina la matou faila mstest6.c i ni polokalame tutoatasi se lua mo le transmitter ma le receiver; matou te tuʻuina galuega masani e faʻaoga uma. i le faila lona tolu, lea matou te taʻua mstest_common.c, o le a faʻafesoʻotaʻi e le transmitter ma le receiver e faʻaaoga ai le faʻatonuga aofia:

/* Файл 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;
}

Ole faila ole transmitter eseese:

/* Файл 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);
  }
}

Ma le mea mulimuli, o le faila faila:

/* Файл 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); 
 }
}

Matou te tuʻufaʻatasia le transmitter ma le receiver, ona faʻalauiloa taʻitasi i lana lava faʻamafanafanaga. Ona tatau lea ona galue e pei ona i ai muamua - e tatau ona tatou tusia numera mai le 1 i le 6 i le transmitter console, ma o le tali ia i latou e tatau ona aliali mai i le faʻamafanafanaga. E tatau ona fa'alogoina leo i le failauga. Afai e faʻapea mea uma, ona matou faʻatuina lea o se fesoʻotaʻiga i le va o le tagata e taliaina ma le transmitter - o loʻo i ai le faʻaauauina o faʻasalalauga o paʻu RTP mai le transmitter i le tagata e taliaina.

O le taimi lenei e faʻapipiʻi ai se suʻesuʻega fefaʻatauaʻiga; mo lenei mea o le a matou faʻapipiʻi ai le faʻamafanafanaga o le polokalame Wireshark sili ona lelei - ua taʻua o TShark. Na ou filifilia TShark mo nisi talanoaga ina ia faafaigofie ai le faamatalaga o le pulega o polokalame. Faatasi ai ma Wireshark, o le a ou manaʻomia se sami o ata, lea e mafai ona vave tuai pe a faʻasaʻolotoina se lomiga fou o Wireshark.

Afai e te iloa faʻaoga Wireshark, e mafai ona e faʻaogaina e suʻesuʻe ai a matou faʻataʻitaʻiga. Ae e oʻo lava i lenei tulaga, ou te fautua atu e te faʻatautaia TShark, aua o le a fesoasoani ia te oe e faʻataʻitaʻi suʻega o au talosaga VoIP, faʻapea foʻi ma le faia o le puʻeina mamao.

Faʻapipiʻi TShark ma le faʻatonuga:

$ sudo apt-get install tshark

I le masani ai, matou te siakiina le faʻapipiʻiina iʻuga e ala i le fesili mo le polokalame faʻasologa:

$ tshark --version

Afai e maua se tali talafeagai, matou te faʻaauau atili.

Talu ai e na'o totonu o le komepiuta o lo'o alu a matou pepa, e mafai ona matou ta'u atu ia tshark e fa'aali na'o ia pepa. Ina ia faia lenei mea, e tatau ona e filifilia le puʻeina o pepa mai le atinaʻe matau i tua (loopback) e ala i le pasi TShark le filifiliga -ilo:

$ sudo tshark -i lo

O feʻau e uiga i pepa na lafoina e le matou transmitter o le a vave ona sasaa atu i totonu o le faʻamafanafanaga (faʻaauau, e tusa lava pe matou te oomiina le ki i luga o le mamao pe leai). Masalo o loʻo i ai polokalame i luga o lau komepiuta o loʻo tuʻuina atu foʻi pepa e ala i se faʻaoga faʻapitonuʻu, i le tulaga lea o le a matou mauaina ai se faʻafefiloi a matou ma isi tagata. Ina ia mautinoa o loʻo i totonu o le lisi matou te vaʻaia naʻo paʻu na lafo mai e la matou pule mamao, matou te faʻaopoopoina se faamama i le numera o le taulaga. I le oomiina o le Ctrl-C matou te taofi le suʻesuʻe ma faʻapipiʻi se faamama mo le numera o le taulaga e faʻaogaina e le mamao mamao e fai ma taulaga e faʻafeiloaʻi ai (8010): -f "udp port 8010". O le taimi nei o la matou laina faʻatonu o le a pei o lenei:

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

O le gaioiga o loʻo mulimuli mai o le a faʻaalia i totonu o le faʻamafanafanaga (laina 10 muamua):

 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

Mo le taimi nei, e le o ni afifi, ae o se lisi faanumera o mea na tutupu, lea o laina taʻitasi o se feʻau e uiga i le isi afifi na matauina i luga o le atinaʻe. Talu ai ua uma ona matou tausia le faʻamamaina o pepa, matou te vaʻai i le lisi naʻo feʻau e uiga i afifi mai le matou transmitter. O le isi, se'i tatou fa'avasega le laulau i numera koluma:

Numera o mea na tutupu.
Le taimi na tupu ai.
Le tuatusi IP puna o le pusa ma le tuatusi IP o loʻo i ai o le afifi.
O le faʻasologa o le afifi o loʻo faʻaalia o le UDP aua o le RTP paʻu e lafo e fai ma uta i totonu o pusa UDP.
Lapopo'a o le afifi ile paita.
Ole numera ole tau ole pusa ma le numera ole tau ole afifi.
O le tele o le uta o le paʻu, mai iinei e mafai ona tatou faʻamaonia ai o le matou transmitter e gaosia ai le RTP paʻu o le 172 bytes i le lapopoa, lea, e pei o se pato i totonu o le fatafata, o loʻo i totonu o se UDP paʻu o 214 paita i le lapopoa.
O lenei ua oʻo i le taimi e vaʻavaʻai ai i totonu o pusa UDP, mo lenei mea o le a matou faʻalauiloa TShark ma se faʻalauteleina seti o ki:

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

O se taunuuga, o le polokalama o le a faʻatamaoaigaina - o le decryption o mea i totonu o le afifi na mafua ai ona faʻaopoopoina i mea taʻitasi. Ina ia maua se vaaiga sili atu i le gaioiga, e mafai ona e taofi TShark e ala i le oomi Ctrl-C, poʻo le faʻaluaina o lana gaioiga i se faila e ala i le faʻaopoopoina o se paipa i le polokalame tee i le faʻatonuga, faʻamaonia le igoa faila, tee <filename>:

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

Sei o tatou vaʻavaʻai i mea na matou maua i le faila, o le afifi muamua lea mai ai:

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                                  ......

O le a matou tuʻuina atu le isi tala i le suʻesuʻeina o faʻamatalaga o loʻo i totonu o lenei lisi ma o le a mautinoa lava le talanoa e uiga i le fausaga i totonu o le pusa RTP.

puna: www.habr.com

Faaopoopo i ai se faamatalaga