Mobicents Media Server



Introdução

No mundo de telefonia, um media server é o nome dado ao componente que processa stream de audio e/ou vídeo associado com uma chamada telefonica ou conexões. Serviços de conferencia são exemplos particulares de como o media server podem ser usados, como uma "engine" especial que junta as streams de áudio para que todos os participantes da conferencia possam ouvir. Um media server pode ser usado para interpretar tons DTMF usados para navegar em IVR (Interactive Voice Response). Como processador de vídeo, ele pode ser usado para mudar streams de video, pos exemplo de um codec para outro ou mudar o tamanho de uma imagem. Todas estas funções são de responsabilidade do Media Server.


Few of the real Media Server Use Cases are defined here.

Media Server can be Hardware Media Server or Software Based. The Hardware Media Server uses the hardware components for processing the audio/video. Depending on which hardware media server, there would be individual hardware dedicated to do specific job for example reduction of echo etc. In case of Software Media Server all the audio/video processing is done by a software, no specifc hardware is used.

Instalação

Edite o arquivo run.sh e crie uma variável JAVA_HOME e configure o caminho para a instalação do JDK 6.

JAVA_HOME="/usr/java/jdk1.6.0_18"

Atenção: O Mobicents Media Server 2.x.y tem o serviço de RTSP, que utiliza por padrão a porta 554. Portanto ou você inicie-o como root ou mude a porta no arquivo rtsp-conf.xml dentro do diretório deploy.

Atenção: Dentro do diretório deploy existem dois arquivos comp-beans.xml e rtp-beans.xml. O primeiro arquivo deve ser instalado antes do segundo. Não sei porque, o JBoss as vezes não consegue determinar a ordem correta. Portanto vamos forçar esta ordem renomeando-os repectivamente para 0_comp-beans.xml e 1_rtp-beans.xml.

Resource Adaptor


Introdução

Resources são entidades que representam e interagem com outros sistemas fora do SLEE, tais como dispositivos de rede, pilhas de protocolos, diretórios e banco de dados.

Estes recursos podem ou não ter APIs Java existentes. Como exemplo de recursos que incluem API Java estão o protocolo SIP, suportado pela JAIN SIP (JSR-32). Banco de dados é outro exemplo utilizando a JDBC API. Estas APIs java definem classes e/ou interfaces para interagirem com o recurso e para representar os eventos disparados pelo recurso.

No caso do Coreo, utilizei a API de EJB 3 para interagir com as aplicações. Através deste RA é possível solicitar via EJB 3 ao mobicents, iniciar uma nova chamada, desligar a ligação. O Recurso é identificado por um ID que pode ser o callId ou qualquer outro número gerado.

Resource Adaptors adequam um recurso em particular para os requisitos do SLEE. Um RA tipicamente recebe mensagem de um sistema externo através de um protocolo de rede (SIP, HTTP) e envia-os para dentro do SLEE.

Visão Geral da aquitetura

A arquitetura do RA consiste em APIs que são implementadas pelo SLEE e APIs que são implementadas por cada RA. Segue abaixo alguns conceitos importantes por trás da arquitetura:

  • Resource Adaptor Type

É o conjunto de "interfaces" que os SBBs usam para interagir com um resource

  • Resource Adaptor

Um Resource Adaptor é uma implementação de um ou mais Resource Adaptor Types

  • Resource Adaptor Entity

É uma instancia (pode ser muitas) de um Resource Adaptor

  • Resource Adaptor Object

É o objeto java usado pelo SLEE para interagir com o Resource Adaptor Entity (busca um activity object, inidica o fim do activity,...)

  • Resource Adaptor Context

É o objeto java que provê maneiras para o Resource Adaptor Object interagir com o SLEE, como o SleeEndpoint, usado para iniciar/finalizar uma activity, disparar eventos, etc

Arquivo:Arquitetura ra1.png

Resource Adaptor Type

