Serviço de distribuição de vídeo utilizando CORBA e JMF

Transcrição

Serviço de distribuição de vídeo utilizando CORBA e JMF
UNIVERSIDADE NOVA DE LISBOA
Faculdade de Ciências e Tecnologia
Departamento de Engenharia Electrotécnica
REDES INTEGRADAS DE TELECOMUNICAÇÕES II
2005 / 2006
Licenciatura em Engenharia Electrotécnica
e de Computadores
4º ano
8º semestre
2º Trabalho prático:
Serviço de distribuição de vídeo utilizando CORBA e JMF
http://tele1.dee.fct.unl.pt
Luis Bernardo
1. OBJECTIVOS
Criação de uma aplicação distribuída, que use a invocação remota de
objectos, o serviço de trading da arquitectura CORBA, e a distribuição de
conteúdos multimédia utilizando JMF. O problema consiste na realização de um
serviço de distribuição de vídeo por rede (ou abusivamente, Digital Vídeo Broadcast).
A aplicação permite a cada cliente ligar-se a um dos servidores DV e pedir um filme. Este
servidor é responsável pela criação dos feixes RTP para o cliente, e pela criação de um objecto
CORBA, que permite ao cliente controlar o "Play" e "Stop" do vídeo. Caso o ficheiro não exista
localmente, o servidor deve procurar por outros servidores DV com o ficheiro utilizando o
serviço de trading. Caso tenha o ficheiro, mas já esteja a servir o número máximo suportado de
clientes, pode promover a clonagem do ficheiro noutro servidor, e a transmissão do filme a
partir do servidor remoto.
Servidor
DV 2
Cliente
DV 1
Cliente
DV 2
Servidor
DV 1
A aplicação é composta por dois tipos de programas:
• um programa para os clientes pedirem e visualizarem os filmes (Cliente DV);
• um programa servidor distribuidor de filmes (Servidor DV).
É fornecida a implementação completa do cliente, e um início de realização do servidor,
com a interface gráfica, a gestão de ficheiros partilhados, e a rotina de recepção de ficheiros a
partir de um socket TCP. Também é fornecido o acesso a uma implementação completa do
servidor DV nos computadores do laboratório. Pretende-se que seja desenvolvida, pelos alunos,
um servidor DV compatível com o protocolo especificado nas secções seguintes.
2. Especificações
2.1 Interfaces
O conjunto de interfaces do serviço DVB está declarado no ficheiro DVBIf.idl no
módulo DVBIf. Este módulo inclui a definição das interfaces e dos tipos de dados auxiliares
usados nas funções das interfaces.
Foram definidos três tipos de interfaces para interligar os dois tipos de programas:
• stream_DVB : A interface utilizada por clientes para controlar a apresentação de um filme;
• cli_DVB : A interface usada pelos clientes para pedirem um filme e se ligarem a um servidor;
1
• serv_DVB : A interface facultada pelos servidores para permitirem consultas aos filmes
disponíveis, coordenar a criação de cópias de ficheiros, e delegar clientes para outro
servidor.
O módulo também define o formato da representação dos pontos terminais RTP:
// RTP endpoint definition for video+audio transfer
struct RTP_Endpoint {
string ip_v;
// Video IP
short port_v; // Video port
string ip_a;
// Audio IP
short port_a; // Audio port
};
Um ponto terminal define o endereço IP e porto associado aos feixes de vídeo e áudio, e
implicitamente aos feixes RTCP associados (nos portos imediatamente a seguir).
Relembra-se que como o tipo de dados está declarado dentro do módulo DVBIf é
referenciado no software a desenvolver como DVBIf.RTP_Endpoint.
2.1.1 Interface stream_DVB
A interface stream_DVB define três operações:
// Interface for video playback control
interface stream_DVB {
boolean start();
boolean stop();
oneway void destroy();
};
Esta interface é usada nos clientes para controlar a apresentação de um vídeo. A operação
start solicita o arranque do envio dos feixes RTP, podendo falhar caso estes já estejam
activos, ou por falha no arranque dos objectos JMF. A função stop é usada para terminar a
apresentação do vídeo de uma forma fiável (semântica at-most-once), destruindo os objectos.
Pode falhar caso a apresentação não esteja activa. A função destroy termina todas as acções
activas e liberta os objectos, de forma semelhante à função stop. No entanto, como tem uma
semântica one-way não é bloqueante.
2.1.2 Interface cli_DVB
A interface cli_DVB define uma operação:
// Interface for stream creation cliente-DVB
interface cli_DVB {
boolean get_video(in string filename, in RTP_Endpoint irtp,
out RTP_Endpoint ortp, out stream_DVB ifref,
out string message);
};
A operação get_video permite aos clientes pedirem o visionamento do filme com o
nome filename. O cliente fornece junto com o pedido o endereço do terminal RTP que vai
ser usado na recepção do vídeo (iRTP). O servidor retorna o endereço do terminal RTP que vai
enviar o vídeo (oRTP), a referência ifref para um objecto stream_DVB que permite controlar
a sua apresentação, e uma mensagem de texto message, que deve ser ecoada no programa
cliente para o utilizador.
2
2.1.3 Interface serv_DVB
A interface serv_DVB define três operações:
// Interface for DVB - DVB server communication
interface serv_DVB {
boolean query_file(in string filename, out short available);
boolean cache_file(in string filename, in long port,
in string ip, in string key1, out string key2);
boolean get_video(in string filename, in RTP_Endpoint irtp,
in string secret, out RTP_Endpoint ortp,
out stream_DVB ifref, out string message);
};
A operação query_file permite a um servidor pesquisar se o ficheiro filename existe
noutro servidor, devolvendo o número de clientes que o servidor ainda pode suportar
(available). Retorna true se o ficheiro existe, ou false em caso contrário.
A operação cache_file controla a transferência de ficheiros entre servidores. Recebe
como argumento o nome do ficheiro a transferir (filename), o endereço IP (ip) e o número
de porto (porto) onde o servidor que faz a invocação tem um socket TCP preparado para
receber ligações, e uma chave para validar a comunicação TCP (key1). Recebe uma chave
(secret) que deve apresentar quando efectuar o pedido do cliente com get_video. Retorna
true se aceitar a transferência, ou false caso contrário.
A operação get_video é usada por servidores para delegar clientes que a eles se ligaram
para outros servidores. Executa a mesma operação que a homónima da interface cli_DVB, mas
acrescenta um parâmetro extra, secret, para associar a operação a uma invocação de
cache_file anterior.
2.2 Servidor DV
Deve desenvolver um Servidor DV capaz de suportar vários clientes em paralelo. O
servidor DV é o objecto responsável por manter toda a informação referente aos feixes activos.
Quando o servidor arranca, oferece uma interface cli_DVB, de maneira a permitir que
clientes se liguem à agência (através de uma aplicação cliente), e uma interface serv_DVB, de
maneira a permitir que outros servidores se liguem ao servidor. As interfaces
DVBIf.cli_DVB e DVBIf.serv_DVB devem ser registadas no servidor de trading com
um nome único no sistema (e.g. g01), de forma a permitir a coexistência de vários servidores em
simultâneo.
Os objectos stream_DVB criados localmente são privados, só sendo conhecidos dos
clientes a quem foram atribuídos.
2.2.1 Registo dos servidores no trader
O objecto cli_DVB deve ser registado no serviço DVBIf.DVUserService e objecto
serv_DVB deve ser registado no serviço DVBIf.DVServService. Os serviços estão
definidos no ficheiro DVBIf.st, representado abaixo. Os dois registos incluem o nome do
servidor (server_name). O registo do objecto serv_DVB deve ser realizado com duas
propriedade dinâmicas, number_films e number_streams, respectivamente com o
número de filmes partilhados e com o número de clientes que ainda pode suportar. Os registos
devem ser retirados antes de parar o servidor.
3
#include "DVBIf.idl"
module DVBIf
{
service DVUserService
{
interface cli_DVB;
mandatory property string server_name;
};
service DVServService
{
interface serv_DVB;
mandatory property string server_name;
mandatory property short number_films;
mandatory property short number_streams;
};
};
Verificou-se que a implementação do trader distribuída com o OpenORB tem vários erros.
Um erro frequente com propriedades dinâmicas é o falhar sistemático de pesquisas quando um
dos objectos registados é destruído sem ser removido do trader. Este erro pode ser contornado
reinicializando o trader.
2.2.2 Associação de clientes a uma sessão RTP
Sempre que o servidor receber um novo get_video de um cliente, o servidor deve
pesquisar se tem o ficheiro pedido. Se não tiver o ficheiro, o servidor deve pesquisar no trader
por outros servidores, tentando sequencialmente delegar o cliente para os servidores com mais
ficheiros. Se tiver o ficheiro e ainda não tiver atingido o número limite de clientes deve aceitar o
cliente. Se já atingiu o limite, deve usar o serviço de trading para pesquisar outro servidor DB
com o ficheiro que aceite o pedido. Caso esta segunda tentativa falhe, deve procurar por
servidores com pelo menos dois feixes livres, dando preferência a servidores com menos
ficheiros. Depois, deve tentar transferir o ficheiro para esses servidores, invocando de seguida a
operação get_video.
A transferência de ficheiros deve obedecer à seguinte sequência de acções. As acções
representadas a amarelo correm em paralelo, enquanto a tarefa principal está bloqueada com a
invocação síncrona da operação cache_file.
Servidor 1 com ficheiro
1. Cria tarefa T para receber ligação TCP.
2. Invoca operação cache_file.
Servidor 2 receptor
3. Cria ficheiro temporário
4. Cria ligação TCP para servidor 1.
5. Envia a chave key1.
(4. recebe ligação na tarefa T)
(5. recebe e valida key1)
6. Envia o comprimento numa linha.
7. Envia os dados do ficheiro.
8. Termina a ligação.
(6.-8.... recebe ficheiro)
9. Retorna da operação cache_file,
enviando a chave (secret)
10. Invoca a operação get_file com o
parâmetro secret.
O cliente recebe uma referência para um objecto stream_DVB, que lhe permite realizar
uma apresentação do filme, destruindo-se em seguida.
4
2.2.3 Interface gráfica
A interface gráfica do servidor inclui botões para
adicionar ficheiros (Adicionar), para remover ficheiros da
lista (Remover), para limpar o texto (Limpa Texto), e o
botão mais à direita, que tanto pode ter escrito "Parar"
como "Activar". Este botão é usado para arrancar e para
parar o servidor. O servidor recebe três configurações em
caixas de texto: o nome (Nome), o número máximo de
clientes que suporta (Max RTP), e a localização do servidor
de trading (TS). Na tabela, apresenta a lista de ficheiros
partilhados, indicando o nome do ficheiro (Nome), se foi
acrescentado localmente (local) ou se foi recebido de outro
servidor (temp) na coluna Origem, e o número de clientes que está a receber o ficheiro na
coluna Clientes.
2.3 Cliente DV
Quando se prime o botão Activar, o cliente DV
pesquisa o servidor de trading (localizado em TS) para
obter uma lista de servidores DV, e invoca sucessivamente
a operação get_video nos servidores DV com o
parâmetro Ficheiro até ter sucesso. Nessa altura é
activado o botão Tocar, permitindo invocar a operação
start(), que faz aparecer as janelas de visualização do
vídeo e de controlo do áudio. A visualização pode ser interrompida em qualquer altura premindo
o botão Activar. Na versão 0.1a, só pode funcionar um cliente por máquina porque o
dispositivo de áudio é bloqueado quando se inicia uma apresentação. Outros clientes que tentem
começar falham a criação do "player" de áudio.
3. MÓDULOS FORNECIDOS
Para facilitar o desenvolvimento do serviço, são fornecidos:
• o código do cliente, e acesso a um executável do servidor DV no laboratório;
• os ficheiros DVBIf.idl e DVBIf.st com as definições das interfaces;
• o ficheiro DVB.corba_thread.java para correr a tarefa CORBA em paralelo com o
processamento dos eventos gráficos;
• o pacote JMFobj com a classe AVtx, para enviar feixes RTP de vídeo e áudio;
• o ficheiro DVB.DVserver.java com a definição da interface gráfica do servidor, as
funções de gestão da lista de ficheiros, e a função receive_file, que realiza o
protocolo de recepção de ficheiros descrito na secção 2.2.2.;
• o ficheiro DVB.FileElement.java com a definição da classe dos elementos da HashMap
fileMap, declarada na classe DVB.DVserver.
• O ficheiro DVB.global_methods.java com métodos globais para seleccionar portos
livres, e para visualizar objectos DVBIf.RTP_Endpoint como Strings.
Não se esqueça de arrancar os Servidores de Nomes e de Trading antes de correr os
executáveis da aplicação.
5
3.1 Desenvolvimento do trabalho
O trabalho vai ser desenvolvido em cinco semanas, onde a primeira semana é uma aula de
introdução à programação de aplicações CORBA com OpenORB e JMF em Java. Propõe-se que
sejam definidas as seguintes metas para a realização do trabalho:
0. aula de aprendizagem deve ler a documentação de introdução, realizar o exercício
proposto, e aprender a lógica de funcionamento da aplicação;
1. no fim da segunda aula deve ter realizado a criação e o registo e cancelamento dos
objectos user_DVB e cli_DVB no serviço de trading. Deve estar a trabalhar na
realização da operação get_video da classe user_DVB, para ficheiros locais;
2. no fim da terceira aula deve ter realizado a operação get_video, sem transferência
de ficheiros, com a activação dos objectos stream_DVB e AVtx, que permitem
ligar os clientes ao servidor e apresentar os filmes);
3. no fim da quarta aula deve ter a rotina de transferência de ficheiros quase
concluída. Todos os aspectos de utilização da classe AVtx devem estar testados;
4. no fim da última aula deve ter acabado os testes da aplicação, corrigindo os
últimos erros de programação.
POSTURA DOS ALUNOS
Cada grupo deve ter em consideração o seguinte:
Não perca tempo com a estética de entrada e saída de dados
Programe de acordo com os princípios gerais de uma boa codificação (utilização de
indentação, apresentação de comentários, uso de variáveis com nomes conformes às
suas funções...) e
•
Proceda de modo a que o trabalho a fazer fique equitativamente distribuído pelos dois
membros do grupo.
•
•
DATAS LIMITE
A parte laboratorial é composta por dois trabalhos de avaliação. A duração prevista para
cada um deles é de 5 semanas. A parte prática teve o seu início formal a 2 de Março.
O quadro seguinte mostra as datas de entrega de cada trabalho de avaliação (P) e as datas
para os testes teóricos (T):
Fevereiro 2006
Abril 2006
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
20
21
22
23
24
25
27
C
19
1
26
2
Março 2006
2
5
3
12
4
19
5
26
6
6
7
8
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
P
17
18
T1
20
21
22
23
24
25
26
27
28
29
Maio 2006
1
2
3
4
6
7
8
9
10
11
13
14
15
16
17
18
20
21
22
23
24
25
27
28
29
L1
31
10
11
12
13
14
6
30
1
2
3
4
5
6
7
8
9
10
L2
12
13
14
15
16
T2
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3