在 Android 2.3 上实现 OBEX PUSH 服务器 [英] Implementing OBEX PUSH Server on Android 2.3

查看:10
本文介绍了在 Android 2.3 上实现 OBEX PUSH 服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在 Android 2.3 设备上设置应用内 OBEX 服务器.使用蓝牙聊天示例代码,我能够设置一个 OBEX 服务器.但是,服务器需要使用自定义 UUID,因此该服务不会注册为OBEX 服务器"

I need to setup an in-app OBEX server on an Android 2.3 device. Using the Bluetooth Chat Sample code I was able to setup an OBEX server. However, the server needs to use a custom UUID so the service is not registered as an 'OBEX Server'

# 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 连接请求:

So, when I receive data, it looks like I am receiving a raw OBEX connection request:

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

是否有我可以使用的 OBEX 实现,或者我是否必须自己实现该协议?

Is there an OBEX implementation that I can use or do I have to implement the protocol myself?

我不想使用内置的 OBEX 服务器 - 这必须在应用程序中.我曾尝试过 BlueCove,但当我在注册服务时遇到问题时放弃了它.

I don't want to use the inbuilt OBEX server - this has to be in app. I have tried BlueCove but I abandoned it when I had issues registering a service.

是的,我确实看到了这篇帖子并阅读了链接,但是天哪,一定有更简单的方法!

Yes, I did see this post and read the link in it, but by golly, there must be an easier way!

推荐答案

我最终自己实现了协议.没有我想象的那么毛茸茸的.由于我只希望连接一个特定的客户端,而且我知道客户端只会推送一个文件,因此我只能部分实现我需要的协议部分.

I ended up implementing the protocol myself. It wasn't as hairy as I imagined. Since I was expecting only a specific client to connect and I knew that the client would only be pushing one file I was able to partially implement only the sections of the protocol that I needed.

一些有助于理解 OBEX 协议的文档是 Obex13.pdf,位于:http://gitorious.org/gammu/gsm-docs/trees/e5161a75fb1e1c1608959b27ae3c3940bcf0911b/standards/obex

Some documentation that helped with understanding the OBEX protocol were Obex13.pdf at: http://gitorious.org/gammu/gsm-docs/trees/e5161a75fb1e1c1608959b27ae3c3940bcf0911b/standards/obex

我如何解析套接字输入流的快速片段:(注意 OBEXUtils 和 OBEXConstants 是我的类.)

A quick snippet of how I parsed the sockets input stream: (Note OBEXUtils and OBEXConstants are my classes.)

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

OBEXConstant 的片段:

Snip of 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;

这篇关于在 Android 2.3 上实现 OBEX PUSH 服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