2011-10-05 17 views
5

Necesito configurar un servidor OBEX en la aplicación en un dispositivo Android 2.3. Utilizando el código de ejemplo de Bluetooth Chat, pude configurar un servidor OBEX. Sin embargo, el servidor necesita utilizar un UUID personalizado, de modo que el servicio no se ha registrado como un 'OBEX servidor'Implementación de OBEX PUSH Server en Android 2.3

# sdptool browse local 
...(snip)... 
Service Name: OBEX Object Push 
Service RecHandle: 0x10000 
Service Class ID List: 
    UUID 128: ab123abc-1a2b-3c4d-5d7f-1234567890ab 
Protocol Descriptor List: 
    "L2CAP" (0x0100) 
    "RFCOMM" (0x0003) 
    Channel: 18 

Así, cuando recibo los datos, parece que estoy recibiendo una solicitud de conexión OBEX prima:

80 00 07 10 00 04 00 00 00 00 ...(snip)... 00 00 00 (1kb file) 

¿Existe una implementación de OBEX que pueda usar o debo implementar yo mismo el protocolo?

No quiero usar el servidor OBEX incorporado, esto tiene que estar en la aplicación. He probado BlueCove pero lo abandoné cuando tuve problemas para registrar un servicio.

Sí, vi this publicar y leer el link en él, pero por suerte, debe haber una manera más fácil!

Respuesta

3

que terminó la implementación del protocolo mí mismo. No era tan peludo como imaginaba. Como esperaba que solo un cliente específico se conectara y sabía que el cliente solo empujaría un archivo, pude implementar parcialmente solo las secciones del protocolo que necesitaba.

Parte de la documentación que ayudó con la comprensión del protocolo OBEX eran Obex13.pdf en: http://gitorious.org/gammu/gsm-docs/trees/e5161a75fb1e1c1608959b27ae3c3940bcf0911b/standards/obex

Un fragmento rápida de cómo me analizado sintácticamente el flujo de entrada tomas: (. Nota OBEXUtils y OBEXConstants son mis clases)

try 
{ 
    //Read all bytes passed in 
    bytes = mmInStream.read(buffer); 

    //Ensure we have the entire packet before we proceed 
    // Packet length is in the 1st and 2nd byte 
    expectedLength = OBEXUtils.bytesToShort(buffer[OBEXConstant.LENGTH_IDENTIFIER], 
     buffer[OBEXConstant.LENGTH_IDENTIFIER + 1]); 

    packetLength = bytes; 

    //Keep reading until we get what we expect. 
    while (packetLength < expectedLength) 
    { 
     bytes = mmInStream.read(buffer, packetLength, maxPacketSize); 
     packetLength += bytes; 
    } 

    //Switch on Packet Header 
    switch (buffer[OBEXConstant.HEADER_IDENTIFIER]) 
    { 
     case OBEXConstant.CONNECT: 
      //Parse the packet and return an acknowledgement packet 
      write(OBEXConnect.parsePacket(buffer)); 
      break; 

     case OBEXConstant.PUT: 
     case OBEXConstant.PUT_FINAL: 
      //Parse the PUT packet and return an acknowledgement packet 
      //For Parsing PUT packets I referred to the android and bluecove implementations 
      write(putPacket.appendPacket(buffer, packetLength)); 
      break; 

     case OBEXConstant.DISCONNECT: 
      //Parse the packet and return an acknowledgement packet 
      write(OBEXDisconnect.parsePacket(buffer)); 
      break; 

     case OBEXConstant.GET: 
     case OBEXConstant.GET_FINAL: 
     case OBEXConstant.SETPATH: 
     case OBEXConstant.SETPATH_FINAL: 
     case OBEXConstant.SESSION: 
      //Did not implement these 
      break; 

     case OBEXConstant.ABORT: 
      Log.w(Constant.TAG, TAG + "ABORT Request Received"); 
      isDisconnected = true; 
      break; 

     default: 

      break; 
    } 
} 
catch (final IOException e) 
{ 
    ...(snip)... 
} 

Recorte de OBEXConstant:

public static final byte FINAL_BIT = (byte) 0x80; 

public static final byte CONNECT = 0x00 | FINAL_BIT; //*high bit always set Connect choose your partner, negotiate capabilities 
public static final byte DISCONNECT = 0x01 | FINAL_BIT; //*high bit always set Disconnect signal the end of the session 
public static final byte PUT = 0x02; //(0x82) Put send an object 
public static final byte PUT_FINAL = PUT | FINAL_BIT; 
public static final byte GET = 0x03; //(0x83) Get get an object 
public static final byte GET_FINAL = GET | FINAL_BIT; //(0x83) Get get an object 
public static final byte SETPATH = 0x05; 
public static final byte SETPATH_FINAL = SETPATH | FINAL_BIT; 
public static final byte SESSION = 0x07; 
public static final byte ABORT = (byte) 0xFF; 

public static final byte OBEX_RESPONSE_CONTINUE = (byte) 0x90; 
public static final byte OBEX_RESPONSE_SUCCESS = (byte) 0xA0; 
+0

Podría dar la solución completa que ha realizado, en googlecode o gitHub? Necesito transmitir datos som desde un dispositivo bluetooth a mi teléfono Android, actuando como un servidor. Pero no puedo encontrar ninguna solución para esto ... Gracias de antemano :) –

+0

Lamentablemente, la fuente ahora está protegida por derechos de autor del cliente. El ejemplo de Android SDK bluetooth chat es un buen punto de partida. A continuación, puede usar el código publicado anteriormente para comenzar a implementar el protocolo OBEX. – tuxGurl

+0

Según tengo entendido, solo está utilizando la biblioteca de bluetooth de Android para conectarse con el dispositivo y OBEX OPP solo para recibir archivos de este dispositivo. Si puedo preguntar, ¿qué tipo de dispositivo era este? Gracias. –

Cuestiones relacionadas