| 一只笨笨的驴 |
IrMC规范学习笔记(二)IrMC(Infrared Mobile Communications 红外移动设备通讯)规范1.1 是由红外数据协会(www.irda.org)制订的,用于无线红外设备的信息传输。目前由于工作需要进行移动电话电话簿的同步开发,对该规范进行了初步的了解和学习,以后我会把IrMC相关规范的中文译文和自己的一些心得发布上来,这也是我现在每天的工作内容。希望有共同兴趣和爱好的朋友一起来交流学习。由于重点是电话簿的同步,所以主要是关于电话簿的内容,而像日历卡片,消息和记事本等内容暂时跳过。
信息日志对象(Information Log)
所有支持信息交换级别2,3和4的设备必须提供信息日志对象。该对象包含如下的域,注意有些域在不同级别的信息日志中是可选的。 1. Total-Records 级别3和4要求必须支持该域,标识对象库中储存的对象(记录)的总数。 2. Last-Used-Index 级别3要求必须支持,但是级别4不能包含此域。标识对象库中最后使用的静态索引。 3. Maximum-Records 级别2,3和4必须支持该域。标识对象库中能够容纳的对象(记录)的总数。如果设备对此没有特定限制,则值为“*”。 4. IEL(Information Exchange Level) 级别4必须支持该域。标识对象库所支持的信息交换级别,根据向后兼容的原则,IrMC 1.0级别2和3的设备不要求支持该域,但是在IAS中必须标明电话簿、日历卡片和消息所支持的访问级别。该域的值及其所支持的访问级别如下: 0x01 ---- 仅支持级别1(最低级别) 0x02 ---- 支持级别1和2(最低级别和访问级别) 0x04 ---- 支持级别1,2和3(最低、访问和索引级别) 0x08 ---- 支持级别1,2和4(最低、访问和同步级别) 0x10 ---- 支持级别1,2,3和4(最低、访问、索引和同步级别) 5. HD(Hard Delete) 级别4必须支持。该参数表示设备是否明确区分物理删除和软删除,其值为“YES”或者“NO”。 6. SAT(Sync-Anchor-Type) 级别4必须支持。标示设备支持的同步锚点类型,其值及其代表的同步锚点类型如下: “CC” ---- 只支持变更计数器锚点 “TS” ---- 只支持时间标签锚点 “CT” ---- 支持变更计数器和时间标签两种同步锚点。 7. SAI(Sync-Anchor-Increment) 当SAT的值为“TS”或者“CT”的时候必须支持此域。该参数指定时间标签的值是否确定递增的,也就是说相应的时钟时间不可以被向前设置,其值只能设置为“YES”。 8. SAU(Sync-Anchor-Unique) 当SAT的值为“TS”或者“CT”的时候必须支持此域。该参数指出时间标签的值是否保证唯一。可能的取值为“YES”和“NO”。 9. DID(Database ID) 级别4必须支持。指出分配给对象库的数据库标识,可以是任意的字符串。 10. X-IRMC-FIELDS IrMC对象库可能支持各种由Versit或者其他标准组织规定的域属性、参数和类型的集合,对于IrMC客户而言,能够不需要访问全部库中的数据就可以确切了解一个特定对象库所支持的各种域是非常必要的,这就要求IrMC服务器必须针对一个特定对象库提供其所支持的域的属性表,否则IrMC客户必须读取全部数据并且分析每条记录中包含的域、参数和类型之后才能够确定该库所支持的域,这将严重影响处理性能,特别对于同步情况。所以IrMC对象库提供X-IRMC-FIELDS域来描述它所支持的域的属性表,级别4要求必须提供此域,而且推荐级别2和3也支持。 特定对象库所支持的域属性由对象库标准和所属设备决定,如电话簿库必须遵循vCard规范,并随不同设备可能有所不同。关于vCard,vCalendar和vMessage等标准请参考相应规范。 X-IRMC-FIELDS的格式总结如下:如果对象库支持属性标准格式的扩展,则在属性名后的方括号“[]”内添加支持的扩展属性的索引,如果属性包含“TYPE”参数,则以分号“;”作为分隔符,在属性名后跟“TYPE”及该参数以分号“;”分割的值序列。如果对于属性中每个元素有长度限制,在该元素后以“=”加上长度。每个属性最后以冒号“:”作为结束。X-IRMC-FIELDS每一行都要以CRLF(回车换行 )作为终止符。此外,对于X-IRMC-FIELDS的格式还包括如下规定:
下面我们看一个X-IRMC-FIELDS电话簿对象库的描述,具体含义不再详细描述。 X-IRMC-FIELDS:CRLF Begin(记着有尖括号,对HTML不熟悉,加上尖括号就不显示了:() CRLF Version: CRLF N:=20 CRLF UID:=4 CRLF ADR[1=20;2;6;7]: CRLF TEL;TYPE=HOME;WORK: CRLF End(记着有尖括号,对HTML不熟悉,加上尖括号就不显示了:() CRLF
11. ICL(Incoming-Call-Log) 级别4电话簿对象库要求必须支持该域,表明该对象库是否支持已接听电话的记录。可能的取值有“Y”和“N”。 12. OCL(Outgoing-Call-Log) 要求和取值同ICL,表明设备是否支持已拨电话的记录。 13. MCL(Missed-Call-Log) 要求和取值同ICL,表明设备是否支持未接电话的记录。 14. MMHL(Missed-Message-History-Log) 级别4消息对象库要求必须支持该域,表明消息信息库是否支持未接消息历史对象。其值为“Y”和“N”。
数据传输服务
数据传输服务分为两种:面向连接和无连接传输服务
面向连接的服务 通常是由IrLMP和IrLAP协议提供支持纠错的面向连接服务。任何面向连接的电话簿操作必须以OBEX Connect过程开始,以OBEX Disconnect过程结束。 无连接服务 无连接服务在设备之间提供有限的通讯能力,通常实现的协议是不需要OBEX Connect和Disconnect的Ultra。实现无连接服务的设备只需要支持OBEX的Put功能,并且至少提供对信息交换级别1的支持。关于无连接服务不再赘述,有兴趣的话可以参考IrMC规范。
OBEX信息访问和索引
1. 索引 OBEX Get和Put操作用于IrMC对象传输,所有对象的访问机制是类似的,除了信息交换级别1,因为该级别是将对象推送到设备的收件箱,所以对象名字中必须包含路径信息。 IrMC设备在信息交换级别2,3和4中根据一个对象标识来存储对象,这个对象标识作为“索引”被引用。前面已经提到IrMC设备支持两种类型的索引:静态和唯一。静态索引允许IrMC服务器和客户进行分配,并在会话期间递增,前面已经对其作过解释,这里不再多说。 在唯一索引模式下,IrMC设备会分配给每个对象一个本地唯一标识(LUID),和静态索引不同,它必须由IrMC服务器分配,并且在每个设备的每个IrMC应用中确保唯一的。唯一索引在IrMC规范的属性表中被定义为X-IRMC-LUID属性,包含有一个本地唯一标识。其值必须是7位ASCII码能够表示的字符和数字。也就是说唯一索引是一种模式,真正在IrMC实现中体现唯一索引的是这个LUID,包括对象名字的命名。在OBEX操作中LUID作为标识对象的名字,必须作为OBEX报文中的Name Header而且是该报文Header序列中的第一个Header。该模式在信息交换级别4中要求必须被支持。
2. 读取访问 要读取一个IrMC对象需要使用OBEX的GET请求/应答操作。每个请求中包含要读取的对象名字,也就是必须使用OBEX的NAME Header。关于各个级别对象的命名在前面已经提到过。 OBEX的GET应答包括一个应答编码标示操作结果和可能包含有数据的BODY Header。可能的应答编码有: 成功 返回一个代表成功的OBEX编码,并在其BODY Header中包含有请求的对象内容,如果对象内容为空,则不包含BODY Header。 访问受限 返回一个代表未验证的OBEX编码,不包含BODY。 未找到请求的对象索引 返回一个代表没有找到相应请求的OBEX编码,不包含BODY。 注意,如果使用信息交换级别2的GET操作,在返回的对象流中的每个对象都必须带有X-IRMC-LUID属性,但是对于级别4不需要,因为它的命名规则中已经包含了X-IRMC-LUID。
3. 写入访问 要写入IrMC对象或者对象库,需要OBEX的PUT请求/应答操作。每个PUT请求的Header序列包含对象名字(NAME),对象长度(LENGTH),一个应用命令(APP PARAM)和要写入的对象的内容(BODY)。其中NAME、LENGTH和BODY都好理解,而且LENGTH是可选的。如果你对OBEX不熟悉也不要紧,记住他们是OBEX中的Header就行了,在OBEX的文章中我会详细说明的。 APP PARAM这个OBEX Header在级别4中必须被提供,主要是在写入操作时候传递一些应用信息,包括关于删除类型是否物理删除的信息,该应用标记值为0x11;如果设备支持变更计数器同步锚点,则还要传递可能最大变更计数器的信息,其相应应用标记的值为0x12。之所以要传递可能最大变更计数器,是为了防止别的IrMC客户更改或者正在访问服务器当前数据库,服务器在接受到含有该技术器的PUT请求以后会与当前计数器进行比较,如果可能最大计数器小于当前计数器,则会返回一个“发现冲突”OBEX编码的应答包。关于APP PARAM的格式会在OBEX中进行详细说明。 通过OBEX的PUT操作,可以增加,修改和删除IrMC对象。在删除的时候,除了没有BODY Header或者一个空的BODY以外,和增加、修改操作相同。对于级别4的PUT操作,在修改和删除的时候必须指定LUID到对象名字中,而添加则必须将名字设置为NULL,如添加一条电话簿对象在NAME中指定如下值:telecom/pb/luid/.vcf OBEX的PUT应答包括一个应答编码标示操作结果。可能的应答编码有: 成功 这里只说明应用级别4进行同步操作的应答报文,对于级别3请参考IrMC规范。注意,应用级别4同步操作中可能会用到级别2的操作,这在前面也曾提到过。 如果是级别4添加操作,则服务器通过APP PARAM 返回新分配的LUID和当前同步锚点。其中LUID的应用标记值为0x01,变更计数器锚点的应用标记为0x02,时间标签同步锚点的应用标记为0x03 如果是级别4修改操作,则服务器通过APP PARAM 返回被更改对象的LUID和当前同步锚点。 如果是级别4删除操作,则服务器通过APP PARAM 返回被删除对象的LUID和当前同步锚点。有的设备明确区分对象清楚和建立一个空对象,这时候不包含BODY的PUT操作表示清除对象,而含有空BODY的PUT操作表明建立一个空对象。那么删除空对象的请求被服务器接受并成功之行后,服务器仅返回一个成功代码。 如果使用了级别2的PUT操作,则服务器会执行以下操作:
访问受限 有些对象或者对象库限制写入,则服务器会返回一个未验证的OBEX代码,不包含其他Header。 未找到请求的索引 如果对一个不存在的对象或者对象库进行写入操作,则服务器返回一个没有找到相应请求的OBEX编码,不包含BODY。 数据库被锁定 如果操作的对象库被锁定,则服务器会返回一个表示数据库被锁定的OBEX代码(0xE0),不包含BODY。 数据库已满 如果执行操作时候数据库容量已经达到最大,则服务器将返回一个不包含BODY的数据库满的应答(0xE1)。 发生冲突 请参考上面关于APP PARAM地说明。 6:45 PM - Mar. 25, 2005 - post comment
|
描述 在IT行业混了6年,转身却发现自己一无所有。虽然我贪玩,虽然我懒惰,但是还想挣扎着从头再来。我不太清楚Blog的概念,但是我想n年后即使我依然一无所有,至少有这份记录。 首页 个人档案 存档 最近发布 - blogs updated - 头晕了 - 搬家也搬不动 - 准备搬家了 - Forumer Contest (Win an Apple IPOD mini) |