Cada RA Type precisa definir

  • Event Types que são lançados dentro do SLEE
  • Activity Types, as interfaces para os objetos Activity
  • Activity Context Interface Factory a interface que pode ser usada para recuperar o Activity Context Interface de um Activity
  • Resource Adaptor SBB interface, usado pelos SBBs para interagirem com um Resource Adaptor Entity
  • Uma documentação que define como cada activity finaliza (por exemplo, um SIP Dialog Activity finaliza quando é recebido um BYE)

Resource Adaptor Type XML Descriptor

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE resource-adaptor-type-jar PUBLIC "-//Sun Microsystems, Inc.//DTD JAIN SLEE Resource Adaptor Type 1.1//EN" 
			"http://java.sun.com/dtd/slee-resource-adaptor-type-jar_1_1.dtd">

<resource-adaptor-type-jar>

	<resource-adaptor-type>

		<resource-adaptor-type-name>JAIN SIP</resource-adaptor-type-name>
		<resource-adaptor-type-vendor>javax.sip</resource-adaptor-type-vendor>
		<resource-adaptor-type-version>1.2</resource-adaptor-type-version>

		<library-ref>
			<library-name>jain-sip</library-name>
			<library-vendor>javax.sip</library-vendor>
			<library-version>1.2</library-version>
		</library-ref>
    
		<resource-adaptor-type-classes>

			<activity-type><activity-type-name>javax.sip.DialogActivity</activity-type-name></activity-type>
			<activity-type><activity-type-name>javax.sip.ClientTransaction</activity-type-name></activity-type>
			<activity-type><activity-type-name>javax.sip.ServerTransaction</activity-type-name></activity-type>

			<activity-context-interface-factory-interface>
				<activity-context-interface-factory-interface-name>
					net.java.slee.resource.sip.SipActivityContextInterfaceFactory
				</activity-context-interface-factory-interface-name>
			</activity-context-interface-factory-interface>

			<resource-adaptor-interface>
				<resource-adaptor-interface-name>
					net.java.slee.resource.sip.SleeSipProvider
				</resource-adaptor-interface-name>
			</resource-adaptor-interface>

		</resource-adaptor-type-classes>

		<event-type-ref>
			<event-type-name>javax.sip.message.Response.TRYING</event-type-name>
			<event-type-vendor>net.java.slee</event-type-vendor>
			<event-type-version>1.2</event-type-version>
		</event-type-ref>

		<!-- . . . --> 

	</resource-adaptor-type>

</resource-adaptor-type-jar>

Resource Adaptor

  • Cada RA precisa implementar
    • Resource Adaptor Object (classe que implementa javax.slee.resource.ResourceAdaptor)
    • Activity e RA SBB Interfaces para os RA Types que ela referencia
  • Cada RA pode implementar
    • Marshaller object usado para transformar Activity Handles e eventos em bytes de uma maneira otimizada essencial para tolerancia a falhas no SLEE

Resource Adaptor XML Descriptor

<resource-adaptor-jar>

    <resource-adaptor>

       <resource-adaptor-name>JainSipResourceAdaptor</resource-adaptor-name>
       <resource-adaptor-vendor>net.java.slee.sip</resource-adaptor-vendor>
       <resource-adaptor-version>1.2</resource-adaptor-version>

       <resource-adaptor-type-ref>
            <resource-adaptor-type-name>JAIN SIP</resource-adaptor-type-name>
            <resource-adaptor-type-vendor>javax.sip</resource-adaptor-type-vendor>
            <resource-adaptor-type-version>1.2</resource-adaptor-type-version>
       </resource-adaptor-type-ref>
    
        <resource-adaptor-classes>
            <resource-adaptor-class>
                <resource-adaptor-class-name>
                    org.mobicents.slee.resource.sip11.SipResourceAdaptor
                </resource-adaptor-class-name>
            </resource-adaptor-class>
        </resource-adaptor-classes>
        
        <config-property>
            <config-property-name>javax.sip.PORT</config-property-name>
            <config-property-type>java.lang.Integer</config-property-type>
            <config-property-value>5060</config-property-value>
        </config-property>
        
        <!-- ... -->
        
    </resource-adaptor>
    
