viernes, 2 de marzo de 2012

SMS – T9 - Aplicaciones


Mandar mensajes desde nuestro celular es una de las tareas que más se utilizan al igual que las llamadas, en esta entrada explicare como es utilizado este servicio, como es que se comunican y se reciben estos mensajes.
¿Qué son y para que sirven?
Un mensaje SMS es una cadena alfanumérica de hasta 140 caracteres o de 160 caracteres de 7 bits, y cuyo encapsulado incluye una serie de parámetros. En principio, se emplean para enviar y recibir mensajes de texto normal, pero existen extensiones del protocolo básico que permiten incluir otros tipos de contenido, dar formato a los mensajes o encadenar varios mensajes de texto para permitir mayor longitud (formatos de SMS con imagen de Nokia, tonos IMY de Ericsson, estándar EMS para dar formato al texto e incluir imágenes y sonidos de pequeño tamaño).
En GSM existen varios tipos de mensajes de texto: mensajes de texto "puros", mensajes de configuración (que contienen los parámetros de conexión para otros servicios, como WAPo MMS), mensajes WAP Push, notificaciones de mensajes MMS.
En otros estándares de telefonía móvil (como CDMA2000 o UMTS) el proceso de los mensajes se realiza de otra forma, pero el funcionamiento es transparente de cara al usuario.
Mensajes MT-SM (de llegada al teléfono) y MO-SM (originados en el teléfono
En un principio, los mensajes SMS se definieron en el estándar GSM como un medio para que los operadores de red enviaran información sobre el servicio a los abonados, sin que éstos pudieran responder ni enviar mensajes a otros clientes. Este tipo de mensajes se denominaban MT-SM (Mobile Terminated-Short Message, es decir, mensajes que llegan al terminal del usuario). Sin embargo, la empresa Nokia desarrolló un sistema para permitir la comunicación bidireccional por SMS; los mensajes enviados por los usuarios pasaron a denominarse MO-SM (Mobile Originated, originados en el terminal del usuario).
Es necesario tener claras las diferencias entre ambos tipos de mensaje para comprender el funcionamiento del sistema.que no tiene nada q ver con lo q cobran
Los mensajes de texto son procesados por un SMSC o centro de mensajes cortos (Short Message Service Center) que se encarga de almacenarlos hasta que son enviados y de conectar con el resto de elementos de la red GSM.

¿Cómo son enviados?
Los mensajes cortos hacen un uso extremadamente eficaz de la red de radio, y además pueden ser enviados y recibidos en cualquier momento, incluso durante una llamada. La explicación es que, debido a su pequeño tamaño, los SMS no necesitan que se asigne un canal de radio al usuario, como ocurre durante una llamada, sino que se insertan en la información de señalización de la propia red, en los time slots reservados para este fin.
Algunos operadores han implementado el transporte de los mensajes SMS a través del protocolo de paquetes GPRS en lugar del canal de señalización, incrementando la velocidad de transmisión y la capacidad del sistema, pero este cambio opcional en el transporte no se encuentra muy extendido.
Red de celdas
Una red de celdas o red celular es una red formada por celdas de radio (o simplemente celdas) cada una con su propio transmisor, conocidas como estación base. Estas celdas son usadas con el fin de cubrir diferentes áreas para proveer cobertura de radio sobre un área más grande que el de una celda.
Los detalles del proceso de paginación varían de red a red, pero normalmente se conoce un número limitado de celdas donde el teléfono se encuentra (este grupo de celdas es llamado área de localización en los sistemas GSM o área de ruteo en los UMTS). La paginación comienza enviando mensajes de difusión en estas celdas. Los mensajes de paginación pueden ser usados para transferir información. Esto se usa, por ejemplo, en los sistemas CDMA para el envió de mensajes SMS.
El camino de un MO-SM
Cuando un usuario de la red genera un mensaje corto (MO-SM) se producen los siguientes acontecimientos:
El HLR donde está registrado el usuario decide si puede o no enviar mensajes; si todo está en orden,
El MSC al que está conectado el usuario recibe el mensaje, envía la información necesaria al VLR para su posterior tarificación y después lo remite al SMSC de origen;
El SMSC de origen envía el mensaje al SMSC de destino (en la figura, etiquetado SME). Una vez allí, se convierte en MT-SM y se procesa como veremos a continuación.
El SMSC de destino informa del estado del mensaje y devuelve un informe de recepción al MSC y al usuario. En la pantalla del usuario se advierte: “mensaje enviado”.
Si el usuario lo ha solicitado, recibirá posteriormente un mensaje de estado confirmándole si el usuario de destino ha recibido el mensaje o no, y un mensaje de error en caso de que caduque.
Por tanto, el método de envío de los SMS tiene un pequeño defecto: los mensajes se tarifican y confirman inicialmente al usuario cuando son enviados a la red, no al destino final,incluso aunque el cliente que los envía haya solicitado confirmación de envío. Un mensaje podría no llegar por problemas en la red destino, caducidad de la validez o cualquier otro motivo, pero sin embargo sera cobrado igualmente por el operador.
El camino de un MT-SM
Una vez hay un mensaje preparado para su envío en el SMSC de destino, originado por un usuario o por cualquier otra circunstancia, se le denomina MT-SM y el proceso de entrega es el siguiente:
El SMSC que ha recibido el mensaje lo almacena en su base de datos y solicita al VLR del usuario la información de localización;
Si el usuario destino está disponible, el SMSC envía al MSC el mensaje, indicando en que parte del BSS debe ser entregado; si no lo está, se almacena en el SMSC durante su periodo de vigencia;
Si el usuario destino está disponible, el MSC envía un aviso al VLR al que está conectado el usuario destino (que puede ser o no de su operador) para indicarle que va a entregarse un mensaje;
El VLR avisa al terminal del usuario y verifica si está conectado a la red (en zona de cobertura);
El VLR responde al MSC con el estado del usuario y, si está operativo, con la información de localización (parte del BSS en que se encuentra conectado);
El MSC envía el mensaje al usuario;
El MSC informa al SMSC de que el mensaje se ha entregado y puede ser borrado de su base de datos;
Opcionalmente, el SMSC de destino responde a quien originó el mensaje (normalmente, el SMSC origen) con un aviso de entrega del mensaje.
Arquitectura de red usada
Para la correcta gestión de los mensajes SMS se hace necesario introducir en el sistema GSM un nuevo elemento: el centro de mensajes cortos o SMSC (Short Message Service Center.) Las funciones del SMSC son:
Recibir y almacenar los mensajes cortos enviados por los usuarios (MO-SM) o por otras fuentes (avisos del operador, buzón de voz, sistemas de publicidad, alertas de correo electrónico...) hasta que puedan ser enviados;
Verificar los permisos para enviar mensajes, en comunicación con el HLR de origen;
Verificar si el usuario al que se envía el mensaje está operativo o no, mediante consulta al VLR de destino; si está operativo, el mensaje se envía, y si no se almacena temporalmente en el SMSC;
Verificar periódicamente el estado de los usuarios que tienen mensajes pendientes.
Otro tipo de mensajes T9
El texto predictivo es una tecnología de entrada de texto diseñada para teléfonos móviles. Esta tecnología permite formar palabras presionando un solo botón por cada letra, al contrario de presionar múltiples veces cada tecla hasta obtener la letra deseada. El objetivo principal de esta tecnología consiste en simplificar la escritura de mensajes de texto.
El texto predictivo funciona haciendo referencia a un diccionario con las palabras más comunes. Cuando el usuario presiona los botones de número, un algoritmo busca en el diccionario una lista de palabras posibles de acuerdo con la combinación de teclas presionada y muestra la opción más probable. El usuario puede confirmar la selección y continuar con la siguiente palabra o usar una tecla para ver las otras combinaciones posibles. A veces esto se combina con algún software para completar palabras.

EJEMPLO:
En el teclado típico del teléfono los números corresponden a las letras de la siguiente manera:
Para escribir la palabra 'hola' en el modo clásico se deberá:
1.   Presionar 4 (ghi) 2 veces para obtener 'h'
2.   Presionar 6 (mnoñ) 3 veces para obtener 'o'
3.   Presionar 5 (jkl) 3 veces para obtener 'l'
4.   Presionar 2 (abc) 1 vez para obtener 'a'
De la misma forma para obtener 'hola' con texto predictivo se deberá:
1.   Presionar 4 (ghi) 1 vez para obtener 'h'
2.   Presionar 6 (mno) 1 vez para obtener 'o'
3.   Presionar 5 (jkl) 1 vez para obtener 'l'
4.   Presionar 2 (abc) 1 vez para obtener 'a'

El sistema actualiza los caracteres visualizados cada vez que se presiona una tecla mostrando la palabra más probable. En este caso el texto predictivo reduce el número de botones presionados de 9 a 4.

Aplicaciones para android 
Actualmente se están usando muchas aplicaciones para android que utilizan este tipo de servicio de una manera gratuita sin tener que pagar a alguna compañía para poder mandar un mensaje de texto. Lo único que necesitamos hacer es que el celular con el que se quiere interactuar via mensaje tenga la misma aplicación que el que va a escribir, ambos con alguna conexión a internet para que funcione. A continuación mostrare algunas de las mas conocidas.

KakaoTalk: Elegida como la primera aplicación Android gratis de comunicación en el Android Market, es otra de las alternativas para estar al día con tus contactos.
Viber: Descubre esta aplicación para Android que te permite realizar llamadas y enviar mensajes de manera gratuita con tus contactos que tengan también Viber instalado.
GO SMS Pro:Descubre una nueva forma de enviar SMS a tus contactos. De forma más rápida y eficaz GO SMS Pro potencia las posibilidades de tu Android. GO SMS Pro es una de las mejores aplicaciones Android gratis para reemplazar el gestor SMS por defecto instalado en tu dispositivo. Con su agradable interfaz podrás leer los mensajes en forma de conversación, sincronizar tus SMS, organizarlos en carpetas y mucho más.
WhatsApp: es una aplicación que pretende ser el sustituto de los mensajes SMS, una alternativa realmente increíble para enviar sms gratis. WhatsApp Messenger, cuenta con la posibilidad de enviar fotografías, música, enlaces o cualquier tipo de archivo mediante el móvil. Lo mejor es que funciona también con los iPhone.

Bibliografía:
http://www.t9.com/404.aspx
http://espalandroid.net/tag/sms/
http://es.wikipedia.org/wiki/Sms
http://es.wikipedia.org/wiki/Texto_predictivo

Aplicación WiFi para Android

Android por ser open source proporciona para su desarrollo acceso a software para su uso como son el bluetooth y wifi ahora explicare como se utiliza las clases necesarias para conectar nuestro dispositivo android por wifi con algun otro que tambien lo utlize.

El paquete android.net.wifi provee los mecanismos por los cuales una aplicación Android puede acceder a la pila Wifi del sistema. La información que proporcionan las clases contenidas en android.net.wifi va desde los puntos de acceso detectados hasta el estado de la propia conexión, como pueden ser la velocidad, calidad del enlace, estado del sistema y un largo etcétera.
Además, el paquete también proporciona los métodos necesarios para escanear el entorno, iniciar y detener conexiones, configurar nuevas conexiones, y en general cualquier operación relacionada con la gestión de las conexiones del sistema.
El presente capítulo no es una descripción exhaustiva del manejo de las clases relacionadas con la comunicación WIFI, sino un resumen de las clases involucradas en el manejo del sistema WIFI y de sus capacidades.
Para una descripción detallada de todas las clases que se mostrarán a continuación, consúltese la Guía de Referencia de Android.
WifiManager
Es el punto de entrada a los servicios WIFI del sistema. Para obtener una instancia de la misma hay que pedirla al contexto de la aplicación (Context.getSystemService(Context.WIFI_SERVICE)). Ésta clase es única para todo el sistema y entre sus capacidades están las siguientes:
Permite acceder a la lista de redes configuradas tanto para consultarla como para modificarla permitiendo además editar parámetros concretos de cualquier configuración.
Se puede acceder a la conexión actual (si la hay). Puede iniciar una nueva conexión, detenerla y obtener información dinámica sobre el estado de la conexión.
Proporciona mecanismos para escanear el entorno en busca de Puntos de Acceso, dando toda la información sobre el mismo (tipo de encriptación, potencia, nombre, MAC, etcétera).
Proporciona un conjunto de Intents necesarios para implementar Broadcasts ante cualquier cambio de estado en la WIFI.
ScanResult
Contiene información relativa a los dispositivos descubiertos durante un escaneo del entorno. Por cada nuevo dispositivo se devolverá una instancia de ésta clase que lo representará. Sus campos, todos públicos, proporcionan la siguiente información
String BSSID: Dirección del Punto de Acceso.
String SSID: Nombre de la Red.
String capabilities: Describe el tipo de autenticación, la encriptación y la gestión de claves soportadas por el Punto de Acceso.
int frequency: Frecuencia en MHz del Punto de Acceso.
int level: Nivel de intensidad de la señal en dBm.
WifiConfiguration
Clase encargada de representar una configuración WIFI válida. Todos sus campos son públicos y proporcionan la siguiente información
WifiConfiguration.Status
Clase encargada de describir el estado de la conexión WIFI activa.
Para poder acceder a la API WIFI es necesario declarar los siguientes permisos en el manifest de nuestra aplicación:
  • ACCESS_WIFI_STATE permite acceder a la información sobre el estado de la WIFI y de todo lo relacionado con ella (conexiones, Puntos de Acceso configurados y/o detectados, etcétera).
  • CHANGE_WIFI_STATE permite cambiar todas las opciones relacionadas con la WIFI.
En el siguiente fragmento de código se puede ver la declaración de los citados permisos en el manifest:

Una vez que tenemos acceso al sistema WIFI de nuestro dispositivo, ya podremos llevar a cabo el escaneo. Antes de hacer ninguna operación es aconsejable asegurarse de que el sistema WIFI está activado. Si es así se puede comenzar a escanear. En caso contrario, habrá que esperar a que se active.

La función startScanning() comprueba el estado de la WIFI invocando a _wifiManager.isWifiEnabled(). Si la WIFI está desactivada mostrará un mensaje por la pantalla y retornará. En caso contrario, nuestra aplicación adquirirá la radio WIFI (_wifiLock.acquire()) y ésta quedará activada aunque dejemos de usar la aplicación durante un rato (en realidad, en éste caso no es necesario, pero se hace para que resulte ilustrativo).
Una vez que se ha adquirido la WIFI se inicia el escaneo con _wifiManager.startScan().
Recibiendo Intents
Android generará broadcasts intents para notificar cualquier cambio en el sistema WIFI. Los intents que nos pueden interesar a nosotros sonWifiManager.SCAN_RESULTS_AVAILABLE_ACTION, que nos notifica cuando ha finalizado un escaneo yWifiManager.SUPPLICANT_STATE_CHANGED_ACTION, que informa de que se ha producido un cambio en el estado de la WIFI.


En caso de que el intent recibido corresponda a SCAN_RESULTS_AVAILABLE_ACTION significará que el escaneo ha finalizado y que se puede leer el resultado (invocación a _wifiManager.getScanResults()).
El tipo de retorno de getScanResults() es List<ScanResult>. Se devolverá un ScanResult por Punto de Acceso detectado, del que podremos leer las propiedades como puede verse en el siguiente fragmento. En él se obtiene el SSID y el RSSI (atributo ScanResult.level) de los objetosScanResult que hay en un List para procesarlos posteriormente.


Si el intent recibido es SUPPLICANT_STATE_CHANGED_ACTION significará que se ha producido algún cambio en el estado de la WIFI. En el caso concreto de nuestra clase, interesa saber si la WIFI se ha activado o desactivado. intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,1)aportará información extra sobre el intent, del que podremos deducir si el cambio de estado ha sido o no el que nos interesa a nosotros. Si es así se realiza el proceso necesario, como puede verse en fragmento de código mostrado anteriormente.

