La implementación realizada en este trabajo, se basa en los métodos descritos en el libro de Rogelio Martínez Perea, "Internet Multimedia Communications Using SIP".
El método de explicación del proyecto, es en base a la descripción de la arquitectura del software, las interfaces de comunicación entre cada bloque y finalmente la descripción de la máquina de estados.
Componentes
Los componentes de la arquitectura del telefono SimpleSIP, se describen a continuación, ademas se muestra una figura de como se interconectan entre ellos.
Es importante destacar que solo la interfaz gráfica "SimpleSIPGUI" y el núcleo del software "SimpleSIPlistener" fueron implementadas en este proyecto. Los demás componentes son los provistos por NIST y JAVA.
Interfaz de Usuario: Implementado por la clase “simpleSIPgui”, la cual muestra la interfaz de usuario y interactua con el teléfono.
Núcleo: Implementado por la clase “sipleSIPlistener”. Es una máquina de estados finita que recibe eventos desde la interfaz de usuario y del SIP Stack, es la encargada de coordinar la ejecución de los demás componentes.
Implementación SIP: En este caso se utiliza el SIP stack de NIST, que utiliza JAIN SIP 1.2.
Administrador SDP: Interfaz que simplifica la funcionalidad de JAIN SDP API para este caso particular.
Implementación SDP: En este caso se utiliza el SDP stack de NIST, que implementa la interfaz JAIN SDP.
Herramienta de Voz: Maneja la captura y la reproducción de la voz, además de transmitir y recibir los datos stream enviados por la red.
JMF: Herramientas de JAVA para manejar archivos multimedia. Se utiliza JMF 2.1.1 de Sun.
Interfaz
- newSimpleSIPlistener(conf,ref): Método constructor cuando se presiona el botón “conectar”. Conf lleva la configuración de la conexión y ref lleva la información del botón presionado.
- userInput(type, destination): Lleva la información de los botones presionados en type y la información del destino en destination.
- showStatus(mensaje): Muestra el estado de la máquina de estados finita.
- createSDP(): Crea un mensaje SDP basado en los parámetros de la aplicación.
- getSDP(): Obtiene los parámetros SDP relevantes para la aplicación provenientes de un mensaje SDP.
- startMedia(): Le dice a la herramienta de voz que comience la transmisión y recepción de voz.
- stopMedia(): Le dice a la herramienta de voz que termine la transmisión y recepción de voz.
Diagrama de estados
Desocupado
Es el estado inicial cuando se conecta el teléfono a la red. Se entra cuando se presiona el botón “conectar”. El teléfono esta listo para llamar o recibir llamadas. Siempre que una llamada es finalizada, se vuelve a este estado.
Eventos entrantes:
- Cuando el usuario cancela una llamada mientras esta se realiza.
- Cuando el usuario no acepta una llamada entrante.
- Cuando el timer para el ACK expira.
- Cuando el usuario cancela una llamada en curso.
- Cuando el usuario presiona el botón “Llamar”, produce un mensaje INVITE.
- Cuando una invitación es recibida, lo cual se envía un código 180, por lo que se pasa al estado “Llamando”.
Espera Provisoria
Este estado se produce cuando el teléfono envía una invitación, y no sale hasta que recibe una respuesta recivo de parte del otro teléfono.
Eventos entrantes:
- Cuando se presiona el botón “Llamar” en estado desocupado.
- Cuando se recibe una respuesta provisional, se pasa al estado “Esperar Final”.
- Cuando se recibe una respuesta final, se va al estado “Conectado”.
- Cuando se presiona el botón “Colgar”, se va al estado “Desocupado”.
Esperar Final
Este es el estado cuando se recibe una respuesta provisional y el teléfono espera por la respuesta final.
Eventos entrantes:
- Cuando una respuesta provisional es recibida. El estado del teléfono no cambia.
- Cuando se recibe una respuesta final, lo que hace que el teléfono envie un ACK. Se pasa al estado “Conectado”.
- Cuando se presiona el botón “Colgar”, se genera una petición para cancelar y el teléfono pasa al estado “Desocupado.”
Conectado
Representa la situación cuando la llamada esta activa y una sesión esta establecida entre 2 puntos.
Eventos entrantes:
- Cuando se recibe una respuesta final, causando el envío de un ACK.
- Cuando se recibe un requerimiento de ACK.
- Cuando se presiona el botón “Colgar”, se vuelve al estado “Desocupado”.
Llamando
Representa la situación cuando la llamada es recibida y una respuesta provisional 180 se genero, pero la llamada no es aceptada todavía.
Eventos entrantes:
- Cuando se recibe una invitación y una respuesta provisional es generada.
- Cuando se acepta la llamada, se genera un código 200 OK. Se va al estado “Esperando ACK”.
- Cuando se rechaza la llamada, se genera un código 486 y el teléfono vuelve al estado “Esperando”.
- Cuando se recibe un pedido de cancelación para la llamada saliente. El teléfono cambia al estado “Desocupado”.
Esperando ACK
Representa la situación cuando la llamada es aceptada pero todavía no se recibe el ACK.
Eventos entrantes:
- Cuando el usuario al cual se llama acepta la llamada y envía un mensaje 200 OK.
- Cuando se recibe un ACK, el teléfono pasa a “Conectado”.
- Cuando el tiempo para el recibo del ACK expira, pasa al estado “IDLE”.