</resource-adaptor-jar>

Resource Adaptor Entity

  • É a entidade lógica que representa o estado persistente de um Resource Adaptor configurado
  • Ele tem uma máquina de estado
  • Várias RA Entities podem ser instanciados a partir de um único Resource Adaptor
  • Um RA Entity de um Resource Adaptor instalado no SLEE é criado e gerenciado usnado JMX através do MBean ResourceManagementMBean

Resource Adaptor Entity Configuration

  • Cada Resource Adaptor define um conjunto de propriedades no seu descritor XML
  • A configuração do RA Entity pode ser mudada em runtime utilizando JMX, claro que se o RA permitir este comportamento. Para ativar o suporte edite a atributo supports-active-reconfiguration para true da tag resrouce-adaptor-class
  • Uma propriedade de configuração pode ser um dos seguintes tipos java: String, Character, Integer, Boolean, Double, Byte, Short, Long e Float
  • ConigProperties é o objeto java que representa o conjunto de propriedades de configuração do RA Entity, e é parte estado persistente do RA Entity

Resource Adaptor Entity Lifecycle

  • O RA Object associado com um Active RA Entity pode criar novas activities, disparar eventos e finalizar activities.
  • Todas as transições de estado resultantes de invoçações do ResourceManagementMBean, exceto STOPPING->INACTIVE, é feita pelo SLEE quando todas os RA Entity Activities terminam

Arquivo:Ciclo vida ra.png

Resource Adaptor Object

  • É uma implementação da interface javax.slee.resource.ResourceAdaptor
  • RA Objects são os objetos java que executam em nome do RA Entities e são providas com as propriedades de configuração do RA Entity
  • Também tem um ciclo de vida
  • Um RA Object pode ser tanto configurado ou sem-configuração
    • Um RA Object configurado pode estar nos estados Inactive, Active ou Stopping
    • Um RA Object sem-configuração está no estado Unconfigured
  • Existe pelo menos um RA Object na JVM para cada RA Entity. O SLEE pode criar RA Objects sem-configuração para um RA Entity, se for necessário caso seja invocado o método raVerifyConfiguration

Resource Adaptor Object Lifecycle

  • Unconfigured: O RA Object foi criado e disponibilizado com um objeto ResourceAdaptorContext, mas não tem informações de configuração para o RA Entity para o qual ele foi criado
  • Inactive: O RA Object foi configurado para o RA Entity. Ele está pronto para rodar em nome do RA Entity, mas ainda não está criando Activities ou disparando eventos
  • Active: O RA Object pode criar novas Activities, disparar eventos e finalizar activities em nome do RA Entity
  • Stopping: O RA Object está sendo desativado, continuando a gerenciar quaisquer Activities remanescente. Ele pode disparar eventos e finalizar Activities, mas não pode iniciar novas Activities
  • Todas as transições são chamadas no objeto ResourceAdaptor, exceto STOPPING->INACTIVE que é feita pelo SLEE quando todas as RA Entity Activities finalizam

Arquivo:Ra ciclo vida 2.png

Activity Handles

  • Um Resource Adaptor utiliza um Activity Handle para identificar cada Activity que ele iniciou, finalizou ou disparou eventos no SLEE
    • Define um contrato específico para os Activity Objects
    • Tornam a distribuição em cluster mais fácil
  • Cada Activity Handle identifica uma Activity. Existe uma relação 1:1 entre o Activity Handle e uma Activity
  • Existe uma relação 1:1 entre um Activity Handle (pertencente a um RA Entity) e um Activity Context dentro do SLEE, usados para entregar os eventos para os SBBs
  • Um Activity Handle implementado pelo Resource Adaptor precisa implementar a interface javax.slee.resource.ActivityHandle
