一、OBEX介绍
OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。OBEX v2.0蓝牙协议层次结构图:
OBEX可以用来传输vCard(电话本),vCalendar(电子日历),vMessage(短信和email)和vNotes(电子笔记)。
OBEX Object
OBEX协议定义了一种柔性的概念——objects。也即是对象。这些对象可以包括文件,诊断信息,电子商务卡片,银行的存款等等。Objects在这里没有高级的技术含义,而是视你的应用而定。
OBEX Object模型描述的是如何表示OBEX Object,OBEX协议可以使用Put-和Get-operations传输Object。一个object可以通过一个或者多个Put-requests、 Get-responses进行交互。Object是由headers组成的,header由header ID和header value组成。通过Header ID可以确定header的格式及包含哪些信息,header value由一个或者多个字节组成,其格式和含义由header ID决定。目前定义的header有:
header ID | header name | 描述 |
0xC0 | Count | 连接中用于指名对象的数量。 |
0x01 | Name | 对象的名字。一般为文件名。 |
0x42 | Type | 对象的类型。例如text,html,binary,manufacture specific |
0x44 0xC4 | Time | 时间戳。ISO 8601版本 时间戳。4Byte版本(用于兼容) |
0x05 | Description | 对对象的文本描述 |
0x46 | Target | 操作的目的服务名 |
0x47 | HTTP | 一个HTTP1.x头 |
0x48 | Body | 对象的一部分 |
0x49 | End of body | 对象的最后一部分 |
0x4A | Who | OBEX Application标识,用于表明是否是同一个应用。 |
0xCB | Connection ID | 用于OBEX多路连接的标识 |
0x4C | App.Parameters | 扩展的应用层请求和回复信息 |
0x4D | Auth.Challenge | Authentication digest-challenge |
0x4E | Auth.Response | Authentication digest-response |
0x4F | Object Class | 对象的OBEX对象类 |
0x10 to 0x2F | Reserved | 保留 |
0x30 to 0x3F | User defined | 用户自定义的。 |
Session Protocol(会话协议)
OBEX协议是典型的client/server request-response模型。OBEX操作由request-response对组成。Request由client发出的,response由server发出的。Client发送一个request后,需要在收到来自server的response之后才能发送新的request。但是当启动OBEX Single Response Mode (SRM)时执行Put或者Get操作的时候也有例外的情况,在这种情况下,为了提高OBEX的吞吐量会忽略标准的request-response序列。
OBEX使用Request和Response作为最基本的操作。请求的每个Request必然有一个Response,否则可认为Request失败。Request由一个或多个的Packet(包)组成:
Byte0 | Bytes1、2 | Bytes3 ot n |
---|---|---|
操作码(opcode) | Packet Length(包长度) | Headers或请求信息 |
Request code定义如下:
Response code定义如下:
二、OBEX相关接口
Authenticator
此接口提供了一种响应身份验证质询和身份验证响应标头的方法。
Authenticator代码位于:
external/obex/src/com/android/obex/Authenticator.java
Authenticator的定义:
public interface Authenticator {
PasswordAuthentication onAuthenticationChallenge(String description, boolean isUserIdRequired, boolean isFullAccess);
byte[] onAuthenticationResponse(byte[] userName);
}
Operation
Operation 接口提供了操作单个 OBEX PUT 或 GET 操作的方法。
Operation代码位于:
external/obex/src/com/android/obex/Operation.java
Operation的定义:
public interface Operation {
void abort() throws IOException;
HeaderSet getReceivedHeader() throws IOException;
void sendHeaders(HeaderSet headers) throws IOException;
int getResponseCode() throws IOException;
int getHeaderLength();
InputStream openInputStream() throws IOException;
DataInputStream openDataInputStream() throws IOException;
OutputStream openOutputStream() throws IOException;
DataOutputStream openDataOutputStream() throws IOException;
void close() throws IOException;
int getMaxPacketSize();
public void noBodyHeader();
}
ObexTransport
ObexTransport 接口定义了承载 OBEX 协议的底层传输连接(例如 TCP、内核中蓝牙或 USB 公开的 RFCOMM 设备文件、Android 平台中模拟的 RFCOMM 套接字、Irda)。
ObexTransport代码位于:
external/obex/src/com/android/obex/ObexTransport.java
ObexTransport的定义:
public interface ObexTransport {
void create() throws IOException;
void listen() throws IOException;
void close() throws IOException;
void connect() throws IOException;
void disconnect() throws IOException;
InputStream openInputStream() throws IOException;
OutputStream openOutputStream() throws IOException;
DataInputStream openDataInputStream() throws IOException;
DataOutputStream openDataOutputStream() throws IOException;
int getMaxTransmitPacketSize();
int getMaxReceivePacketSize();
boolean isSrmSupported();
}
三、OBEX相关类
BluetoothObexTransport
通用 Obex 传输类,用于基于 OBEX 的蓝牙配置文件。
BluetoothObexTransport代码位于:
packages/modules/Bluetooth/android/app/src/com/bluetooth/BluetoothObexTransport.java
BluetoothObexTransport的定义:
public class BluetoothObexTransport implements ObexTransport {}
ObexAppParameters
Android ObexAppParameters是一个用于解析数据的类,用于解析Obex数据。
ObexAppParameters代码位于:
packages/modules/Bluetooth/android/app/src/com/bluetooth/pbapclient/ObexAppParameters.java
packages/modules/Bluetooth/android/app/src/com/bluetooth/mapclient/obex/ObexAppParameters.java
ObexAppParameters的定义:
public final class ObexAppParameters {}
ClientSession
Android中的ClientSession和ServerSession是用于在蓝牙传输中进行客户端和服务器端的通信的类。它用于管理蓝牙传输会话的创建、启动和终止。ClientSession是用于在客户端发送请求和接收响应类。它负责与服务器建立连接,并发送请求以获取所需的数据。在Android中,可以使用BluetoothSocket来创建ClientSession,并使用其提供的方法发送和接收数据。
ClientSession代码位于:
external/obex/src/com/android/obex/ClientSession.java
ClientSession的定义:
public final class ClientSession extends ObexSession {}
ServerSession
Android中的ClientSession和ServerSession是用于在蓝牙传输中进行客户端和服务器端的通信的类。
ServerSession代码位于:
external/obex/src/com/android/obex/ServerSession.java
ServerSession的定义:
public final class ServerSession extends ObexSession implements Runnable {}
ObexSession
Android ObexSession是用于在Android设备上进行OBEX(对象交换协议)通信的类。它提供了建立和管理OBEX会话的功能。
ObexSession代码位于:
external/obex/src/com/android/obex/ObexSession.java
ObexSession的定义:
public class ObexSession {}
ObexHelper
此类定义了一组用于实现 Obex 的帮助程序方法。
ObexHelper代码位于:
external/obex/src/com/android/obex/ObexHelper.java
ObexHelper的定义:
public final class ObexHelper {}
HeaderSet
此类为基于 RFCOMM 的 OBEX 或基于 l2cap 的 OBEX 实现 com.android.obex.HeaderSet 接口。
HeaderSet代码位于:
external/obex/src/com/android/obex/HeaderSet.java
HeaderSet的定义:
public final class HeaderSet {}
PasswordAuthentication
此类包含用户名和密码组合。
PasswordAuthentication代码位于:
external/obex/src/com/android/obex/PasswordAuthentication.java
PasswordAuthentication的定义:
public final class PasswordAuthentication {}
ServerRequestHandler
ServerRequestHandler类定义一个事件侦听器,该侦听器将响应向服务器发出的 OBEX 请求。
ServerRequestHandler代码位于:
external/obex/src/com/android/obex/ServerRequestHandler.java
ServerRequestHandler的定义:
public class ServerRequestHandler {}
ServerOperation
此类实现服务器端连接的 Operation 接口。
ServerOperation代码位于:
external/obex/src/com/android/obex/ServerOperation.java
ServerOperation的定义:
public final class ServerOperation implements Operation, BaseStream {}
PrivateInputStream
此对象为此包中使用的 Operation 对象提供输入流。
PrivateInputStream代码位于:
external/obex/src/com/android/obex/PrivateInputStream.java
PrivateInputStream的定义:
public final class PrivateInputStream extends InputStream {}
PrivateOutputStream
此对象为此包中使用的 Operation 对象提供输出流。
PrivateOutputStream代码位于:
external/obex/src/com/android/obex/PrivateOutputStream.java
PrivateOutputStream的定义:
public final class PrivateOutputStream extends OutputStream {}