===== Llamadas voice over IP ===== \\ * Esta función sólo está disponible en el framework Android. * La versión del sistema operativo debe ser Android 2.3.X (Gingerbread) o superior. * A la hora de desarrollar, es conveniente estar atento a los mensajes del logcat que vienen bajo el tag "xonevoip" y "sipmanager", para solucionar errores. ==== Implementación ==== \\ Para empezar, descargamos e instalamos el módulo de llamadas xonevoip desde xonesupport. \\ Como las llamadas telefónicas son algo que se puede recibir en cualquier momento, usamos un objeto global como pueden ser las variables user(""). Para ello, usamos createobject("xonevoip") y se lo asignamos a algo como MAP_VOIP. \\ Si las funciones voip no están soportadas en este terminal, al crear el objeto saltará una excepción y mostrará un mensaje de aviso por pantalla. \\ Necesitamos también definir en el nodo de la aplicación el atributo phone-coll="coleccionllamadaentrante", que se llamará automáticamente cuando se reciba una llamada desde ese perfil y que debe contener, como mínimo, los botones de colgar y descolgar la llamada. La idea bajo esta implementación, es que el desarrollador cree los botones para hacer llamadas, recibirlas o registrarse con el servidor, y que diseñe una pantalla de llamadas a su gusto. \\ Por ejemplo, se puede hacer que se registre al loguearse en la aplicación con los datos que se saquen de la base de datos y que haya una opción en algún menú para hacer las llamadas. \\ Para las pruebas, se puede montar un servidor [[http://www.asterisk.org/ | Asterisk®]] o usar algún proveedor gratuito como [[http://www.iptel.org/service | IPTel.]] \\ A continuación se describen las funciones y más abajo se muestra un ejemplo de uso completo. ==== Funciones de registro ==== === CreateProfile === ^ Nombre | createprofile(usuario, servidor) | ^ Parámetro ^ Descripción ^ | usuario | Nombre de usuario de la cuenta SIP. | | servidor | Dominio del servidor SIP. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").CreateProfile "usuario", "servidor.org" === SetPassword === \\ ^ Nombre | setpassword(password) | ^ Parámetro ^ Descripción ^ | password | Define la contraseña de la cuenta SIP. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetPassword "pass" === SetProtocol === \\ ^ Nombre | setprotocol(protocolo) | ^ Parámetro ^ Descripción ^ | protocolo | Protocolo para conectarse al servidor. Casi siempre es UDP. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetProtocol "UDP" === SetPort === \\ ^ Nombre | setport(puerto) | ^ Parámetro ^ Descripción ^ | puerto | Puerto al que conectarse del servidor. Casi siempre es 5060. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetPort 5060 === SetSendKeepAlive === \\ ^ Nombre | setsendkeepalive(keepalive) | ^ Parámetro ^ Descripción ^ | keepalive | Define si se debe enviar un paquete de keepalive al servidor. Puede ser true o false. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetSendKeepAlive "true" === SetOutboundProxy === \\ ^ Nombre | setoutboundproxy(direccion) | ^ Parámetro ^ Descripción ^ | direccion | IP o dominio del servidor proxy para las llamadas salientes, si fuera necesario. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetOutboundProxy "212.212.212.212" === SetDisplayName === \\ Nombre que se ve al hacer una llamada. Lo proporciona el proveedor voip \\ ^ Nombre | setdisplayname(nombre) | ^ Parámetro ^ Descripción ^ | nombre | Nombre que se mostrará. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetProfileName "Test VoIP 01" === SetProfileName === \\ Define el nombre del perfil que se puede ver en los ajustes de cuentas voipde Android. \\ ^ Nombre | setprofilename(nombre) | ^ Parámetro ^ Descripción ^ | nombre | Nombre interno del perfil. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetProfileName "Test VoIP 01" === AddProfile === \\ Da por válidos el resto de ajustes y crea el perfil. \\ ^ Nombre | addprofile() | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").AddProfile === RegisterProfile === \\ Una vez creado el perfil, lo registra para poder recibir llamadas. \\ ^ Nombre | registerprofile() | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").RegisterProfile === UnRegisterProfile === \\ Esta llamada desactiva el perfil y no deja pasar ni recibir llamadas. Según la versión de Android, esta llamada puede ser ignorada. [TODO] \\ ^ Nombre | unregisterprofile() | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").UnRegisterProfile === SetRingtone === \\ ^ Nombre | setringtone(fichero) | ^ Parámetro ^ Descripción ^ | fichero | Nombre del fichero de sonido que se reproducirá al recibir una llamada desde este perfil. Puede ser .WAV, .MP3 o lo que sea capaz de reproducir el terminal. Se recomienda usar un .WAV no demasiado pesado. | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SetRingtone "ringtone.mp3" ==== Funciones de llamada saliente ==== === MakeVoIPCall === \\ ^ Nombre | makevoipcall(direccionsip) | ^ Parámetro ^ Descripción ^ | direccionsip | Dirección a la cual hacer la llamada | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").MakeVoIPCall "test@servidorsip.com" ==== Funciones de llamada entrante ==== === AnswerVoIPCall === \\ Responde a la llamada entrante. \\ ^ Nombre | answervoipcall() | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").MakeVoIPCall "test@servidorsip.com" ==== Funciones de llamada ==== === HangVoIPCall === \\ Cuelga la llamada, se haya establecido o no. \\ ^ Nombre | answervoipcall() | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").HangVoIPCall === SendDTMF === \\ Envía tonos DTMF en la llamada activa. No suele funcionar, pues sólo existe un codec voip capaz de transportar esta clase de tonos en modo "in-band" (G711) y no es habitual en proveedores voip. \\ ^ Nombre | senddtmf(numero) | ^ Parámetro ^ Descripción ^ | numero | Cadena con el número a enviar. Valores posibles: 0123456789ABCD | ^ Valor devuelto | 0 si OK, -1 si error. | Ejemplo de uso: user("MAP_VOIP").SendDTMF "1234" ==== EJEMPLO ==== Este es un ejemplo en plan "Walkie-Talkie". Para usarlo cojemos dos teléfonos, en uno cargamos el primer mappings y en el otro el segundo. **Perfil #1:** **Perfil #2:**