package javax.slee.resource;

public interface ActivityHandle {
  
   public boolean equals(Object obj);
   public int hashCode();

}

Fireable Event Types

  • O Resource Adaptor usa o FireableEventTypes para disparar eventos
  • O FireableEventType para um EventType pode ser obtido a partir do Event Lookup Facility fornecido no contexto do Resource Adaptor
  • Um Resource Adaptor só pode obter objetos , tal como FireableEventType, relacionado com os eventos que ele declara, a menos que um comportamento diferente seja definido no descritor XML (propriedade ignore-ratype-event-type-check do element resource-adaptor)

Transactions

  • O SLEE Transactions Manager pode ser obtido a partir do contexto do Resource Adaptor
  • O RA pode iniciar novas transações, para uma agregação fácil de operações ou porque alguns recursos precisam ser executados em um contexto transacional - como Profiles SLEE que precisa de commit ou rollback
  • Chamadas a partir de SBBs tem um contexto de transação que é propagado dentro do Resource Adaptor que não pode fazer um commit ou rollback na transação ativa

Resource Adaptor Interface

  • Métodos do ciclo de vida: Permite o SLEE gerenciar o ciclo de vida dos RA Object
  • Métodos de gerenciamento de configuração: Permite o SLEE gerenciar mudanças de configuração do RA Object
  • Métodos de acesso a interface: Permite o SLEE acesso aos objetos que implementam interfaces adicionais providas pelo Resource Adaptor, tais como o RA SBB Interface
  • Métodos do Filtro de Eventos: O SLEE informa um RA Object que Event Type pode ser processado pelo serviços instalados no SLEE. Estes métodos permitem um RA Object filtrar eventos que nunca serão capturados no SLEE
  • Métodos de CallBack Obrigatórios: Chamados pelo SLEE, o RA Object é esperado seguir o contrato para estes métodos
  • Métodos de CallBack Opcionais: Apenas chamados pelo SLEE se o RA Object requerer que eles sejam chamados. O RA Object requer a chamada destes métodos através do uso de ActivityFlags ou EventFlags dentro da chamada do SLEEEndpoint
  • A não ser que seja especificado, todos os métodos na interface do ResrouceAdatptor são executados dentro de um contexto de transação não especificado. Se um método requer o uso de transação, então ele pode usar a interface SleeTransactionManager para chegar por uma transação activa, e iniciar uma se necessário
  • O ciclo de vida e chamadas de métodos de configuração, em um RA Object único, são serializadas. Todos os outros métodos podem ser chamados pelo SLEE, enquanto o RA Object está Inativo, Ativo ou no estado Stopping, e por muitas threads ao mesmo tempo, entretanto estes métodos precisa ser escritos para chamada concorrente para o handle.

Resource Adaptor Interface: Lifecycle Methods

Pesquisadores

  • Normandes Junior



Mobicents 2.x.y - JAIN SLEE 1.1



Introdução

O Mobicents 2.x.y JAIN SLEE segue a especificação JSR-240.

Para este documento, irei considerar que você já tem um conhecimento prévio do Eclipse, Maven e irá usar a distribuição binária do Mobicents. Também irei considerar que você já tem o plugin do Maven para o eclipse instalado.

Instalação

Acesse a página de downloads do mobicents em http://sourceforge.net/projects/mobicents/files/ . Para este tutorial irei utilizar a versão Mobicents JAIN SLEE Server 2.0.0.GA.

Descompacte o arquivo .zip em um diretório chamado mobicents-jainslee-2.0.0.GA. Dentro deste diretório já tem o JBoss 5.1.0.GA embutido, portanto acesse-o e configure o arquivo JBOSS_HOME/bin/run.conf informando o JAVA_HOME.

Archetype para criação de aplicações do Mobicents