Destructor de la clase

En nuestra clase se ha obtenido un bloqueo para la WIFI que la mantendrá encendida hasta que dicho blqueo no desaparezca. En éste caso es importante no olvidar desbloquear la WIFI, ya que de lo contrario ésta podría quedar encendida indefinidamente agotando la batería en poco tiempo. Lo mas aconsejable para ello es forzar el desbloqueo en el destructor de la clase, que como sabemos será invocado cuando se salga del ámbito de declaración de ésta. Así, cuando nuestra aplicación finalice se desbloquará la WIFI.
En caso de que se intente desbloquear sin haberse bloqueado antes no se generará ninguna excepción, ignorándose la llamada.


Bibliografía:
http://developer.android.com/reference/android/net/wifi/package-summary.html


jueves, 1 de marzo de 2012

Aplicación Bluetooth para Android

Explicare lo que se necesita para la API Bluetooth de android que será útiles para mi aplicación ya que usare una conexion de estas en mi proyecto. Espero a alguien le sea de utilidad.

Utilizando la API Bluetooth, una aplicación Android puede realizar las siguientes operaciones:

  • Buscar otros dispositivos bluetooth.
  • Consultar si está emparejado con un dispositivo bluetooth concreto.
  • Establecer canales RFCOMM.
  • Conectar con otros dispositivos a través del servicio de descubrimiento de dispositivos.
  • Realizar transferencia de datos entre otros dispositivos de forma bidireccional.
  • Manejar múltiples conexiones.
