Protocolo de comunicación
OBEX (abreviatura de OBject EXchange , también denominado IrOBEX ) es un protocolo de comunicación que facilita el intercambio de objetos binarios entre dispositivos. Lo mantiene la Infrared Data Association , pero también lo ha adoptado el Bluetooth Special Interest Group y el ala SyncML de la Open Mobile Alliance (OMA). Una de las primeras aplicaciones populares de OBEX fue en Palm III . Esta PDA y sus muchas sucesoras utilizan OBEX para intercambiar tarjetas de visita, datos e incluso aplicaciones.
Aunque OBEX fue diseñado inicialmente para infrarrojos, ahora ha sido adoptado por Bluetooth y también se utiliza en RS-232 , USB , WAP y en dispositivos como los bolígrafos inteligentes Livescribe .
Comparación con HTTP
OBEX es similar en diseño y función a HTTP, ya que proporciona al cliente un transporte confiable para conectarse a un servidor y luego puede solicitar o proporcionar objetos. Pero OBEX difiere en muchos aspectos importantes:
- El protocolo HTTP normalmente se coloca sobre un enlace TCP/IP . OBEX también puede implementarse, pero normalmente se implementa en una pila IrLAP / IrLMP / Tiny TP en un dispositivo IrDA . En Bluetooth , OBEX se implementa en una pila Baseband / ACL / L2CAP (y, para usos tradicionales, RFCOMM ). También son posibles otros "enlaces" de OBEX, como por ejemplo a través de USB .
- HTTP utiliza texto legible para humanos, pero OBEX utiliza tripletes de tipo-longitud-valor con formato binario denominados "Encabezados" para intercambiar información sobre una solicitud o un objeto. Estos son mucho más fáciles de analizar para dispositivos con recursos limitados.
- Las transacciones HTTP son inherentemente sin estado; por lo general, un cliente HTTP abre una conexión, realiza una única solicitud, recibe su respuesta y cierra la conexión o realiza otras solicitudes no relacionadas. En OBEX, una única conexión de transporte puede soportar muchas operaciones relacionadas. De hecho, las incorporaciones recientes a la especificación OBEX permiten que una transacción cerrada abruptamente se reanude con toda la información de estado intacta.
Objetos
OBEX funciona intercambiando objetos , que se utilizan para una variedad de propósitos: establecer los parámetros de una conexión, enviar y solicitar datos, cambiar la ruta actual o los atributos de un archivo.
Los objetos son campos y encabezados . A modo de ejemplo, el siguiente podría ser el objeto utilizado para solicitar la agenda telefónica desde un móvil:
Este objeto contiene dos campos (comando y longitud) y dos encabezados. El primer campo (comando) especifica que se trata de una solicitud de datos (GET). El segundo campo es el tamaño total del objeto, incluidos los dos campos.
Este objeto también contiene dos encabezados, específicamente un "ID de conexión" y un "Nombre". El primer byte de cada encabezado es el nombre del encabezado y su tipo de contenido. En este caso:
- 0xCB significa que este encabezado es un "ID de conexión", un número obtenido previamente; los dos bits de orden más alto de 0xCB son 11, y este par especifica que se trata de una cantidad de 4 bytes;
- el primer byte del segundo encabezado es 0x01; este byte identifica este encabezado como uno "Nombre"; los primeros dos bits de 0x01 son 00, lo que significa que el contenido de este encabezado es una cadena Unicode terminada en nulo (en formato UCS-2 ), prefijada por el número de bytes que la componen (0x00 0x1e).
Una posible respuesta, conteniendo los datos solicitados, podría ser:
En este ejemplo, se supone que la agenda telefónica es lo suficientemente corta como para que quepa en un único objeto de respuesta. El único encabezado tiene 0x49 como identificador, lo que significa que es un "Fin del cuerpo", el último fragmento de información (también el único, en este caso). Los dos primeros bits de 0x49 son 01, lo que significa que el contenido de este encabezado son datos con prefijo de longitud: los dos bytes siguientes 0x00 0x2F indican la longitud de estos datos (en decimal, 47), los siguientes son los datos, en este caso una agenda telefónica que comprende solo una vCard vacía de 47 bytes.
Este ejemplo muestra un solo comando GET y su respuesta, los únicos encabezados involucrados son el id de conexión, el nombre y el final del cuerpo. Antes de emitirlo, se debería haber enviado un comando CONNECT para establecer algunos parámetros de la conexión, incluido el id de conexión. Otros comandos son: put, setpath, action, abort, connect. Algunos otros encabezados notables incluyen: type, time, description, target.
Sesión
Una vez que el cliente (por ejemplo, una computadora) se conecta al servidor (por ejemplo, un dispositivo móvil), una sesión típica consiste en que el cliente envía una serie de objetos y obtiene sus respuestas del servidor. A modo de ejemplo:
- CONECTAR: uno de los campos especifica el tamaño máximo de paquetes que el cliente puede recibir; un encabezado TARGET especifica el tipo de servicio que el cliente espera (exploración de archivos, sincronización de ml, acceso a la libreta telefónica); la respuesta del servidor con su longitud máxima de paquete, el ID de conexión y otros datos
- GET: el cliente solicita un archivo, especificando el id de conexión, el nombre del archivo y/o su tipo; el servidor responde con el contenido del archivo, o sólo una parte de él; en este último caso, el cliente tiene que enviar otros objetos GET para obtener el resto del archivo
- SETPATH: el cliente le indica al servidor que cambie a una carpeta de archivos diferente, especificando el ID de conexión y el nombre de la carpeta en dos encabezados
- GET: el cliente solicita una lista del contenido de la carpeta enviando un objeto con el ID de conexión y un encabezado TYPE apropiado (por ejemplo, "x-obex/folder-listing" para transferencia de archivos, "x-bt/vcard-listing" para acceso a la libreta telefónica)
- PUT: el cliente envía un archivo al servidor; si es demasiado grande para caber en un solo paquete, el servidor solicitará la siguiente parte con una respuesta CONTINUE
- DESCONECTAR: el cliente informa al servidor que está cerrando la sesión
El intercambio puede variar significativamente según el servicio. Por ejemplo, SyncML no utiliza SETPATH, mientras que un push OBEX se compone únicamente de CONNECT (sin un encabezado TARGET), PUT y un DISCONNECT opcional.
Protocolos
Los siguientes protocolos se ejecutan sobre OBEX o tienen enlaces para hacerlo:
- Empuje OBEX
- Transfiere un archivo del originador de la solicitud al destinatario; se envía un objeto CONNECTION que no contiene ningún destino, luego se utiliza PUT para transferir el archivo
- Protocolo de transferencia de archivos OBEX
- Almacena y recupera archivos, de forma similar a FTP . El encabezado de destino del objeto CONNECTION es {0xF9, 0xEC, 0x7B, 0xC4, 0x95, 0x3C, 0x11, 0xD2, 0x98, 0x4E, 0x52, 0x54, 0x00, 0xDC, 0x9E, 0x09}; la respuesta contiene el identificador de conexión que se utilizará en los objetos GET, PUT, SETPATH y ACTION posteriores.
- Acceso a la agenda telefónica
- Similar a la transferencia de archivos, pero utiliza un destino {0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8, 0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66}; las entradas de la agenda telefónica se pueden listar (con varios posibles ordenamientos y filtros) y recuperar de ciertos directorios en telecom/ usando GET y SETPATH
- IrMC
- IrMC fue diseñado para el intercambio de entradas de la agenda telefónica, entradas de calendario, tarjetas de presentación digitales y listas de tareas pendientes . En su forma sin conexión, se utiliza un único PUT para transferir datos; de lo contrario, se pueden recuperar o enviar varios archivos y carpetas dentro de telecom/; se puede utilizar un encabezado de destino {'I', 'R', 'M', 'C', '-', 'S', 'Y', 'N', 'C'} en las solicitudes GET para diferenciar el tipo de indexación utilizada.
- Sincronización ML
- SyncML puede sincronizar agendas telefónicas, calendarios, notas y otros datos. En su enlace OBEX, el objetivo del objeto CONNECT es {'S', 'Y', 'N', 'C', 'M', 'L', '-', 'S', 'Y', 'N', 'C'}; una sesión consiste entonces en una secuencia de pares PUT-GET donde se envían y reciben, por turno, archivos XML o WBXML sin nombre.
Implementaciones
javax.obex
El paquete opcional javax.obex en las API de Java para Bluetooth proporciona una implementación de OBEX en Java . [1]
OpenObex
OpenObex es una implementación de código abierto de OBEX en C. Proporciona funciones para conectarse a través de IrDA , Bluetooth , USB y TCP/IP , crear objetos y manejar los datos recibidos. Un esquema de ejemplo de una aplicación cliente es:
void callback_function (...) { /* procesar datos recibidos */ } int main () { OBEX_Init (..., función de devolución de llamada ); OBEX_TransportConnect (...); objeto = OBEX_ObjectNew (...); OBEX_ObjectAddHeader ( objeto , ...); OBEX_ObjectAddHeader ( objeto , ...); OBEX_Request (..., objeto ); mientras (...) OBEX_HandleInput (...) objeto = OBEX_ObjectNew (...); OBEX_ObjectAddHeader ( objeto , ...); OBEX_Request (..., objeto ); mientras (...) OBEX_HandleInput (...) /* ... */ OBEX_TransportDisconnect ( controlador ); OBEX_Cleanup ( controlador ); }
Los objetos se envían mediante OBEX_Request
. Después de llamar a OBEX_HandleInput
, los datos recibidos se procesan en la función de devolución de llamada (que se especificó al llamar OBEX_Init
a ). La función de devolución de llamada puede determinar si la respuesta se ha recibido por completo y, por lo tanto, si el programa principal puede salir del while
bucle que está ejecutando.
PyOBEX y nOBEX
PyOBEX proporciona soporte parcial para OBEX en Python . [2] nOBEX es una bifurcación de PyOBEX con soporte OBEX más completo y soporte para el Perfil de Manos Libres Bluetooth para facilitar las pruebas OBEX en sistemas de información y entretenimiento automotrices. [3]
Perfiles
OBEX es la base de muchos "perfiles" de capas superiores:
Dispositivos compatibles
- Todos los Palms desde Palm III , excepto Palm Pre, Palm Pre Plus, Palm Pixi y Palm Pixi Plus.
- La mayoría de los teléfonos Sharp , Motorola , Samsung , Sony Ericsson , HTC y Nokia con puerto infrarrojo o Bluetooth
- LG EnV Touch (VX11000)
- Muchos otros PDA desde 2003
- Muchos otros teléfonos con puerto infrarrojo o Bluetooth
- Dispositivos Android en la versión 2.1 y superiores
- Dispositivos Windows Phone 7.8 y 8 (limitados a la transferencia de imágenes, música y vídeos a través de una aplicación 'Bluetooth Share').
Véase también
Referencias
- ^ API javax.obex
- ^ PyOBEX
- ^ No se puede obtener información
Enlaces externos
- Especificación OBEX en IrDA.org
- Perfiles Bluetooth, incluidas especificaciones para OBEX y protocolos basados en OBEX (GOEP, FTP, OBEX push, SYNC)
- OpenOBEX es una implementación de código abierto del protocolo OBEX