Ko nga rauemi o te tuhinga i tangohia mai i taku
Waea Waearua
I nga ra o mua
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