Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 7

Ko nga rauemi o te tuhinga i tangohia mai i taku zen teihana.

Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 7

Ma te whakamahi i te TShark hei tātari i nga paatete RTP

Te tirotiro i te miihini Mediastreamer2 VoIP. Wāhanga 7

I nga ra o mua Tuhinga I whakaemihia e matou he ara iahiko mana mamao mai i te kaihanga oro me te kaitoi oro, ko te whakawhitiwhiti korero i mahia ma te whakamahi i te awa RTP.

I roto i tenei tuhinga, ka ako tonu matou i te tuku tohu ororongo ma te whakamahi i te kawa RTP. Tuatahi, me wehe ta maatau tono whakamatautau ki te kaiwhakawhiti me te kaikawe ka ako me pehea te tirotiro i te awa RTP ma te whakamahi i te kaitirotiro waka whatunga.

Na, kia marama ake ai te kite ko nga huānga o te papatono te kawenga mo te tuku RTP me te kawenga mo te tango, ka wehewehea ta maatau konae mstest6.c ki nga kaupapa motuhake e rua mo te kaiwhakawhiti me te kaiwhiwhi; i roto i te konae tuatoru, ka kiia e matou mstest_common.c, ka honoa e te kaiwhakawhiti me te kaikawe ma te whakamahi i te tohutohu whakauru:

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

Inaianei ko te konae whakawhiti motuhake:

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

Ka mutu, ko te konae kaiwhiwhi:

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

Ka whakahiatohia e matou te kaiwhakawhiti me te kaikawe, katahi ka whakarewahia ia tangata ki tana ake papatohu. Na me mahi pera i mua - me whakauru noa tatou i nga nama mai i te 1 ki te 6 i roto i te papatohu kaiwhakawhiti, ka puta te whakautu ki a raatau ki te papatohu kaiwhiwhi. Me rongo nga oro i roto i te kaikorero. Mena he pena nga mea katoa, na kua whakatauhia e matou he hononga i waenga i te kaikawe me te kaikawe - kei te haere tonu te tuku o nga paatete RTP mai i te kaiwhakawhiti ki te kaikawe.

Ko te wa tenei ki te whakauru i tetahi kaitirotiro waka; mo tenei ka whakauruhia e matou te putanga papatohu o te kaupapa Wireshark pai - ka kiia ko TShark. I whiriwhiria e au a TShark mo etahi atu korerorero kia pai ai te whakamaarama mo te whakahaere kaupapa. Ma te Wireshark, ka hiahia ahau ki te moana o nga whakaahua, ka tere te tawhito ka tukuna he putanga hou o Wireshark.

Mena ka mohio koe ki te whakamahi Wireshark, ka taea e koe te whakamahi ki te ako i o maatau tauira. Engari ahakoa i tenei keehi, ka tūtohu ahau kia rangatira koe i a TShark, na te mea ka awhina koe ki te whakamatautau i o tono VoIP, me te mahi hopu mamao.

Tāutahia a TShark me te whakahau:

$ sudo apt-get install tshark

I nga wa o mua, ka tirohia e matou te hua whakaurunga ma te tono mo te putanga o te papatono:

$ tshark --version

Mena ka tae mai he whakautu tika, ka haere tonu taatau.

I te mea ka uru noa a matou paakete ki roto i te rorohiko mo tenei wa, ka taea e matou te kii ki a tshark kia whakaatu noa i nga paatete pera. Ki te mahi i tenei, me whiriwhiri koe i te hopu paatete mai i te atanga koropiko (loopback) ma te tuku TShark te whiringa -ilo:

$ sudo tshark -i lo

Ko nga panui e pa ana ki nga paanui ka tukuna mai e ta maatau kaiwhakawhiti ka timata tonu ki te riringi ki roto i te papatohu (i nga wa katoa, ahakoa i pehia e matou te paatene ki te mana mamao, kaore ranei). Akene he kaupapa kei runga i to rorohiko ka tukuna ano nga paakete ma te kopae a-rohe, inaa ka whiwhi matou i te ranunga o a matou me nga kete a etahi atu. Kia mohio kei roto i te rarangi ka kite matou i nga paanui ka tukuna mai e to maatau mana mamao, ka taapirihia he tātari ma te nama tauranga. Ma te pehi i te Ctrl-C ka whakamutua te kaitirotiro ka uru ki te tātari mo te tau tauranga e whakamahia ana e te mana mamao hei tauranga ūnga mo tana tuku (8010): -f "tauranga udp 8010". Inaianei ka penei te ahua o ta maatau rarangi whakahau:

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

Ko te putanga e whai ake nei ka puta ki te papatohu (10 rarangi tuatahi):

 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

I tenei wa, ehara enei i nga paakete, engari he rarangi tau o nga huihuinga, ko ia rarangi he karere mo te paanui e whai ake nei i kitea i runga i te atanga. I te mea kua oti kee taatau ki te tarai i nga paatete, ka kitea e matou i roto i te raarangi nga panui mo nga paanui mai i ta maatau kaiwhakawhiti. Panuku, me whakamaarama i tenei ripanga ma nga tau tīwae:

Tau takahanga.
Te wa i puta mai ai.
Ko te wāhitau IP puna o te pākete me te wāhitau IP ūnga o te pākete.
Ko te kawa o te paatete ka whakaatuhia hei UDP na te mea ka tukuna nga paanui RTP hei utaina i roto i nga paatete UDP.
Rahi pākete i roto i nga paita.
Te tau tauranga pūtake o te pākete me te tau tauranga ūnga o te pākete.
Ko te rahi o te utu putea, mai i konei ka taea e taatau te whakatau ka hangaia e to maatau kaiwhakawhiti nga paatete RTP o te 172 paita te rahi, he rite ki te parera i roto i te pouaka, kei roto i te kete UDP o te 214 paita te rahi.
Inaianei kua tae ki te wa ki te titiro ki roto i nga paatete UDP, mo tenei ka whakarewahia e matou a TShark me nga huinga taviri kua whakawhānuihia:

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

Ko te mutunga, ka whakarangatirahia te putanga o te hotaka - he wetemunatanga o nga ihirangi o roto o te kete i puta ai ka taapirihia ki ia huihuinga. Kia pai ake te titiro ki te putanga, ka taea e koe te aukati i te TShark ma te pehi i te Ctrl-C, te taarua ranei i tana putanga ki tetahi konae ma te taapiri i te paipa ki te kaupapa tee ki te whakahau oma, me te tohu i te ingoa konae, tee <filename>:

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

Inaianei me titiro ki nga mea i riro mai i te konae, koinei te kete tuatahi mai i a ia:

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

Ka whakatapua e matou te tuhinga e whai ake nei ki te tarai i nga korero kei roto i tenei raarangi ka korero mo te hanganga o roto o te kete RTP.

Source: will.com

Tāpiri i te kōrero