O mobicents provê alguns plugins para desenvolvimento de aplicações. Até o momento da escrita deste documento, os plugins são para a utilização do Mobicents 1.x.y. Os plugins para o desenvolvimento de aplicações para o Mobicents 2.x.y será liberado em breve, mas existe um workaround para que possamos utilizar os plugins do Mobicents 1.x.y para as aplicações no Mobicents 2.x.y.

Vamos utilizar o jain-slee-basic-service archetype do Mobicents 1.x.y e editar os arquivos de configuração do projeto para faze-lo funcionar com o 2.x.y.

Crie um arquivo archetype-catalog.xml no .m2 do seu maven com o conteúdo abaixo.

<?xml version="1.0" encoding="UTF-8"?>
<archetype-catalog>
    <archetypes>
        <archetype>
            <groupId>org.mobicents.tools.maven.archetype.slee</groupId>
            <artifactId>jain-slee-basic-service</artifactId>
            <version>1.0.0.BETA1</version>
            <repository>http://repository.jboss.org/maven2</repository>
        </archetype>
   </archetypes>
</archetype-catalog>

Primeiro projeto de exemplo

Crie um novo projeto do maven no eclipse em File —> New —> Other –> Maven Project.

Na primeira tela, selecione Advanced e desmarque a opção Separate projects for modules. Isto é para ele não gerar vários projetos no eclipse.

Clique em Next até você encontrar a tela que pedirá você selecionar o archetype. Quando chegar nesta tela, clique em Configure e adicione o archetype-catalog.xml que você criou previamente. Depois de configurado, a tela deverá se parecer com a figura baixo.

Arquivo:New Maven Project .png

Selecione o jain-slee-basic-service que criará um projeto para o Mobicents 1.x.y. Lembrando que para a versão 2.x.y ainda não temos o archetype.

Agora configure o seu projeto informando o group id, artifact id e versão.

O projeto criado contem um parent pom e dois módulos filhos sbb'edu.

No parent pom.xml remova as configurações de repositório - caso esteja dentro da CTBC, utilize o nosso repositório. E edite em dependencyManagement colocando a versão correta do mobicents, como abaixo.

<dependency>
  <groupId>org.mobicents.servers.jainslee.core</groupId>
  <artifactId>mobicents-slee-core</artifactId>
  <version>2.0.0.GA</version>	
  <type>pom</type>
  <scope>import</scope>			
</dependency>

Edite também o arquivo sbb/src/main/resources/sbb-jar.xml e adicione o seguinte trecho logo abaixo de <?xml...

<!DOCTYPE sbb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD JAIN SLEE SBB 1.1//EN"
                         "http://java.sun.com/dtd/slee-sbb-jar_1_1.dtd">


Edite o arquivo du/src/main/resources/services/service.xml e adicione o seguinte trecho logo abaixo de <?xml... substituindo o existente por:

<!DOCTYPE service-xml PUBLIC "-//Sun Microsystems, Inc.//DTD JAIN SLEE Service 1.1//EN"
                             "http://java.sun.com/dtd/slee-service-xml_1_1.dtd">

Edite o arquivo du/pom.xml apagando a versão do plugin maven-du-plugin para utilizarmos sempre a última.

Este já é um primeiro projeto funcionando para o Mobicents. Tá certo que ele não faz muita coisa, mas já podemos testar a implantação. Execute os goals clean install. Um aquivo jar será gerado dentro da pasta du/target. Copie-o para a pasta deploy do Mobicents.

Quando você copiar o jar para a pasta deploy, você verá o serviço sendo ativado e uma mensagem de log aparecendo.

Instalando um Resource Adaptor (RA)

No diretório MOBICENTS_HOME acesse o diretório resources. Você verá vários RAs prontos para serem utilizados. Para poder instalar no Mobicents, basta acessar o diretório do RA que você deseja instalar, por exemplo http-client e executar o comando ant.

Projetos do Coreo

Lembrar que o events-library deve ser implantado no lib do JBoss devido a problemas de Class Loading

