.net手机软件开发(5)——OBEX介绍

(一) OBEX介绍

一、什么是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版本
时间戳。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
用户自定义的。

关于常用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。

三、请求(Request)和回应(Response)

OBEX使用Request和Response作为最基本的操作。请求的每个Request必然有一个Response,否则可认为Request失败。

Request由一个或多个的Packet(包)组成,每个包的结构如下表

Request数据包结构

Byte 0
Byte 1,2
Byte 3 to n

操作码(opcode)
Packet Length(包长度)
Headers或请求信息

由于每个Request可能有多个Packet,opcode的最高位称为Final bit。如果被设置为1,那么说明这是Request的最后一个Packet。例如:当用PUT操作发送一个大文件时,会有几个Packet作为一个Request。那么只有最后一个Packet的FinalBit设置为1。

Response也由一个或多个Packet组成,每个包的结构如下表

Response数据包结构

Byte 0
Byte 1,2
Byte 3 to n

Response Code(返回值)
Response Length(回应长度)
ResponseData回应的数据

同样的ResponseCode的最高位也叫做FinalBit。ResponseData可能包含对象和Header,或者其它信息。

下表列出了了常见的opcode和responseCode,更详尽的请参考IrOBEX 1.2文档。

opcode

Opcode(w/high bit set)
定义
意义

0x80 *
Connect
连接

0x81 *
Disconnect
断开连接

0x02(0x82)
Put
发送一个对象

0x03(0x83)
Get
取得一个对象

0x04(0x84)
Reserved
保留的

0x85 *
SetPath
设置路径

0xFF *
Abort
取消当前的操作

0x06到0x0F
Reserved
作为扩展保留

0x10到0x1F
User definable
用户自定义的

*总是设置FinalBit

ResponseCode

ResponseCode
定义

0x10(0x90)
Continue(继续)

0x20(0xA0)
OK,Success

0x40(0xC0)
Bad Request(服务端不明白Request)

0x41(0xC1)
Unauthorized(未授权的)

0x43(0xC3)
Fobidden(禁止——服务器明白Request,但拒绝)

0x44(0xC4)
Not Found(未找到)

四、说明。

1、 Connect(连接)

此操作初始化会话然后设置参数。其Request格式为

Byte 0
Byte 1,2
Byte 3
Byte 4
Byte 5,6
Byte 7 to n

0x80
包长度
OBEX版本
标志
最大OBEX包长度
可选Header

注:OBEX版本现在为1.0。

Response格式为:

Byte 0
Byte 1,2
Byte 3
Byte 4
Byte 5,6
Byte 7 to n

ResponseCode
包长度
OBEX版本
标志
最大OBEX包长度
可选Header

对于更多关于Connect的说明请参考IrOBEX

2、 Disconnect(断开当前会话)

此操作断开OBEX会话。例如断开当前FolderListing Service,然后使用Connect连接到IrMC Sync Service实现同步通讯薄等功能。

Disconnect格式为:

Byte 0
Bytes 1,2
Bytes 3 to n

0x81
包长度
可选Header

成功的断开会返回0Xa0,拒绝会返回0xD3

3、 Put操作

Put操作从客户端发送一个对象到服务端。一般至少含有Name和Length两个Header。对于文件而言有可能还有Date/Time Header。

Put操作的格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

0x02(当FinalBit设置时为0x82)
PacketLength包长度
一组Header

回应格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

ResponseCode(要求继续为0x90;成功为0xA0)
包长度
可选Header

关于Put操作的更详细的用法将在文件传输部分作解释。

4、 Get操作

Get操作从服务端返回一个对象。

Get操作的格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

0x03
包长度
一组Header

回应格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

Response Code
包长度
可选Header

关于Get操作更详细的用法将在文件传输部分作解释。

5、 Abort操作

Abort操作中断一个多包操作(例如发送一个大文件)。Abort操作可以包含描述中断原因的Description Header。

Abort操作的格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

0xFF
包长度
可选Header

Abort对应的应该是一个成功的操作(0xA0),指明这个操作已被接收并且服务端已经重新与客户端同步。如果返回的另外的值,客户端应该Disconnect。

6、 SetPath

SetPath操作用于切换对方的路径。通常使用一个Name Header用于指定对方路径名称。如果为空,则返回默认目录,通常为根目录

SetPath操作格式如下:

Byte 0
Bytes 1,2
Byte 3
Byte 4
Bytes 5 to n

0x85
包长度
Flags
Constants(常数)
可选Header