El paquete android.bluetooth proporciona cinco clases para el acceso a todas las funcionalidades que ofrece la API. Éstas clases son las siguientes:

·         BluetoothAdapter
Representa el adaptador bluetooth local, es decir, el dispositivo físico. Ésta clase el es entry point para toda la infraestructura bluetooth de nuestra aplicación. Con ella podemos descubrir otros dispositivos bluetooth activos cerca de nosotros, acceder a la lista de dispositivos emparejados, instanciar un objeto de la clase BluetoothDevice usando una MAC conocida o crear sockets para comunicar con otros dispositivos.
·         BluetoothDevice
Representa a un dispositivo bluetooth remoto. Se utiliza para solicitar una conexión con dicho dispositivo a través de un BluetoothSocket o también solicitar información acerca del dispositivo, como puede ser el nombre, la MAC, clase, etcétera.
·         BluetoothSocket
Representa una interfaz con otro dispositivo bluetooth en forma de socket. Ésta es la clase que permite una comunicación punto a punto con otro dispositivo enviando y recibiendo información en forma de streams de datos.
·         BluetoothServerSocket
Para poder establecer una conexión, uno de los dispositivos debe asumir el rol de Servidor (conexión pasiva) y otro el rol de Cliente (conexión activa).BluetoothServerSocket representa a un socket escuchando en el lado de la aplicación servidora.
Cuando el cliente solicita una conexión, un objeto de la clase BluetoothServerSocket se encarga de retornar un objeto de la clase BluetoothSocketque representará al servidor, siempre y cuando la conexión haya sido aceptada.
·         BluetoothClass
Ésta clase contiene un conjunto de propiedades (de solo lectura) que definen las características del dispositivo bluetooth al que representan.