Adicionando como serviço do Linux

Crie um arquivo chamado mobicents2 em /etc/init.d/ e coloque o conteúdo abaixo. OBS: Edite algumas propriedades no arquivo como local de instalação do JBoss, usuário que irá ser usado para iniciar, JAVA_HOME e IP que o JBoss irá utilizar para iniciar.

#!/bin/sh

# Informe o local de instalação do JBoss - JBOSS_HOME
JBOSS_HOME=${JBOSS_HOME:-"/opt/mobicents2/jboss-5.1.0.GA"}

# Informe o usuário que irá executar (levantar) o JBoss
JBOSS_USER=${JBOSS_USER:-"mobicents"}

# Configure o JAVA_HOME
JAVAPTH=${JAVAPTH:-"/opt/jdk1.6.0_18"}

# Configure qual instancia do JBoss irá subir
JBOSS_CONF=${JBOSS_CONF:-"default"}

# Configure o IP que o JBoss irá escutar 
JBOSS_HOST=200.170.138.251

#if JBOSS_HOST specified, use -b to bind jboss services to that address
JBOSS_BIND_ADDR=${JBOSS_HOST:+"-b $JBOSS_HOST"}

#define the classpath for the shutdown class
JBOSSCP=${JBOSSCP:-"$JBOSS_HOME/bin/shutdown.jar:$JBOSS_HOME/client/jnet.jar"}

#define the script to use to start jboss
JBOSSSH=${JBOSSSH:-"$JBOSS_HOME/bin/run.sh -c $JBOSS_CONF $JBOSS_BIND_ADDR"}
if [ "$JBOSS_USER" = "RUNASIS" ]; then
  SUBIT=""
else
  SUBIT="su - $JBOSS_USER -c "
fi

if [ -n "$JBOSS_CONSOLE" -a ! -d "$JBOSS_CONSOLE" ]; then
  # ensure the file exists
  touch $JBOSS_CONSOLE
  if [ ! -z "$SUBIT" ]; then
    chown $JBOSS_USER $JBOSS_CONSOLE
  fi
fi

if [ -n "$JBOSS_CONSOLE" -a ! -f "$JBOSS_CONSOLE" ]; then
  echo "WARNING: location for saving console log invalid: $JBOSS_CONSOLE"
  echo "WARNING: ignoring it and using /dev/null"
  JBOSS_CONSOLE="/dev/null"
fi

#define what will be done with the console log
JBOSS_CONSOLE=${JBOSS_CONSOLE:-"/dev/null"}

JBOSS_CMD_START="cd $JBOSS_HOME/bin; $JBOSSSH"
JBOSS_CMD_STOP=${JBOSS_CMD_STOP:-"$JAVAPTH/bin/java -classpath $JBOSSCP org.jboss.Shutdown --server=jnp://$JBOSS_HOST"}

if [ -z "`echo $PATH | grep $JAVAPTH`" ]; then
  export PATH=$PATH:$JAVAPTH
fi

if [ ! -d "$JBOSS_HOME" ]; then
  echo JBOSS_HOME does not exist as a valid directory : $JBOSS_HOME
  exit 1
fi

echo JBOSS_CMD_START = $JBOSS_CMD_START

case "$1" in
start)

    cd $JBOSS_HOME/bin
    if [ -z "$SUBIT" ]; then
        eval $JBOSS_CMD_START >${JBOSS_CONSOLE} 2>&1 &
    else
        $SUBIT "$JBOSS_CMD_START >${JBOSS_CONSOLE} 2>&1 &"
    fi
    ;;
stop)
    if [ -z "$SUBIT" ]; then
        $JBOSS_CMD_STOP
    else
        $SUBIT "$JBOSS_CMD_STOP"
    fi
    ;;
*)
    echo "usage: $0 (start|stop)"
esac

Pesquisadores

  • Normandes Junior
  • Caio César Ferreira
  • Caio Eduardo Cunha Machado Caetano