注:Flags可以设置Bit0和Bit1。Bit0表示退回到上一层目录;Bit1表示如果目录不存在就创建一个目录,否则返回一个错误。

回应格式如下:

Byte 0
Bytes 1,2
Bytes 3 to n

ResponseCode
包长度
可选Response Header

五、实际例子
注:数据使用SerialMonitor获得。客户端为PC,服务端为西门子M55手机。

1、 Connect、Disconnect

ÇConnect Request:

80 00 1A 10 00 40 06 46 00 13 6B 01 CB 31 41 06 ?....@.F..k.Ë1A.

11 D4 9A 77 00 50 DA 3F 47 1F .Ô?w.PÚ?G.

ÈConnect Response:

A0 00 1F 10 00 01 DA CB 00 00 01 00 4A 00 13 6B .....ÚË....J..k

01 CB 31 41 06 11 D4 9A 77 00 50 DA 3F 47 1F .Ë1A..Ô?w.PÚ?G.

ÇDisconnect Request:

81 00 03 ?..

ÈDisconnect Response:

A0 00 03 ..

该实例首先连接到手机,然后使用Disconnect脱离连接。

ÇConnect Request:

80:Connect

00 1A:包长度26字节

10:OBEX版本1.0

00:总是0

40 06:最大包长度16390字节。

46:HI,Target(目标)。0x40开头,表示后面跟2个字节的长度描述。

00 13:Header长度19

6B….:对应的Target

ÈConnect Response:

A0:OK,Success

00 1F:包长度31字节

10:OBEX版本1.0

00:总是0

01 DA:最大包长度474字节

CB:Connection ID=0x100。0xC0开头,表示后面跟4个字节的值。

4A 00 13:Who Header。长度0x13。

6B…:Who Header值。

2、 Put,Get,SetPath

例一:如何下载手机\Sound目录里面的21680.mid文件。大小为313字节。

整个过程分为:

连接Æ切换到根目录Æ切换到Sound目录ÆGet(21680.mid)

具体过程:

……(连接部分省略)

Ç切换到根目录,Name Header(0x01)内容为空

85 00 08 02 00 01 00 03 ?.......

È响应

A0 00 03 ..

Ç切换到\Sound目录。Name Header(0x01)长度0x11。

85 00 16 02 00 01 00 11 00 53 00 6F 00 75 00 6E ?........S.o.u.n

00 64 00 73 00 00 .d.s..

È响应

A0 00 03 ..

ÇGet请求。Name Header(0x01)指定文件名

83 00 1A 01 00 17 00 32 00 31 00 36 00 38 00 30 ?......2.1.6.8.0

00 2E 00 6D 00 69 00 64 00 00 ...m.i.d..

È回应
0x90说明需要继续。
0xC3指明文件长度00 00 01 39。
0x48说明是文件的一部分。

90 01 44 C3 00 00 01 39 48 01 3C 4D ….

ÇGet请求。由于服务端返回0x90,所以继续发送Get

83 00 03 ?..

È回应。成功。服务端发送0x49说明是对象最后一部分。

A0 00 06 49 00 03 ..I..

例二:说明如何获取大文件,主要介绍Get部分。

取得\Pictures\102725.jpg,大小5314字节。

整个过程分为:

连接Æ切换到根目录Æ切换到Pictures目录ÆGet(102725.jpg)ÆGet….

ÇGet请求。Name Header值为102725.jpg

83 00 1C 01 00 19 00 31 00 30 00 32 00 37 00 32 ?......1.0.2.7.2

00 35 00 2E 00 6A 00 70 00 67 00 00 .5...j.p.g..

È返回一个Body。客户端应该继续发送Get

90 01 D3 C3 00 00 14 C2 48 01 CB FF D8 FF E0 00 ?.ÓÃ...ÂH.ËÿØÿà.

10 4A 46 49 46 00 01 01 01 02 58 02 58 00 00 FF .JFIF.....X.X..ÿ

…..

ÇGet请求。

83 00 03 ?..

È返回第二个Body。客户端继续发送Get