Permisos


Para poder acceder a la API Bluetooth es necesario declarar al menos uno de los permisos dentro del manifest de nuestra aplicación.

Los permisos disponibles son dos:
  • BLUETOOTH, que permite únicamente realizar conexiones bluetooth y transferir datos.
  • BLUETOOTH_ADMIN, que permite, además de realizar conexiones bluetooth y transferencias de datos, manipular las opciones del sistema en lo referente a bluetooth, buscar otros dispositivos y realizar vínculos.
Un ejemplo de declaración del permiso en un manifest podría ser el siguiente


Vamos a conocer lo necesario en código para poder establecer nuestra conexión del android con algún otro dispositivo por medio de bluetooth.
Configuración del bluetooth

Antes de que cualquier aplicación pueda utilizar la infraestructura bluetooth debe hacer dos cosas: asegurarse de que el dispositivo sobre el que está ejecutando tiene soporte para bluetooth y si así es comprobar que está activado, activándolo si fuese necesario.
Éstas tareas básicas de comprobación y configuración son llevadas a cabo por la clase BluetoothAdapter antes mencionada.
Los pasos a seguir se pueden resumir de la siguiente manera:
  • Obtener el BluetoothAdapter que representará a nuestro dispositivo.
  • Activar el sistema bluetooth.
El siguiente ejemplo muestra como se realizarían éstas operaciones


Como podemos ver, lo primero que hacemos el obtener el BluetoothAdapter llamando al método estático getDefaultAdapter(). Una vez que tenemos el adaptador comprobamos que su valor no sea null, situación que correspondería con un adaptador nulo debido a que no hay dispositivos bluetooth. getDefaultAdapter es una operación estática debido a que el dispositivo físico de nuestro sistema que se encarga de realizar las tareas Bluetooth es único. Todas las instancias que tengamos de la clase BluetoothAdapter deben referirse al mismo dispositivo hardware, por lo que ésta clase se ha implementado como un singleton.
Una vez que tenemos el representante del dispositivo bluetooth, ya solo queda comprobar si está activado. Si no lo está, lo activamos nosotros.


