ืืืืืจ ืฉื ืืืืืจ ืืงืื ืืื ื
ืืื ืืจืงืื ืืืคืืงืก
ืืขืืจ
ืืชืจืฉืื ืืืฆื ืืืืืจ ืืืืชืจืช. ืฉืจืฉืจืช ืืืกื ื ืื ืืชืืชืื ื ืืืฆืจืช ืืช ื ืชืื ืืฉืืืืจ, ืฉืืชืืื ืืืจืืืก ืืงืื. ืืื ืืกืคืง ืืืืืืช ืืืช ืืืืืงืจืืคืื. ืืืจืืจืช ืืืื, ืื ืืชืจืืฉ ืืงืฆื ืฉื 8000 ืืืืืืช ืืฉื ืืื. ืขืืืง ืกืืืืืช ืื ืชืื ืื ืฉืื ืืฉืชืืฉืื ืืกื ื ื ืืืืื ืฉื ืกืืจืืืจ ืืืื ืืื 16 ืกืืืืืช (ืื ืื ืืฉืื; ืื ืชืจืฆื, ืชืืื ืืืชืื ืืกื ื ืื ืฉืืขืืื ืขื ืขืืืง ืกืืืืืช ืืืื ืืืชืจ). ืื ืชืื ืื ืืงืืืฆืื ืืืืืงืื ืฉื 160 ืืืืืืช. ืืคืืื, ืื ืืืืง ืืื ืืืืื 320 ืืชืื. ืืืืจ ืืื, ื ืืื ืืช ืื ืชืื ืื ืืงืื ืฉื ืืื ืจืืืจ, ืฉืืืฉืจ ืืื ืืืื, ืืื "ืฉืงืืฃ" ืื ืชืื ืื. ืืืกืคืชื ืืช ืื ืืืงืจื ืฉื ืืืก ืื ืืืืจ ืืืืงืจืืคืื ืืืืื ืืืชืืจ ืืืืื - ืืชื ืืืื ืืืฉืชืืฉ ืืืืืื ืืื "ืืืจืืช" ืืช ืื ืชืื ืขื ืืืช ืฆืืื.
ืืืืจ ืืืืืื, ืืืืช ืขืืืจ ืืืงืืื, ืืฉืจ ืืืืจ ืืช ืืืืืืืช ืฉืื ื ื-16 ืกืืืืืช ืืคื ืืืง ื-ยต (ืชืงื G.711) ืืืืืืืช ืฉื ืฉืืื ื ืกืืืืืช. ืืืฆืืื ืฉื ืืืงืืื, ืืฉ ืื ื ืืืจ ืืืืง ื ืชืื ืื ืืืืื ืืฆื ืืืืืื. ืืืืคื ืืืื, ืื ื ืืืืืื ืืืขืืืจ ื ืชืื ืื ืืื ืืืืกื ืื ืืื ื ื ืฆืจืืืื ืืืกืื ืืชื ืืขื. ืืื ืืื ืื ืฉืืืืฉื ืืืฉืชืืฉ ืืืงืืื, ืืืืืื ืฉ-Wireshark ืืืื ืืฉืืืจ ืืืืื ืืืจื RTP ืจืง ืืืฉืจ ืืื ืืืืก ืืคื ืืืง ยต ืื ื-ืืืง.
ืืืืจ ืืืงืืื, ืืืฉื ืื ืชืื ืื ืืงืืื ืืืชืจ ื ืฉืืืื ืืืกื ื rtpsend, ืฉืืื ืืก ืืืชื ืืืืืืช RTP, ืืงืืข ืืช ืืืืืื ืืืจืืฉืื ืืืขืืืจ ืืืชื ืืกืืจืืืจ ืืืืื ืืฉืืืืจ ืืจืฉืช ืืฆืืจื ืฉื ืืืืืช UDP.
ืฉืจืฉืจืช ืืืกื ื ืื ืืขืืืื ื ืืืืื ืืช ื ืชืื ืืงืืื; ืื ืืช RTP ืืืชืงืืืืช ืขื ืืื ืกืืจืืืจ ืืืืื ืืืจืฉืช ื ืื ืกืืช ืืืกื ื rtprecv, ืฉืืคืื ืฉืื ืื ืืืคืืขืืช ืืฆืืจื ืฉื ืืืืงื ื ืชืื ืื, ืฉืื ืืื ืืื ืืชืืื ืืืืืื ืืืช ืฉืืชืงืืื. ืืืืืง ืืืื ืจืง ื ืชืื ื ืืืขื; ืืืืืจ ืืงืืื ืื ืืืฆืื ืืืจืืง ืืืืืจ.
ืืืืจ ืืื, ืืืืืงืื ื ืฉืืืื ืืืกื ื ืืืคืขื ื, ืืฉืจ ืืืืจ ืืช ืืืืืืืช ืฉื ืืชืื ืืืืืื ืืืืืืื ืืื ืืืืืืืืช ืืื ืืืจืืืช ืฉื 16 ืกืืืืืช. ืื ืฉืืืจ ื ืืชื ืืขืืืื ืขื ืืื ืืกื ื ื ืกืืจืืืจ ืืืื. ืืืงืจื ืฉืื ื, ืื ืื ื ืคืฉืื ืฉืืืืื ืืืชื ืืืจืืืก ืืงืื ืืืฉืืขื ืืจืืงืืืื ืฉื ืืืืื ืืืช ืฉืื.
ืืขืช ื ืขืืืจ ืืืืฉืื ืชืืื ื. ืืฉื ืื ื ืฉืื ืืช ืงืืฆื ืืืงืื ืืืืฉืืจ ืฉืืคืจืื ื ืงืืื ืืื. ืืคื ื ืื, ืืฉืชืืฉื ื ืืืืืจืืช ืงืืืขืืช ืขืืืจ ืืฆืืืืช ืืืชืืืืช, ืื ืืขืช ืื ื ืฆืจืืืื ืฉืืชืืื ืืช ืชืืื ืืืฉืชืืฉ ืืืืืจืืช ืฉืื ื ืืฆืืื ืื ืืขืช ืืืคืขืื. ืืฉื ืื, ื ืืกืืฃ ืคืื ืงืฆืืื ืืืืช ืืขืืืื ืืจืืืื ืืื ืฉื ืฉืืจืช ืืคืงืืื. ืืืืจ ืืื ื ืืื ืืืืืืจ ืืช ืืชืืืช ื-IP ืืืืฆืืื ืฉื ืืืื ืืจืงืื ืืืชื ื ืจืฆื ืืืฆืืจ ืืืืืจ.
ืจืืฉืืช, ืืืื ื ืืกืืฃ ืืื ื ืืชืืื ืืช ืฉืืืืกื ืืช ืืืืืจืืช ืฉืื:
struct _app_vars
{
int local_port; /* ะะพะบะฐะปัะฝัะน ะฟะพัั. */
int remote_port; /* ะะพัั ะฟะตัะตะณะพะฒะพัะฝะพะณะพ ััััะพะนััะฒะฐ ะฝะฐ ัะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัััะตัะต. */
char remote_addr[128]; /* IP-ะฐะดัะตั ัะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัััะตัะฐ. */
MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัััะพะนะบะธ ัะตััะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตัะฐัะพัะฐ. */
};
typedef struct _app_vars app_vars;
ืืชืืื ืืช ืชืืจืื ืขื ืืื ื ืืกืื ืื ืื ืงืจื vars.
ืืืืจ ืืื, ืืืื ื ืืกืืฃ ืคืื ืงืฆืื ืื ืชื ืืจืืืื ืืื ืฉื ืฉืืจืช ืืคืงืืื:
/* ะคัะฝะบัะธั ะฟัะตะพะฑัะฐะทะพะฒะฐะฝะธั ะฐัะณัะผะตะฝัะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ ะฒ
* ะฝะฐัััะพะนะบะธ ะฟัะพะณัะฐะผะผั. */
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]);
}
}
}
ืืชืืฆืื ืื ืืชืื, ืืืจืืืื ืืื ืฉื ืฉืืจืช ืืคืงืืื ืืืืงืื ืืฉืืืช ืฉื ืืื ื vars. ืชืคืงืืื ืืขืืงืจื ืฉื ืืืคืืืงืฆืื ืืืื ืืืกืืฃ ื ืชืืื ืฉืืืืจ ืืงืืื ืืคืืืืจืื; ืืืืจ ืืืืืจ ืืืืงืจ, ืืฉืืืื ืชืืขืืจ ืืืืืื ืืื ืกืืคืืช ืืฉืจ ืื ืชืืจ ืืืืืื ืืืืืจ ืืื ืืคืก, ืชืคืขืื ืืืืฉ ืืช ืืืืื ืืืืืงื ืื ืฉ ืื ืขืืื ืืื ืืืคืกืืง.
ืืื ืจืืืจ ืืืืงืง ืืืชืืืืื ืืื ืืฉื ืืขืืฆืื ืฉืื; ืืฉืื ืื ืืื ืื ืืืื ืืืคืืง ืืืช ืฉื ืืฉื ืืืชืจ ื-16 ืฉื ืืืช. ืืฉ ืืฆืืื ืื ืืฉื ืืืื ืฉืื ืืฆืืื ืืืกืคืจ 32 ืกืืืืืช.
ืื ืืชืืื ืืช ืชืืจืื ืื:
/* ะคะฐะนะป 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);
}
}
ืืืื ื ืขืฉื ืงืืืคืืืฆืื. ืืืืจ ืืื ื ืืชื ืืืคืขืื ืืช ืืชืืื ืืช ืืฉื ื ืืืฉืืื. ืื ืขื ืืื, ืืคื ืฉืืขืฉื ืขืืฉืื. ืื ื ืืฉืืงืื ืืช TShark ืขื ืืืืขืื ืื ืืืืื:
$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x
ืื ืฉืื ืืืฉืงื ืืืกืืฃ ืืฆืื ืจืง ืืืืขื ืขื ืชืืืืช ืืืืืื, ืื ืื ืกืืื ืืื - ืื ืืืืจ ืฉืืืฆืืื ืฉืื ื ืื ืจืื ืื ืชืคืืกื ืขื ืืื ืชืืื ืืืช ืืืจืืช. ืืืจืืื ื ืืืจ, ืื ื ืืฉืืงืื ืืืคืข ืชืืื ืืช ืฉืืืื ืืื ืืจืงืื "ืืจืืืง" ืขื ืืื ืฆืืื ืืกืคืจ ืืืฆืืื ืืื:
$ ./mstest8 --port 9010 --lport 7010
ืืคื ืฉื ืืชื ืืจืืืช ืืืงืกื ืืชืืื ืืช, ืืชืืืช ื-IP ืืืืืืจืช ืืืจืืจืช ืืืื ืืื 127.0.0.1 (ืืืืื ืืืืจืช ืืงืืืืช).
ืืืจืืื ื ืืืจ, ืื ื ืืฉืืงืื ืืืคืข ืฉื ื ืฉื ืืชืืื ืืช, ืืืืื ืืืฉืืจ ืืงืืื. ืื ื ืืฉืชืืฉืื ืืืจืืืื ื ื ืืกืฃ ืืืืคืฉืจ ืืืืืื ืืืืืงืืช ืืืืื ื ืืขืืื:
$ ./mstest8 --port 7010 --lport 9010 --gen 440
ืืจืืข ืื, ืื ืืช ืืืืขืืจืืช ืืืืืื ืืืืฉืืจ ื"ืืจืืืง" ืืืืจืืช ืืืชืืื ืืืืื ืืงืื ืกืืื ืขื TShark, ืืงืื ืจืฆืืฃ ืืืฉืืข ืืจืืงืื ืืืืฉื.
ืื ืืื ืงืจื ืืคื ืฉื ืืชื, ืื ื ืืคืขืืืื ืืืืฉ ืืช ืืขืืชืง ืืฉื ื ืฉื ืืชืืื ืืช, ืื ืืื ืืืคืชื ืืืืืขืื "-gen 440". ืืขืช ืชืฉืืง ืืช ืืชืคืงืื ืฉื ืืืืื. ืืืืจ ืืื, ืืชื ืืืื ืืขืฉืืช ืจืขืฉ ืืชืื ืืืืงืจืืคืื; ืืชื ืืืืจ ืืฉืืืข ืืช ืืฆืืื ืืืชืืื ืืจืืงืื ืื ืืืืื ืืืช. ืขืืจืืจ ืขืฆืื ืืงืืกืื ืขืฉืื ืืคืืื ืืืชืจืืฉ; ืื ืืื ืืช ืขืืฆืืช ืืงืื ืฉื ืืจืืงืื ืืืืคืงื ืืืขืื.
ืื ืืจืฆืชื ืืืชื ืขื ืฉื ื ืืืฉืืื ืืื ืืชืืืืืชื ืืืื ืืชืืืืช ื-IP, ืื ืืืชื ืชืืฆืื ืืืื ืืื - ืชืงืฉืืจืช ืงืืืืช ืืืืืืช ืื-ืืืืื ืืช.
ืืืืืจ ืืื ื ืืื ืืืฆื ืืืชืื ืคืืืืจืื ืืฉืื ื - ืชืืกืคืื, ืืืืืช ืืืืืื ืืช ืื ืชืืืื ืืืฉืชืืฉ ืืกืืจืืืจ ืืืืื ืื ืจืง ืขืืืจ ืืืืื ืืืืืื, ืืื ืื ืืืืืจ ืืกืืื ืืืจ.
ืืงืืจ: www.habr.com