90 01 D7 48 01 D4 6A 60 99 1C A2 74 4C 92 67 BC ?.×H.Ôj`?.¢tL?g¼

A9 AA 84 CD 6B 20 83 83 F4 BB DF 8B BC 58 A4 DC ª?Ík ??ô»ß?¼X¤Ü

……
……(省略若干重复过程)

ÇGet请求。由于服务端返回0x90,所以继续发送Get

83 00 03 ?..

È回应。成功。服务端发送0x49说明是对象最后一部分。

A0 00 06 49 00 03 ..I..

例三:发送文件到\Sound\1.mid。大小313字节

整个过程分为:

连接Æ切换到根目录Æ切换到Sound目录ÆPutÆ…

具体过程:

……(省略连接切换部分)

ÇPut操作

0x82:Put操作,FinalBit设置

0x01:NameHeader。文件名1.mid

0xC3:Length。文件大小

0x44:日期和时间。这里为2005年2月14日,19:49:38。使用本地时间。

0x49:End-of-Body。文件的最后部分。

82 01 65 01 00 0F 00 31 00 2E 00 6D 00 69 00 64 ?.e....1...m.i.d

00 00 C3 00 00 01 39 44 00 12 32 30 30 35 30 32 ..Ã...9D..200502

31 34 54 31 39 34 39 33 38 49 01 3C 4D 54 68 64 14T194938I.<MThd

È回应

A0 00 03 ..

例四:发送文件到\Pictures\102725.jpg,大小5314字节。

过程分为:

连接Æ切换到根目录Æ切换到\Pictures目录ÆPutÆ…

具体过程:

……(省略连接切换部分)

ÇPut操作

0x02:Put操作,FianlBit没有设置。说明还有剩余部分需要发送。

0x01:NameHeader。文件名102725.jpg

0xC3:Length。文件大小

0x44:日期和时间。这里为2005年2月14日,19:57:52。使用本地时间。

0x48:Body。文件的一部分。

02 01 D0 01 00 19 00 31 00 30 00 32 00 37 00 32 ..Ð....1.0.2.7.2

00 35 00 2E 00 6A 00 70 00 67 00 00 C3 00 00 14 .5...j.p.g..Ã...

C2 44 00 12 32 30 30 35 30 32 31 34 54 31 39 35 ÂD..20050214T195

37 35 32 48 01 9D FF D8 FF E0 00 10 4A 46 49 46 752H.?ÿØÿà..JFIF

……

È回应。客户端继续发送

90 00 03

ÇPut操作

0x02:Put操作,FianlBit没有设置。说明还有剩余部分需要发送。

0x48:Body。文件的一部分。

注意:不在需要设置多余的Header。

02 01 D4 48 01 D1 F3 C0 F1 2D 5A E9 98 B1 1B 71 ..ÔH.ÑóÀñ-Zé?±.q

47 96 5B 45 30 BD 3C 7E 2B D7 AE 82 6B DF 2C 42 G?[E0½<~+×?kß,B

B5 BA 21 D3 6B 16 B5 B8 DB 4F D4 23 DB 11 C6 4C µº!Ók.µ¸ÛOÔ#Û.ÆL

……

……(省略若干重复过程)

ÇPut操作

0x82:Put操作,FinalBit设置。说明这是最后一部分

0x49:End-of-Body。文件的最后部分。

82 01 22 49 01 1F F6 75 BF 01 3C 02 49 48 E4 48 ?."I..öu¿.<.IHäH

6F 3E FF 00 2D 51 25 CF 32 D8 39 5F 25 D8 88 44 o>ÿ.-Q%Ï2Ø9_%Ø?D

…..

È回应。成功

A0 00 03

时间: 2024-12-03 12:06:31

.net手机软件开发(5)——OBEX介绍的相关文章

Android手机软件开发 课程 教学 大纲

<专业考证培训及考证>课程教学大纲 课程编号:024015    授课学时: 80       学分数: 4    适用专业:通信技术 一.课程的性质和任务 课程的性质: <专业考证培训及考证>课程是通信技术专业的专业必修课.它面向软件设计与开发.软件技术支持以及软件测试三个岗位,主要讲解<Java程序设计>.<Android手机软件开发>等课程,在<Android软件开发>技术的基础上再加以提升,从而使学生能够更好地适应就业岗位. 课程的任务:

手机软件开发

问题描述 去一家公司面试,他是做手机软件开发的,我以前没有接触过手机软件开发,公司要我回来先自己熟悉手机软件开发.请问一下我该从哪一方面入手,用什么开发工具,能给我推荐几本教程吗? 解决方案 解决方案二:那要看你们公司用什么平台什么工具做了.一般做手机软件的赛班的比较多吧,也有J2ME和BREW之类的,国内的话还有MTK这种的.解决方案三:把我的BLOG翻一遍,你就会获得很多手机软件开发的知识http://blog.csdn.net/mailbomb解决方案四:路过.我也是新手,刚进公司不到一个

手机软件开发工程师的薪水一般多少

问题描述 公司想招聘一名手机软件开发工程师,不知道现在这个工种的月薪一般是多少,请大家说说 解决方案 解决方案二:1000-10000解决方案三:楼上的回答也太牛了吧4000-7000吧解决方案四:高级的一般15K解决方案五:围观解决方案六:应该是说不一样的软件层次(偏应用还是偏底层),薪水也不一样的吧.解决方案七:3000解决方案八:2000起,上不封顶.解决方案九:但凡有点经验的一般在5k-10k之间吧解决方案十:工资好高啊~~~~解决方案十一:看技术了解决方案十二:手机开发工程师也分很多中

.net手机软件开发(六)OBEX应用——文件传输部分

(六) OBEX应用--文件传输部分 在手机数据传输方面基本OBEX应用分为 l 文件传输 l IrMC同步 文件传输又可以细分为以下基本操作 l 初始化连接 l 断开连接 l 设置路径 l 取得目录信息 l 创建目录 l 上传下载文件 l 删除文件或空目录 在笔者的软件当中设计了OBEX这个类,里面包含了以上所有的基本操作.另外针对M55的服务端的特殊性又设计了更名.取得磁盘空间信息.移动.拷贝文件的功能.具体请参考源代码. 下面具体讲述各个操作的细节. l 初始化连接 初始化连接包括了使手机

如何组建一个手机软件开发团队

问题描述 本人从事技术管理工作,若干年不从事技术开发了,最近公司要求我组建一个最简易型的手机开发小组,公司的意思是开发一些简单实用的手机软件给广大手机网民免费使用,本着少投入试探性介入手机软件市场的心态做做,也就是花钱同时呢做的软件还要能够在各种智能手机上跑的起来,我现在遇到一个困惑:我是该招聘一个JAVAME的人还是招聘JAVAME和C/C++各一名呢,如果JAVAME开发的产品就能在各种智能手机上都能运行的话我们就不要再招聘个C/C++了,毕竟我们只是做些小的手机软件并不开发游戏,对速度要求

我一直对手机软件开发和有兴趣,但是不知道该看那些书,麻烦大神指点!!!不甚感激

问题描述 最好是能给出要看的书的次序,,,本人有JAVA基本语法知识,和C/C++知识!!!麻烦了 解决方案 那我给推荐基本书吧,obj-c 基本开发教程,iphone 基础开发教程,iphone 开发秘籍,这三本书就够了解决方案二:看你是做android ,iPhone,还是win7开发吧android 直接看android开发都行,现在国内没有什么值得的书,很多都是翻译官网的.看你情况,如果习惯看api直接参考就可以,如果不习惯,随便买一本都差不多,都是从那里翻译来的.iphone还得obj

手机网络应用客户端软件开发实践简介

网络应用与客户端软件 说到移动网络应用,前几年大家首先想到的就是WAP应用.最近随着市场上手机的可编程能力越来越强,手机软件开发平台和产业链的逐渐成熟,手机上的网络应用软件逐渐多了起来,如移动QQ.PICA.掌讯通等等.这些客户端软件凭着丰富的应用.以用户为中心的体验.良好的业务感知度逐渐成为WAP业务之后的又一类重要网络应用.目前的移动软件开发已经逐渐从传统的嵌入式开发中相对独立出来, 主要指手机上的上层应用软件开发,最近也成为了软件行业的新兴热点. 作为业务运营的手机网络应用客户端软件要求能

手机软件测试用例设计实践

一.测试用例设计概述 测试伴随在整个手机软件开发的各个阶段中,测试质量的高低直接关系到手机软件的可用性,友好性,可靠性.可以说,测试环节是手机软件开发的重要环节,是整个开发过程的"中枢神经".同时,测试用例的设计在测试过程中是非常重要的一个环节,是重中之重. 一般来说,设计测试用例应该考虑如下几方面: 1)有效性:测试用例是测试人员测试过程中的重要参考依据.不同的测试人员依据相同的测试用例所得到的输出应该是一致的. 2)可复用性:良好的测试用例具有重复使用的功能,使得测试过程事半功倍,

中山大学建大学生手机软件创业实践中心

本报讯 近日,中山大学联合广东电信成立了天翼创新与体验中心,旨在为大学生手机软件爱好者提供创业实践. "翼动青春路创业未来"创新创业行动,主要通过"翼起来"3G应用征集大赛."翼起来"校园宣讲活动."翼起来"3G应用开发培训等系列活动,引导大学生自己开发手机游戏.手机软件.手机主题等多种手机应用,活动还设立总额为20万的优秀项目奖金. 为了更好地为高校大学生进行3G创业创造良好的开发和测试环境,由中大和广东电信联合共建的天翼创