Si el valor devuelto por isEnabled() es falso, tendremos que solicitar la activación del bluetooth. Creamos un Intent para que llame a la actividad de encendido del bluetooth (ACTION_REQUEST_ENABLE). Cuando dicha actividad finalice retornará el identificadorREQUEST_ENABLE_BT y el valor de retorno de la operación, que podrá ser RESULT_OK en caso de que se haya activado el bluetooth oRESULT_CANCELED en caso de que o bien se haya cancelado la acción o bien haya habido algún error.
En el siguiente fragmento podemos ver el callback de la actividad ACTION_REQUEST_ENABLE, que es llamada por Android cuando finaliza la actividad a la que se llamó a través de startActivityForResult():


En caso de que éste callback reciba como requestCode la constante REQUEST_ENABLE_BT, comprobará que el valor devuelto por la actividad (resultCode) corresponde con RESULT_OK para continuar la ejecución. Si por el contrario el valor devuelto esRESULT_CANCELED, la actividad finalizará.
Búsqueda de dispositivos
A través de la clase BluetoothAdapter se puede buscar dispositivos bluetooth remotos de dos formas distintas, o bien haciendo un descubrimiento de qué dispositivos hay en el radio de alcance, o bien obteniendo la lista de dispositivos emparejados al nuestro.
Una vez que se tiene identificado el dispositivo al que se quiere conectar (por cualquiera de los dos métodos comentados anteriormente), se puede intentar la conexión.
A continuación se describe como realizar los dos procesos, el de descubrimiento de nuevos dispositivos y el de consulta de los dispositivos emparejados.
Consultando los dispositivos emparejados
El proceso de descubrimiento de nuevos dispositivos es un proceso lento y costoso en términos de batería. Por tanto cuando se quiere conectar con otro dispositivo es recomendable consultar primero si dicho dispositivo está emparejado y si no lo está, entonces proceder al descubrimiento.
Para conocer qué dispositivos están emparejados con el nuestro, se invoca el método getBondedDevices(). Éste método devolverá un Set de objetos de tipo BluetoothDevice que representarán a los dispositivos emparejados. En el siguiente fragmento de código podemos ver un ejemplo:

Después de obtener el representante del dispositivo bluetooth se buscan todos los dispositivos remotos que están emparejados con él llamando a getBondedDevices(). El resultado se guarda en un Set<BluetoothDevice> que después podrá ser recorrido para obtener toda la información que necesitemos.
Descubrimiento de dispositivos

En caso de que el dispositivo con el que queramos conectar no esté emparejado con nuestro dispositivo, habrá que hacer un descubrimiento de dispositivos para localizarlo y emparejarlo.
Ésto se hace llamando a la función startDiscovery(), función que retornará inmediatamente devolviendo un booleano que indicará si la operación ha sido iniciada correctamente o ha habido algún problema.
Cómo se puede suponer, ésta función es asíncrona. El componente que la invoque deberá registrarse en un BroadcastReceiver para recibir todas las información de los dispositivos que se vayan descubriendo así como para saber cuando ha finalizado el proceso de descubrimiento.
Cada vez que se descubre un nuevo dispositivo, se recibirá a través de un broadcast un intent ACTION_FOUND. Éste Intent portará los campos EXTRA_DEVICE y EXTRA_CLASS, que contendrán, respectivamente, un objeto de la clase BluetoothDevice y otro de la claseBluetoothClass.
A continuación se muestra un ejemplo. Aquí, lo primero que se hace es registrarse en los broadcasts correspondientes.
Después se programan las acciones a realizar cuando se recibe cada broadcast:
Conectando dispositivos

