一、什么是OBEX,它有什么用途?
OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。
OBEX协议构建在IrDA架构的上层.
OBEX协议通过简单的使用“PUT”和“GET”命令实现在不同的设备、不同的平台之间方便、高效的交换信息。支持的设备广泛,例如PC,PDA,电话,摄像头,自动答录机,计算器,数据采集器,手表等等。
OBEX协议定义了一种柔性的概念——objects。也即是对象。这些对象可以包括文件,诊断信息,电子商务卡片,银行的存款等等。Objects在这里没有高级的技术含义,而是视你的应用而定。
OBEX协议小到可作“命令和控制”功能,例如对电视机,录像机等的操作。大道可以做很复杂的操作,例如数据库的事务处理和同步。
OBEX能够具有以下几个特点:
1、 友好的应用——可实现快速开发。
2、 紧缩——可用在资源有限的小型设备上。
3、 跨平台
4、 柔性的数据支持。
5、 方便的作为其他Internet传输协议的上层协议。
6、 可扩展性——提供了对未来需求的扩充支持而不影响以存在的实现。例如可扩展安全,数据压缩等。
7、 可测试可调试。
更为具体的关于OBEX的介绍请查阅IrOBEX协议。
二、OBEX对象模型
关于Headers
对象模型回答了对象是如何在OBEX协议描述的。这个模型必须包括被传输的对象和对对象的描述。为了做到这点,OBEX定义了Headers的概念。
一个Header反映了对象的一个方面,例如名字、长度、描述文字或者对象本身。例如,一个文件对象demo.txt会包含它的名字,一个类型标示为“text”,长度和文件本身。
Headers的构成
Headers简单的由<Header ID>和<Header Value>组成,简称为<HI>和<HV>。
HI由一个字节组成,指出了Header包含的内容以及它的格式。HV包含了一个或者多个字节,其结构由HI所决定。
所有的Header都是可选的,取决于设备的类型和事务的种类。你可以使用所有的Header,或者一些,或者没有。ID可以使Header可解析以及与传输顺序无关,也可以使不支持的Header被忽略掉。
HI又可以分为两部分,高2位和低6位。高2位确定了HI的编码方式(见表二),低6位确定了HI的意义(见表三)。两个表都是我从IrOBEX中的表摘抄并部分翻译过来的。
表二
HI的第8和第7位 | 意义 |
00(0x00) | 以Null(0x00)结尾的的Unicode文字。2个字节的无符号整数长度前缀。 |
01(0x40) | Byte块,2个字节的无符号整数前缀。 |
10(0x80) | 1Byte容量。 |
11(0xC0) | 4Byte容量,以高位先传输为原则。 |
表三
HI | Header名称 | 描述 |
0xC0 | Count | 连接中用于指名对象的数量。 |
0x01 | Name | 对象的名字。一般为文件名。 |
0x42 | Type | 对象的类型。例如text,html,binary,manufacture specific |
0x44 0xC4 | Time | 时间戳。ISO 8601版本 |
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 | 用户自定义的。 |
关于常用Header的更详尽的解释,更详尽信息请参考IrOBEX
1、Name
Name是一个用来描述对象名称的Header,由以Null(0x00)结尾的Unicode字符串组成。例如:DEMO.TXT
2、Length
Length描述了对象的大小,由4个字节组成。如果Length事先知道,这个Header应该被用到。这样可以让接受者迅速的知道需要分配多少空间,可使处理更为迅速。但这也不是必须的,有些情况下长度无法确认,但设备可以通过End-Body Header知道什么时候结束。
3、Time
Time描述了对象的最后修改的时间。使用ISO8601格式。
本地时间格式:YYYYMMDDTHHMMSS
UTC时间格式:YYYYMMDDTHHMMSSZ
格式中的T可以方便的区分日期和时间。UTC时间使用Z作为标记。建议使用UTC时间。
4、Body、End-of-Body
Body Header由HI、一个2Byte长度的描述和整个的对象本身。End-of-Body组成和Body组成一样,但标识了这是对象的最后一部分。如果对象本来就很小,就直接使用End-of-Body。