2011-10-05 19 views
5

Bir Android 2.3 cihazında bir uygulama içi OBEX sunucusu kurmam gerekiyor. Bluetooth Sohbetini Kullanma Örnek kod bir OBEX sunucusu kurabildim. Verileri aldığınızda bir ham OBEX bağlantı isteği alıyorum gibi Ancak, sunucu hizmeti 'OBEX Sunucusu' YaniAndroid 2.3'te OBEX PUSH Sunucusu Uygulaması

# 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 

olarak kayıtlı değil bu yüzden özel bir UUID kullanması gerekir, bu görünür:

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

Kullanabileceğim veya protokolü kendim uygulamak zorunda olduğum bir OBEX uygulaması var mı?

Dahili OBEX sunucusunu kullanmak istemiyorum - bu uygulamada olmalı. BlueCove'u denedim ama bir hizmeti kayıt ettirirken sorunlarımdan vazgeçtim.

Evet, this mesajını görebildim ve link'u okudum ama daha kolay bir şekilde olmalı!

cevap

3

Ben protokolünü kendim uygulamak sona erdi. Düşündüğüm kadar kıllı değildi. Bağlanmak için sadece belirli bir müşteriyi beklediğimi ve müşterinin sadece bir dosyayı zorlayacağını bildiğimden, sadece ihtiyacım olan protokolün bölümlerini kısmen uygulayabiliyordum.

OBEX protokolünü anlama ile yardımcı Bazı belgeler de Obex13.pdf idi: http://gitorious.org/gammu/gsm-docs/trees/e5161a75fb1e1c1608959b27ae3c3940bcf0911b/standards/obex

Ben yuva giriş akışı çözümlenen nasıl hızlı bir pasajı: (. Not OBEXUtils ve OBEXConstants benim sınıfları vardır)

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

makaslamak:

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

Eğer googlecode veya github Yaptığınız bütün çözüm, verebilir misiniz? Bir bluetooth cihazından bir veriyi android telefonuma aktarmam gerekiyor, bir sunucu gibi davranıyorum. Ama bunun için herhangi bir çözüm bulamıyorum .. Şimdiden teşekkürler :) –

+0

Ne yazık ki kaynak şimdi istemci telif hakkı ile korunmaktadır. Android SDK bluetooth sohbet örneği iyi bir başlangıç ​​noktasıdır. Daha sonra OBEX protokolünü uygulamaya başlamak için yukarıda belirtilen kodu kullanabilirsiniz. – tuxGurl

+0

Anladığım kadarıyla sadece cihazdan bağlanmak için android bluetooth kütüphanesini ve sadece bu cihazdan dosya almak için OBEX OPP kullanıyorsunuz? Eğer sorabilirsem, bu ne tür bir cihazdı? Teşekkürler. –