Para que puede llevarse a cabo una conexión bluetooth es necesario disponer tanto de un cliente, que será quien inicie la conexión, como de un servidor, que será quien la atienda. Aunque en general dichos roles suelen estar bien diferenciados, la tendencia habitual en los dispositivos bluetooth es implementar tanto un cliente como un servidor en un mismo nodo, de modo que el dispositivo pueda recibir una conexión entrante pero a la vez pueda iniciarla él si se le pide. De ésta forma el nodo podrá adoptar cualquier rol.
Aunque lo comentando anteriormente es lo mas habitual, nada impide que una aplicación concreta actúe solo como cliente o solo como servidor.
Cuando tanto un cliente como un servidor tienen un objeto de la clase BluetoothSocket asociado al mismo RFCOMM se puede decir que existe una conexión entre ambos. En ése momento ambos dispositivos pueden pedir un stream de datos tanto de entrada como de salida a su socket correspondiente, de modo que se puedan intercambiar datos.
Servidor
Para la implementación de un servidor ha de mantenerse abierto un socket de tipo BluetoothServerSocket que será el encargado de escuchar todas las solicitudes de conexión entrantes.
Cuando se produce una solicitud y ésta es aceptada, BluetoothServerSocket proporciona un socket BluetoothSocket representando a la nueva conexión. Si es posible recibir mas conexiones, el BluetoothServerSocket deberá seguir escuchando, pero en caso de que el dispositivo solo vaya a manejar una conexión (que por otro lado suele ser lo mas habitual), es muy recomendable cerrar el BluetoothServerSocket y liberar sus recursos.
Concretando un poco, los pasos a seguir para implementar un servidor son los siguientes:
  • Obtener un BluetoothServerSocket a través de una llamada a listenUsingRfcommWithServiceRecord().
    listenUsingRfcommWithServiceRecord() creará un nuevo DSP que quedará registrado en nuestro sistema y que definirá de forma unívoca al servicio ofrecido por nuestra aplicación, de modo que cualquier cliente que lo necesite pueda pedir información sobre ése servicio concreto al servidor siempre y cuando conozca su nombre y obviando el resto de servicios disponibles. Una vez que el servidor muera, el DSP generado será eliminado del sistema.
    listenUsingRfcommWithServiceRecord() necesita dos parámetros: un nombre y un UUID. El primero sirve para identificar al servicio de modo que, como se ha comentado hace un momento, el cliente pueda obtener información acerca de él. El segundo es usado por el cliente para intentar conectar. Si en la petición de conexión el cliente no envía el UUID correspondiente al servicio, la conexión será rechazada.
  • Comenzar a escuchar conexiones entrantes llamando a accept().
    El funcionamiento de ésta llamada es prácticamente el mismo que en el caso de un socket TCP/IP. El sistema quedará bloqueado hasta que se acepte una conexión o se lance una excepción (es aconsejable que accept() esté dentro de un bloque try/catch). Si la conexión tiene éxito, accept() devolverá un objeto BluetoothSocket representando la conexión.
  • Si no se espera recibir ninguna conexión mas, puede llamarse a close().
    close() provocará que el BluetoothServerSocket se cierre, pero sin afectar en absoluto al socket que nos devolvió.

Como se comentó anteriormente, la llamada a accept() es bloqueante, motivo por el cual es no es muy aconsejable que se realice en la misma actividad que gestiona la ventana visible en ése momento.
Lo mas correcto es implementar algún tipo de servicio que gestione toda la infraestructura bluetooth y hacer que corra en otro hilo distinto. De ésa forma, además, dicho servicio podría ser utilizado por cualquier otra aplicación del sistema que lo conozca y lo necesite.
Cliente
Para poder realizar una conexión como cliente a otro dispositivo, deberemos obtener primero el BluetoothDevice que respresentará al nodo hacia el que queremos conectar (ver sección Búsqueda de dispositivos). Una vez que tenemos dicho objeto, podremos obtener un socket llamado al método createRfcommSocketToServiceRecord. Ésta llamada devolverá un BluetoothSocket representando la conexión.
createRfCommSocketToServiceRecord toma como argumento un UUID que debe coincidir con el que se utilizó en el servidor para inicializar el BluetoothServerSocket. Además, ésta llamada es bloqueante, por lo que al igual que en el caso del servidor, es aconsejable utilizar un servicio que corra en otro hilo.

Si createRfCommSocketToServiceRecord tiene éxito se devolverá un BluetoothSocket. En caso de que se rechace la conexión (o expire el timeout de unos 12 segundos), se devolverá también un BluetoothSocket, pero ésta vez nulo. Una vez que se consigue obtener un socket válido, la conexión se inicia con una llamada a connect().


Bibliografía: 
http://developer.android.com/resources/samples/BluetoothChat/index.html

Compañias celulares y sus problemas


Las compañías celulares han sufrido muchos cambios y se han tenido que adaptara a la nueva tecnología y los cambios tan grandes de los últimos tiempos. En estas transformaciones muchas compañías lo han sabido aprovechar, pero no todas han tenido la misma suerte. Algunas por ejemplo, han parado de producir o estar a punto de hacerlo.
Por otra parte también existen dificultades técnicas que han sufrido muchas compañías que conocemos, inclusive la compañía de la manzana en su producción de los famosos iphones.
Nokia
En 1981, Nokia desarrolló un nuevo estándar para la comunicación móvil, el NMT (Nordic Mobile Telephony) que combinaba una variedad de tecnologías. La firma estuvo también entre las primeras que elaboró un nuevo estándar de comunicaciones móviles mundiales, el GSM (Global System for Mobile Communications). Después creó nuevas normas para las pantallas del ordenador. Y en 1997, era la creadora de casi todos los estándares con los que operaban los teléfonos celulares. Nokia se mantuvo en primer plano hasta el inicio del siglo XXI. Sin embargo, ahora pasa por sus peores tiempos.
Las tecnologías de Apple y Samsung presionaron a la compañía finlandesa no solo en el mercado de la telefonía móvil. Las preferencias de los consumidores se desviaron a estos competidores directos e impactaron negativamente los ingresos de Nokia. En 2011, durante tres trimestres consecutivos la firma ha sufrido pérdidas, que han significado daños totales por al menos 1.500 millones de euros.
Nokia Siemens Network también sufre pérdidas. Su reestructuración y reorganización requiere inyecciones de dinero y si la empresa no puede negociar con los bancos JP Morgan, Citibank y Bank of América sus préstamos, entonces muy pronto tendrá que declararse en quiebra.
La compañía ya vendió su planta en Rumania, situada cerca de la ciudad de Cluj. A esto se suman las desafiantes declaraciones de Samsung, que no percibe a Nokia como un rival relevante en el mercado de teléfonos inteligentes, pues las ventas de sus smartphones aumentaron en un 10 por ciento.
La competencia impulsa el progreso, pero solo el tiempo dirá si los ejecutivos de Nokia podrán recuperar su pedestal tecnológico.
BlackBerry
Desde la salida del iPhone 4, las acciones de Research in Motion, la empresa que fabrica la Blackberry fueron en picada hacia abajo. El principal motivo es que el banco Wells Fargo, permitió a sus empleados utilizar el iPhone 4 ademas de Blackberry que era lo único permitido hasta el momento por razones de seguridad. Los empleados de otras compañías de Wall-Street, los principales clientes de Blackberry le exigieron a sus compañías el mismo derecho a utilizar celulares de Apple.Inc, a su vez se dieron otros conflictos con países africanos y asiáticos como India en los cuales se prohibió el uso de estos celulares. Se podría decir que las únicas razones por las que Rim no quebro son: El Blackberry Messenger (messenger gratuito para comunicarse son otros usuarios de Blackberry) y por el excelente sistema para enviar y recibir correos electrónicos.
 En un momento los ejecutivos de RIM pensaron en poner la compañía a la venta. Pero pronto se les ocurrió una idea mejor, crear el "Blackberry PlayBook", una copia de el iPad, que por ahora debió haber sido una buena idea dado que hoy el valor de las acciones aumento en un 3,01%.
