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

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

Waea Waearua

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

I nga ra o mua Tuhinga i panuitia he waea ruarua, a ma tenei ka mahi maatau.

Ka whakaatuhia te hoahoa ki te ahua taitara. Ko te mekameka o raro o nga whiriwhiringa te huarahi tuku, ka timata mai i te kaari tangi. Ka whakarato tauira tohu mai i te hopuoro. Ma te taunoa, ka puta tenei i te tere o te 8000 tauira mo ia hekona. Ko te hōhonutanga moka raraunga e whakamahia ana e nga whiriwhiringa ororongo kaikawe pāpāho he 16 moka (kare he mea nui; ki te hiahia koe, ka taea e koe te tuhi i nga whiriwhiringa ka pai ake te hohonutanga moka). Ka whakarōpūhia nga raraunga ki nga poraka o nga tauira 160. No reira, he 320 paita te rahi o ia poraka. I muri mai, ka whangaihia e matou nga raraunga ki te whakauru o te kaihanga, ka mutu, ka "marama" ki nga raraunga. I taapirihia e au mena ka ngenge koe ki te korero ki te hopuoro i te wa e patuiro ana - ka taea e koe te whakamahi i te kaihanga ki te "kopere" te ara me te tohu oro.

Whai muri i te kaihanga, ka haere te tohu ki te encoder, ka huri i a tatou tauira 16-bit kia rite ki te µ-law (G.711 paerewa) ki te waru-bit. I te putanga o te encoder, he poraka raraunga kua haurua te rahi. I te nuinga o te waa, ka taea e taatau te tuku raraunga me te kore e pupuhi ki te kore e tika kia tiakina nga waka. Engari i konei he pai ki te whakamahi i te encoder, na te mea ka taea e Wireshark te whakaputa ororongo mai i te awa RTP ka kopeke ana i runga i te µ-law, a-ture ranei.

I muri i te encoder, ka tukuna nga poraka marama o nga raraunga ki te tātari rtpsend, ka whakauruhia ki roto i te paatete RTP, ka tautuhi i nga haki e tika ana, ka hoatu ki te riipene pāpāho mo te whakawhiti i runga i te whatunga i te ahua o te putea UDP.

Ko te mekameka o runga o nga whiriwhiringa te hanga i te huarahi whiwhinga; Ko nga paatete RTP i whakawhiwhia e te kaiwhakaputa pāpāho mai i te whatunga ka uru ki te tātari rtprecv, i te putanga ka puta mai i roto i te ahua o nga poraka raraunga, ko ia mea e rite ana ki tetahi kete kua riro. Ko te paraka he raraunga utu utu anake; i roto i te tuhinga o mua i whakaatuhia ki te kaakaariki i te whakaahua.

Muri iho, ka tukuna nga poraka ki te tātari wetewaehere, ka huri i nga tauira paita-kotahi kei roto i a raatau ki roto i nga rarangi, 16-bit. Ka taea te tukatuka e nga whiriwhiringa roma pāpāho. I a maatau, ka tukuna noa e matou ki te kaari tangi mo te purei i runga i nga kaikorero o to pane.

Inaianei ka anga whakamua ki te whakatinana rorohiko. Hei mahi i tenei, ka whakakotahihia e matou nga konae kaikawe me nga konae whakawhiti i wehea e matou i mua. I mua i tenei, i whakamahia e matou nga tautuhinga kua whakaritea mo nga tauranga me nga wahitau, engari inaianei me maatau te papatono ki te whakamahi i nga tautuhinga ka tohua e matou i te tiimatanga. Hei mahi i tenei, ka taapirihia e matou he mahinga mo te tukatuka i nga tautohetohe raina whakahau. I muri i tera ka taea e matou te tautuhi i te wahitau IP me te tauranga o te whakawhitiwhiti e hiahia ana matou ki te whakarite hononga.

Tuatahi, me taapiri he anga ki te papatono hei pupuri i ona tautuhinga:

struct _app_vars
{
  int  local_port;              /* Локальный порт. */
  int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
  char remote_addr[128];        /* IP-адрес удаленного компьютера. */
  MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

Ka whakapuakihia e te papatono he hanganga o tenei momo e kiia nei ko vars.
Panuku, me taapiri he mahi hei tarai i nga tohenga rarangi whakahau:

/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

Ko te hua o te poroporoaki, ka tukuna nga tohenga rarangi whakahau ki nga mara o te hanganga vars. Ko te mahi matua o te tono ko te kohi whakawhiti me te tango i nga huarahi mai i nga whiriwhiringa; i muri i te hono i te tohu tohu, ka whakawhitia te mana ki te kohanga mutunga kore, mena ka whakatauhia te auau o te kaihanga ki te kore-kore, ka tiimata ano te kaihanga whakamatautau kia ka mahi me te kore e mutu.

Ka hiahia te kaihanga ki enei whakaarahanga na runga i tana hoahoa; mo etahi take kaore e taea e ia te whakaputa tohu neke atu i te 16 hēkona. Me tohu ko tona roanga kua tohua e te nama 32-bit.

Ka penei te ahua o te hotaka katoa:

/* Файл mstest8.c Имитатор переговорного устройства. */

#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>

/* Подключаем файл общих функций. */
#include "mstest_common.c"

/*----------------------------------------------------------*/
struct _app_vars
{
    int  local_port;              /* Локальный порт. */
    int  remote_port;             /* Порт переговорного устройства на удаленном компьютере. */
    char remote_addr[128];        /* IP-адрес удаленного компьютера. */
    MSDtmfGenCustomTone dtmf_cfg; /* Настройки тестового сигнала генератора. */
};

typedef struct _app_vars app_vars;

/*----------------------------------------------------------*/
/* Создаем дуплексную RTP-сессию. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
    RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
    rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
    rtp_session_set_send_payload_type(session, PCMU);
    return session;
}

/*----------------------------------------------------------*/
/* Функция преобразования аргументов командной строки в
* настройки программы. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
    /* Устанавливаем настройки по умолчанию. */
    app_vars vars={5004, 7010, "127.0.0.1", {0}};

