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