Sony ericcson
Ahora es el turno de saber cómo será la transición que se oficializará a mediados del próximo 2012, cuando Sony tome control, y los primeros cambios serán contundentes. Se sabe que la transferencia a manos de Sony será definitiva recién a mediados 2012, momento para el cual los equipos saldrán a la venta con el logo único de Sony, por lo que la marca Sony Ericsson quedara en desuso y también sera Sony quien dará apoyo económico directo, algo que realmente están necesitando a estas alturas para poder mantenerse, además del beneficio con el que pueden llegar a contar gracias al peso de Sony como marca mundial que logrará integrar todas sus líneas de hardware.
Como seguramente sabrás, el mercado de los teléfonos inteligentes está dominado hoy por hoy de cabo a rabo por Google y Apple, principalmente. Mientras que a priori los de Cupertino cuentan con un teléfono propio, Google lo ha tenido mucho más difícil. Y es que ellos contaban únicamente con un sistema operativo desde su comienzo. Un sistema, que se ha ido viniendo a más hastas que se ha convertido en algo imprescindible para todos los usuarios que buscan un smartphone de código abierto y primera calidad.
Dicho esto, no nos sorprende que fabricantes rezagados como Sony Ericsson quieran ponerse las pilas, e intentar quedarse con un nicho de mercado que hoy por hoy, no tienen. Echando la vista atrás, seguramente recordarás que Sony compró la parte correspondiente a Ericsson en lo que respecta a su división de teléfonos inteligentes. Como tal, estaba claro que sólo era cuestión de tiempo este comunicado oficial… ¿lo adivinas?
En efecto, Sony Ericsson desaparecerá durante el próximo año 2012 como fabricante, y nacerá Sony. Cambia el nombre con el único fin de adelantarnos la gran estrategia que tienen los japoneses preparada para intentar ganar una mayor cuota de mercado de smartphones. Visto así, un teléfono Sony podría sonar con más fuerza y con más caché en diversos mercados. Claro está, que depende de los nuevos productos que posicionen en el mercado.
Yendo más allá, Sony ha anunciado que cargarán esta nueva estrategia con más publicidad y márketing. No suena mal, pero no olvidemos que lo más importante seguirá siendo su gama de teléfonos inteligentes, que por ahora… no es que sea la mejor.
Iphone
El creciente alborto en torno al diseño de antena del iPhone 4 ha obligado a Apple a convocar una rueda de prensa extraordinaria este viernes. Steve Jobs defendió su última creación indicando que la perdida de señal al coger un móvil en las manos es un problema generalizado en toda la industria y demostró el mismo efecto que varios usuarios han experimentado en el iPhone 4 –pérdida de señal al cogerlo de una determinada forma- en una Blackbeberry y un teléfono HTC.
"No somos perfectos", reconoció en varias ocasiones Jobs. La empresa regalará una banda protectora de plástico u otra carcasa a todos los compradores que los soliciten hasta el próximo 30 de septiembre. Además, podrán devolver el teléfono si no están contentos con el servicio sin pagar ninguna penalización hasta 30 días después de haberlo comprado. Los contratos firmados con la operadora serán también rescindidos.
Apple ha vendido más de tres millones de teléfonos IPhone 4 desde su lanzamiento el pasado 28 de Junio. Según Steve Jobs, sólo han recibido un 0,55% de llamadas al servicio técnico por problemas de antena y sólo el 1,7% de los compradores ha devuelto el terminal. "Es un asunto que se ha exagerado demasíado, todos los teléfonos tienen puntos débiles, no hemos encontrado aún la forma de saltarnos las leyes de la física".
Tras su lanzamiento en EEUU, Reino Unido, Japón, Alemania y Francia, algunos usuarios detectaron problemas de recepción con el nuevo diseño del iPhone 4. Al tocar la esquina inferior izquierda de la banda metálica que hace de antena, la señal 3G se degrada. Es un fenómeno que ocurre en otros terminales y marcas pero no de forma tan evidente dado que las antenas suelen estar en el interior de la carcasa y no hay contacto directo con la piel.
En zonas donde la señal del operador no es lo suficientemente potente esta perdida de intensidad puede ser suficiente para cortar una llamada o parar la transmisión de datos. El uso de una funda o de uno de los nuevos 'bumper' (una banda de plástico de colores fabricada por Apple que protege y decora el nuevo iPhone) elimina el problema.
Bibliografía:

