2011-10-05 101 views
5

我需要在Android 2.3設備上設置應用程序內OBEX服務器。使用藍牙聊天示例代碼,我可以設置一個OBEX服務器。但是,服務器需要使用自定義的UUID所以服務沒有被註冊爲「OBEX服務器」在Android 2.3設備上實現OBEX PUSH服務器

# 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 

所以,當我收到的數據,它看起來像我收到原始OBEX連接請求:

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

是否有OBEX實現,我可以使用或者我必須自己實現協議?

我不想使用內置的OBEX服務器 - 這必須在應用程序中。我曾嘗試BlueCove,但當我註冊服務時遇到問題時我放棄了它。

是的,我確實看到this後,並閱讀其中link,但通過golly,必須有一個更簡單的方法!

回答

3

我最終實現了自己的協議。它不像我想象的那樣毛茸茸。由於我只想要一個特定的客戶端進行連接,並且我知道客戶端只會推送一個文件,所以我只能部分實現我需要的協議部分。

有些文檔與瞭解OBEX協議有助於爲Obex13.pdf在:http://gitorious.org/gammu/gsm-docs/trees/e5161a75fb1e1c1608959b27ae3c3940bcf0911b/standards/obex

快速片斷我如何解析的套接字輸入流:(注OBEXUtils和OBEXConstants是我班)

OBEXConstant的
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)... 
} 

剪斷:

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

你能提供你做的整體解決方案,在googlecode上或github上?我需要從藍牙設備傳輸som數據到我的android手機,充當服務器。但我無法找到任何解決方案。預先感謝:) –

+0

不幸的是,源現在受到客戶端版權的保護。 android SDK藍牙聊天的例子是一個很好的起點。然後,您可以使用上面發佈的代碼開始實施OBEX協議。 – tuxGurl

+0

據我所知,你只是使用android藍牙庫來連接設備和OBEX OPP只是爲了從這個設備接收文件?如果我可以問,這是什麼類型的設備?謝謝。 –