OBEX是信息交换应用中用处甚广的协议,它起源于红外,但又不局限于具体的传输方式,可以在蓝牙、USB、UART等传输接口上应用。OBEX是蓝牙应用中的基础协议,很多剖面都是在OBEX的基础上实现的,本文首先介绍下OBEX协议的特点及应用,从对象模型和会话协议两个方面详细分析OBEX协议,然后针对OBEX在蓝牙开发中的典型应用,介绍下其在OPP和PBAP上的适配和绑定。
OBEX协议简述
OBEX(Object Exchange)协议将点对点设备间的信息交互应用以面向对象的方式分解为数据+操作,把数据柔性抽象为对象来描述,同时定义一种信息交互方式规范操作。OBEX协议的两个关键部分便是定义了对象模型和会话方式,对象模型依据应用而定,定义了Header描述对象的一个方面,Header的集合便是一个完整的对象。会话采用请求-响应方式,客户端发起请求,服务器端给与响应。下面从对象模型和会话协议上详细解析下OBEX协议。
对象模型
对象模型是对对象本身的抽象描述,它定义了Header的概念,一个Header描述对象的一个方面。对象模型是一系列Header的集合体,依据应用而定,因为OBEX是很多应用的基础协议,所以这里的应用包括底层信息交互操作及其之上的应用。对象模型可以认为是对象和应用之间的载体,因为它一方面描述了对象信息,另一方面又满足具体应用的可操作性。
下面对Header举个例子。比如文件传输应用,将文件抽象为对象模型时,需要的Header有文件名称Name、文件数据长度DataLength、文件类型Type,可能还会有Application specific Header即具体应用相关的Header,比如定义MASK选定文件数据只包含某些属性。
Header的形式为ID+Value,ID为单字节,它定义了Value类及其表示格式,Bit7和Bit6指定了Value值的格式,如ID==0x01则表示Name,格式为两字节长度+以0x00结尾的字符串数据的方式,当文件名为test.txt时,Header即为01 00 0b 't' 'e' 's' 't' '.' 't' 'x' 't' 00。ID作为Value的一种描述,就像Header只是对象的一种描述一样,这种定义方式大大扩展了OBEX的Header空间。
会话协议
OBEX会话协议定义了请求-响应形式的会话式操作,定义发起请求的一端为客户端,给与响应的为服务器端,OBEX应用便是在客户端和服务器端的一系列请求-响应会话中完成的。OBEX以“操作符”的方式来定义请求,以“回应符”的方式定义响应。操作符包括:连接CONNECT(0x80)、断开连接DISCONNECT(0x81)、发送PUT(0x02,0x82)、索取GET(0x03,0x83)、设置路径SETPATH(0x85)、中止当前会话ABORT(0xff);回应符有0x90-继续、0xA0-成功和其他表示错误原因的回应符。
OBEX是个严谨的协议,其会话协议的设计实现首先遵从一问一答的会话方式,如果在没有应答之前发送下一个请求会造成服务器端拒绝该请求;其次客户端和服务器端都定义了一系列状态表示会话进程及进行状态的跳转,比如当前进行的PUT操作,当操作符为0x02,服务器端给与回应符0x90之后,客户端这时不能进行GET操作,必须等到发完了最后一包即操作符为0x82,服务器端给与回应符0xA0之后才能发起GET请求,否则GET请求会被服务器端视为错误的请求而给与错误回应。
OBEX在PBAP中的应用