martes, 28 de febrero de 2012

Tarea Intro 1

Para comenzar realize un programa sencillo, un hola mundo cambiandolo para probar.


Posteriormete explicare un programa un poco mas complejo.
Es el clásico ordenamiento de números por el método burbuja.

Primero el código original en C:

Despues de cambiarlo a Asembly por medio de la instrucción:

gcc –S burbuja.c

Ahora aqui ya tenemos nuestro código .s lo mostramos y lo comentarizamos
para entenderlo un poco más.


Por ultimo, optimizamos el programa quitando lineas de código para su mejoramiento y rendimiento:


Aqui la presentación que se expondra en clase:
Tarea intro
View more presentations from dani.

Bibliografía para poder comentarizar el código:

http://www.cs.virginia.edu/~evans/cs216/guides/x86.html
http://zsmith.co/intel/intel.html

jueves, 23 de febrero de 2012

Usabilidad en móviles



Ya hemos aprendido sobre usabilidad web y muchas características de esto en cursos anteriores. Ahora toca aprender cosas básicas de usabilidad pero en base a móvil.

De entrada hay que saber que diseñar páginas web o alguna aplicación no es lo mismo que diseñarla (y programarla). No podemos pensar que si ya sabemos como diseñar una web también podremos hacerlo en un celular, si en si la rama de estudio es la misma en esta parte las cosas cambian mucho.
Estas son algunas cosas que debemos tener en cuenta antes de empezar a diseñar y programar nuestra aplicación.

Mensaje

Lo que usted está tratando de decir sobre su sitio o aplicación visualmente.

Look & Feel

El look and feel se utiliza para describir la apariencia.

Color

El obstáculo mas común se encuentra cuando se trata de pantallas de color.

Layout

Como el usuario visualmente nuestra página.

Fuentes

Que tipos se representa en las pantallas de móviles

Gráficos

El uso de imágenes que se utilizan para crear o ayudar a una experiencia visual.

Touch target sizes

-7x7 mm con 1 mm de tap para el uso del dedo índice

-8x8 mm con 2 mm de tap para el pulgar de uso.

-El tipo de lista de los componentes debe tener un minimo de 5 mm de espacio entre líneas

-el ancho de un dedo limites de la densidad de elementos en la pantalla. Si los elementos están demasiado cerca, el usuario no podrá elegir uno solo.











Touch gesture diagrams

Touch interface growth

Estos son solo algunos aspectos que debemos tener encuenta, y ahora voi a explicar algunas partes de un estudio realizado por Jakob Nielsen uno de los pioneros y más reconocidos en el mundo sobre usabilidad. Este estudio fue realizado en 2011.

El estudio revela que el uso de la Web en un teléfono móvil varía dependiendo de las características del dispositivo que se use. Como era de esperar, se descubrió que los sitios diseñados específicamente para su uso en un teléfono móvil rinde sustancialmente mejor, que los “sitios completos” y no adaptados para ello. Cosa que debemos tener muy en cuenta para nuestros proyectos Web.

Sugiere que la razón principal es que en aquel entonces, la web móvil era un “jardín cercado”, limitado, pero relativamente simple, mientras que hoy la Web es más abierta en los teléfonos móviles. Y la gente lo que necesita es ir a un motor de búsqueda y no perder tiempo en introducir y buscar una palabra, debido a los tiempos de carga para buscar una respuesta.
Las pantallas grandes y la manipulación directa tiene un gran impacto en la usabilidad.
Como era de esperar, entre más grande sea la pantalla, mejor será la experiencia del usuario al acceder a sitios Web.

Para tener un sitio exitoso móvil o aplicación, la pauta obvia es la de diseñar para la pequeña pantalla. Lamentablemente, algunos no lo hacen, y todavía vemos los usuarios luchan por golpear en zonas pequeñas que son mucho más pequeños que sus dedos. El síndrome de los dedos de grasa estará con nosotros en los próximos años.
El segundo punto es más conceptual - y más difícil para algunas personas a aceptar: Cuando usted tiene una pantalla más pequeña, se debe limitar el número de funciones a las que importa más para el caso de uso móvil.

La experiencia de usuario de sitios web y aplicaciones móviles ha mejorado desde nuestra última investigación, pero aún nos queda mucho camino por recorrer. . Un sitio móvil dedicado es una necesidad, y aplicaciones de conseguir incluso una puntuación más alta usabilidad.

Bibliografía:
Para los que hacen su aplicación para iphone les recomiendo:
https://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html
http://www.slideshare.net/andreskarp/usabilidad-para-mviles
http://www.useit.com/alertbox/mobile-usability.html
http://www.circulodemaquetadores.com/estudio-de-usabilidad-movil-nielsen