    /* Устанавливаем настройки настройки программы в
     * соответствии с аргументами командной строки. */
    scan_args(argc, argv, &vars);

    ms_init();

    /* Создаем экземпляры фильтров передающего тракта. */
    MSSndCard *snd_card =
        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
    MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);

    /* Создаем фильтр кодера. */
    MSFilter *encoder = ms_filter_create_encoder("PCMU");

    /* Регистрируем типы нагрузки. */
    register_payloads();

    /* Создаем дуплексную RTP-сессию. */
    RtpSession* rtp_session= create_duplex_rtp_session(vars);
    ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);

    /* Соединяем фильтры передатчика. */
    ms_filter_link(snd_card_read, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, encoder, 0);
    ms_filter_link(encoder, 0, rtpsend, 0);

    /* Создаем фильтры приемного тракта. */
    MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
    ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);

    /* Создаем фильтр декодера, */
    MSFilter *decoder=ms_filter_create_decoder("PCMU");

    /* Создаем фильтр звуковой карты. */
    MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);

    /* Соединяем фильтры приёмного тракта. */
    ms_filter_link(rtprecv, 0, decoder, 0);
    ms_filter_link(decoder, 0,  snd_card_write, 0);

    /* Создаем источник тактов - тикер. */
    MSTicker *ticker = ms_ticker_new();

    /* Подключаем источник тактов. */
    ms_ticker_attach(ticker, snd_card_read);
    ms_ticker_attach(ticker, rtprecv);

    /* Если настройка частоты генератора отлична от нуля, то запускаем генератор. */   
    if (vars.dtmf_cfg.frequencies[0])
    {
        /* Настраиваем структуру, управляющую выходным сигналом генератора. */
        vars.dtmf_cfg.duration = 10000;
        vars.dtmf_cfg.amplitude = 1.0;
    }

    /* Организуем цикл перезапуска генератора. */
    while(TRUE)
    {
        if(vars.dtmf_cfg.frequencies[0])
        {
            /* Включаем звуковой генератор. */
            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
                    (void*)&vars.dtmf_cfg);
        }
        /* Укладываем тред в спячку на 20мс, чтобы другие треды
         * приложения получили время на работу. */
        ms_usleep(20000);
    }
}

Kia whakahiato tatou. Na ka taea te whakahaere i te papatono ki runga rorohiko e rua. I runga ranei i tetahi, penei me taku mahi inaianei. Ka whakarewahia e matou a TShark me nga tautohetohe e whai ake nei:

$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x

Mena ko te waahi whakarewatanga i roto i te papatohu ka whakaatu noa i te panui mo te tiimata o te hopu, he tohu pai tenei - ko te tikanga kaore pea to maatau tauranga e nohoia e etahi atu kaupapa. I tetahi atu tauranga, ka whakarewahia e matou he tauira hotaka ka whakataurite i te waea "mamao" ma te tohu i tenei tau tauranga:

$ ./mstest8 --port 9010 --lport 7010

Ka kitea mai i te tuhinga o te papatono, ko te wahitau IP taunoa ko 127.0.0.1 (localback).

I tetahi atu tauranga, ka whakarewahia e matou he tauira tuarua o te hotaka, e whakataurite ana i tetahi taputapu o te rohe. Ka whakamahia e matou he tohenga taapiri e taea ai e te kaihanga whakamatautau te mahi:

$ ./mstest8  --port 7010 --lport 9010 --gen 440

I tenei wa, ko nga paatete ka tukuna ki te taputapu "mamao" me timata ki te uira i roto i te papatohu me TShark, a ka rangona he reo mai i te kaikorero rorohiko.

Mena ka rite nga mea katoa i tuhia, ka timata ano i te kape tuarua o te papatono, engari kaore he ki me te tautohe "—gen 440". Ka takaro koe i te mahi a te kaihanga. I muri i tenei, ka taea e koe te haruru ki te hopuoro; me rongo koe i te oro e tika ana i roto i te kaikorero, i nga taringa ranei. Ka puta pea te whakaihiihi oro ki a ia ano; whakaitihia te oro o te kaikorero ka ngaro te paanga.

Mena i whakahaerehia e koe i runga i nga rorohiko e rua kaore koe i te pohehe mo nga wahitau IP, katahi ano te hua e tatari ana ki a koe - e rua-ara te whakawhitiwhiti reo kounga mamati.

I roto i te tuhinga e whai ake nei ka ako tatou ki te tuhi i a tatou ake whiriwhiringa - monomai, na tenei pukenga ka taea e koe te whakamahi i te riipene pāpāho ehara mo te oro me te ataata anake, engari ki etahi atu waahanga motuhake.

Source: will.com

Tāpiri i te kōrero