一只笨笨的驴

blogs updated

We updated the blogs.forumer.com You can now see new features when you login. Thank you for choosing Forumer, Have you created a community yet? If not, give it a try http://www.forumer.com

8:59 PM - Feb. 22, 2006 - comments {0} - post comment


头晕了

虽然咱发誓要努力,但是没想到突然放在眼前要学习的东西那么多,顿时头就大了。UNIX就不说了,既然想学习一下UNIX的开发,自然是要学习的。但是还有那鸟数据库,现在不学也不行了。现在公司是开发针对银行业务的,数据库自然少不了,但是为什么还冒出一个嵌入式SQL呢?各个数据库下面还不一样,ORACLE下面是什么pro* C,到了INFORMIX下又成了什么ec。另外就是银行业务还现在正在做的与国库信息处理系统接口系统的业务说明,真地就不知道该从哪里下手了。和我在一起的一个刚毕业一年的同事感慨说,天啊,现在一天要看和学的比大学里面一个星期学的都要多。。。。。。

11:03 AM - Dec. 9, 2005 - comments {0} - post comment


搬家也搬不动

    本来想搬家到msn的,但是中间发生了很多事情,而且期间心绪有诸多迷茫和懊恼,所以搬家行动和BLOG统统搁浅。现在想起来感觉很可惜丢失了很多事情的记载,更为自己什么事情都坚持不下来而悲哀。看来命中注定我将是一个一事无成的人了,凡成事者必备的一个优点就是能够持之以恒。

    基于IRMC和OBEX的手机同步协议看完了,在此协议基础上开发的手机电话簿同步程序也写出来了。时间我记得很清楚,就是公元2004年5月8号。当使用索爱的T628测试全部同步操作通过的时候欣喜异常,把几个月来的辛苦和五一都要加班工作的苦恼统统甩到了爪哇岛上去了。但是,现实是残酷的,上帝也是喜欢捉弄人的。当费了好大力气找到了多款诺基亚、摩托罗拉、西门子、索爱和三星手机进行测试时候,才发现只有索爱系列手机完全支持IRMC Level4,西门子虽然也支持但是总有些小毛病,而其他手机竟然都不支持。天啊!那一瞬间我简直是欲哭无泪,幻想是不是自己的程序实现IRMC协议时候有问题,于是回头再次检查程序。同时,向各个手机厂商联系以获取支持。大牌公司就是不一样,诺基亚、摩托罗拉和三星很快都回信了,内容基本一致:对不起,我们的手机不提供IRMC Level4功能。。。。哭泣的我闭门思过,得出一个结论:既然SyncML作为最新的同步协议已经支持OBEX、WSP和HTTP等传输协议,除了索爱这个傻鸟其他手机厂商自然没必要在自己的产品中多加一块程序,既降低开发成本还节省硬件资源,何乐不为呢?这时候想起了Gary的忠告:不要完全相信协议,更要注意协议与实际产品的实际结合能力。。。此时除去悲伤就是对Gary睿智的佩服,经验有时候就是那么灵验,也是那么无情,Gary的担心和警告有力地证明了这一点。怎么办,转头回去搞SyncML吗?可当初我为什么没有直接进行SyncML的开发呢,一是因为国内外已经出现了SyncML的相关产品;二是大部分的SyncML产品都是基于WSP和HTTP的,对于国人普遍喜欢免费的特点我才决定使用IRMC的;三是我认为自己开发这套产品实力不足,特别是跟已经出现的同类产品竞争更是不可想象,人家都是一个团队在搞啊;四是老板根本不想在研发上投资太多,我也不能指望建立一个研发团队去专门进行SyncML的开发。于是就把希望寄托在了IRMC上,以为自己另辟蹊径,实则给自己挖了一个坑。那时候怎么就没有想想为什么别人不做基于IRMC的产品开发呢?没有找到相关IRMC和IrOBEX的产品,就以为别人没有发现这条捷径,实则是自己过于无知和轻狂,在这个信息时代我能发现的别人,特别是多年专注于这个领域的人士怎么可能不知道呢?

    既然这条路不通,老板又不想投入技术资金,而且热衷于一些WEB项目,我此后很长一段时间都没有作开发工作了,而是去管理这个公司,包括跟客户谈判和要账。期间和几个同学相聚,问我现在用什么开发?我回答道,用WORD编程。于是众人面露敬佩之色,WORD也能编程啊?呵呵,用WORD写文档不行吗,也是在编程嘛,只不过这些程序不是在机器上运行,而是在老板、员工和客户的大脑中运行而已。虽然我不情愿,但是我还是坚持呆在这个公司,因为我希望自己能够坚持一件事情,而不是整天改变自己的主意和思想,最终一事无成。但事实是,当你坚持的事情本身有问题的话,怎么坚持也是一事无成的,就好比买彩票,你再怎么坚持,能中500万的希望可能就是一个终身泡影。就这样惨淡坚持了几个月,我实在无法忍受自己毫无兴趣的WORD编程了,又加上老板对其他员工的克扣和随意性,我作为管理人员也无法对他们进行交待,于是我选择了逃亡。。。。。。

    逃亡之后才发现自己六年来真地一无所成,而且由于以前包括现在的贪玩和懒惰,在自己赖以生存的软件开发上也是一无是处。这不是由于自己的灰心悲观才得出的结论,而是自己实实在在的体会。因为有些小聪明,学习一些东西比较快,所以往往能够较容易上手,也能得到领导和同事的认同,但是却由于贪玩和懒惰不能深入下去,更不愿长久地进行一项繁琐重复的工程,所以总是在初涉一个领域的时候不久就撤退了,而不能彻底地从头到尾经历一个项目或者渗透一个领域。反反复复瞬间几年过去了,回首间才发现自己已经不是以前的小孩了,要能够养家糊口,要能够得到同龄人的认可和尊重。可是我具备什么呢?基础不扎实,项目不深入,经验不丰富,凡事都是泛泛涉猎浅尝辄止。现在没人也不应该有人再用一个刚毕业的毛孩子来看待我,那么把我当作一个工作6年的人来看待的时候,就得出一个结论:我是一个一事无成的失败者,或者笨蛋。这也是为什么我给自己的博客起名为笨驴,其实和笨蛋一个意思,只是感觉笨驴还好听些。。。。。。同时,我也发现自己的机会越来越少了,这是跟自己以前的失败有直接联系的,所以又感到异常的困惑,不知道自己该怎么走。但是,6年来的贪玩和虚度,也让我肯定了一点,这也是我目前唯一不困惑的,那就是我必须勤奋和有恒心地去走以后的路,否则以后会有更多的6年让我度过并逐渐被抛弃。

    在懊恼和困惑中日子一天天过去,很遗憾没有记录这段时间的经历。以过去为鉴,权且把自己作为一个新入道的人,要重新走本该走过却一直没有走的路,那就是踏踏实实,刻苦持久地做好自己的事情,从头开始,重新打造基础和积累工作经验教训。

4:57 PM - Dec. 5, 2005 - comments {0} - post comment


准备搬家了

突然发现7.0的MSN有一个个人共享空间,而且还是中文的,呵呵,还想什么呢?准备搬家喽

2:46 PM - May. 26, 2005 - comments {0} - post comment


Forumer Contest (Win an Apple IPOD mini)

Just wanted to announce that Forumer.com has a contest with which you can win an Apple IPOD mini (lime color). All you need to do is create a forum and grow it as much as you can. The winner will be selected on June 25th. Good luck :), Forumer.com

10:49 AM - May. 18, 2005 - comments {0} - post comment


好久没顾上写BLOG了。。。。

    这段时间就忙着实现IRMC协议了,头晕脑涨的也没有时间来记下每天的事情了,感觉找不到组织了。

    到今天为止根据IRMC和OBEX协议实现一个简单的同步引擎已经基本成型,但是由于老板强迫限制开发期限,感觉为了赶代码,导致代码出现了很多重复和不完善的地方。但是也没办法,时间压迫着不由得你去自己作主。而且,加上自身能力有限,只有先这样了。

    中间还写了关于BASE64和QUOTED-PRINTABLE编码和解码的方法,把UTF-X到UNICODE之间的字符集转换也加了进来,封装成了一个独立的COM组件,也许能在别的地方派上用场。

    一直有一个困惑我的问题,就是使用ATL开发的组件好像总在Windows98/95下面无法注册或者正常使用,很早就碰到这个问题,但是因为没有时间,而且很多时候所做的组件都是在服务器端运行,也就没有去解决这个问题。现在同步引擎使用了一些自己开发的组件,肯定要用在各种系统上,就不能不考虑这个问题了。我对COM/DCOM方面的开发经验还是太少,希望高人能指点一下。

12:14 PM - May. 10, 2005 - comments {0} - post comment


没干正事

这段时间主要精力放在招聘人员上面了,而且想着把一些关于编码转化写成组件好能被独立使用,所以就没有看协议方面的东西了。

5:29 PM - Apr. 11, 2005 - comments {0} - post comment


IrMC规范学习笔记(五)

    IrMC(Infrared Mobile Communications 红外移动设备通讯)规范1.1 是由红外数据协会(www.irda.org)制订的,用于无线红外设备的信息传输。目前由于工作需要进行移动电话电话簿的同步开发,对该规范进行了初步的了解和学习,以后我会把IrMC相关规范的中文译文和自己的一些心得发布上来,这也是我现在每天的工作内容。希望有共同兴趣和爱好的朋友一起来交流学习。由于重点是电话簿的同步,所以主要是关于电话簿的内容,而像日历卡片,消息和记事本等内容暂时跳过。

 

    到目前为止基本上将IrMC规范关于手机电话簿的同步涉及的内容介绍的差不多了。IrMC规范不仅规定了各个对象的数据格式,而且还规定了同步的协议。但是个人认为在遵循IrMC规范的前提下,可以根据自身业务需要和开发难易程度来决定自身系统的同步逻辑,不一定非要严格按照规范中规定的协议。其实所谓的同步协议就是实现IrMC设备和同步引擎之间数据同步的步骤,这里就不再详细列举,有兴趣的话可以参考IrMC规范。

 

 

设备信息

 

    IrMC设备中与生产厂商和设备本身相关的信息都存储在一个叫做设备信息的对象中,所有支持面向连接服务的IrMC设备必须支持此对象。设备信息对象中包含一些和设备相关的属性标识及其以字符串形式描述的属性值,在VCARD规范中规定的编码、字符集和语言属性同样也使用于该对象的属性。

 

    1. 生产厂商(Manufacturer)

    该属性指定了设备的生产厂商,IrMC规范要求必须支持该属性。

    MANU:<属性值>

    2. 型号(Model)

    指定设备的型号,要求必须支持。

    MOD:<属性值>

    3. OEM

    指定设备的OEM厂商,可选的。

    OEM:<属性值>

    4. 固件版本(Firmware-Version)

    指定设备中固件的版本号,可选的,其值依赖于不同厂商的规定。

    FW-VERSION:<属性值>

    5. 固件日期(Firmware-Date)

    指定当前版本固件的生产日期,可选的。其值遵循ISO8601格式,例如

    FW-DATE:19971031T231210

    软件版本,日期,以及硬件版本,日期类似于固件属性,不再一一列举。

    6. IrMC版本

    指定该设备支持的IrMC规范版本。该属性在IrMC规范1.0之后才被添加进来,并要求必须被支持。当前其值只能被指定为1.1。

    IRMC-VERSION:1.1

    7. 序列号(Serial Number)

    指定设备的序列号,其值依赖于各个厂商规定,在IrMC1.0中可选,但是1.1之后要求必须被支持。

    SN:<属性值>

    8. 电话簿类型(Phone Book Type)

    指定设备中电话簿应用所支持的数据格式,包括传送格式和接收格式两种。在传送格式的属性值中,第一个属性值称作传送格式的默认值,多个属性值以“;”分隔。如果不支持电话簿对象,则必须在格式属性值中指定NONE来表示。该属性在规范1.1以后才添加,并且要求必须被支持。

    PB-TYPE-TX: VCARD2.1

    PB-TYPE-RX: VCARD2.1

    其他还有日历卡片类型(Calendar Type),消息类型(Message Type)和记事本类型(Note Type)类似于电话簿属性,不再详细说明。

    9. 收件箱性能(Inbox Capability)

    指明设备是否支持接收包含有多个对象的OBEX报文。如果其值为SINGLE,则标明设备只能接收包含单个对象的OBEX报文;如果其值为MULTIPLE,则标明设备可以接收包含有相同类型的多个对象的OBEX报文。该属性在规范1.1中被规定,并要求必须支持。如果该属性不存在,等同于其值为SINGLE。

    INBOX:MULTIPLE

    10. 已发送箱性能(Sent Box Capability)

    标明设备中的消息应用是否支持已发送对象库。如果其值为YES,则表示消息应用包括收件箱、发件箱和已发送箱;如果为NO,则消息应用仅包括收件箱和发件箱。而且如果设备不支持消息应用,该值也是NO。如果该属性不存在,则IrMC客户必须明确请求该对象,以便确定是否存在该对象。该属性在IrMC规范1.1中添加,并要求必须被支持。

    11. 扩展属性(Extensions)

    扩展属性名称前面要加上“X-”。

 

    在处理过程中,我们需要使用OBEX的GET操作获取设备信息对象。具体来讲就是使用NAME HEADER,设备信息对象的名称被定义为:telecom/devinfo.txt。

 

 

    好了,关于IrMC规范,主要针对电话簿同步部分就先写这么多。

10:28 PM - Apr. 1, 2005 - comments {0} - post comment


郁闷

    今天本来要把IrMC规范中关于设备信息对象的部分帖出来,就算是IrMC规范暂时告一段落了。没想到就在编写过程中,已经要把设备信息部分写完的时候,有一个关于Outbox和Send Box的概念搞不清楚了,就打开金山词霸看看能否有所帮助。结果,那可爱的金山词霸突然死机了,你说它死机就死机吧,它把XP也一起搞死机了。我那瞬间真是欲哭无泪啊,我开爱的金山词霸啊,我爱你,就像老鼠爱大米。。。。。

    真是郁闷啊,不过也怪我自己。这个金山词霸已经不是第一次出现这个问题了。有一次一个上午写的代码因为中间接了几个电话,忘记存盘了。平时我是一般写完一段代码就存盘的,那次也是巧了,隔了一段时间就接了一个电话,以至于一直忘记存盘了。结果该死的词霸就发难了,那次也是欲哭无泪的说。

10:18 PM - Apr. 1, 2005 - comments {0} - post comment


找出几个错误

今天本来写解析变更日志的代码,结果在原来的写的信息日志解析代码中找到好几个错误,也不知道那天写代码的时候想那个漂亮妹妹了。

今天主要是写了一些代码,没有看协议,当然也没少了打游戏,和毒隐一样,打游戏的毛病我是改不了了。

4:18 PM - Mar. 29, 2005 - comments {0} - post comment


IrMC规范学习笔记(四)

    IrMC(Infrared Mobile Communications 红外移动设备通讯)规范1.1 是由红外数据协会(www.irda.org)制订的,用于无线红外设备的信息传输。目前由于工作需要进行移动电话电话簿的同步开发,对该规范进行了初步的了解和学习,以后我会把IrMC相关规范的中文译文和自己的一些心得发布上来,这也是我现在每天的工作内容。希望有共同兴趣和爱好的朋友一起来交流学习。由于重点是电话簿的同步,所以主要是关于电话簿的内容,而像日历卡片,消息和记事本等内容暂时跳过。

 

 

    接着上次的同步锚点,包含两种类型,变更计数器时间标签,下面分别简单描述一下。

    1. 变更计数器

    在IrMC规范1.1中推荐使用变更计数器同步锚点以减少使用时间标签引起的问题。变更计数器是一个32位无符号整型数据,其值从0到4294967295。每次设备对象库被复位或者使用级别2 OBEX的GET操作存储对象库操作后都要将其设置为0,每次对象库内容被改变时候,包括添加、删除和修改对象库中一个对象的操作,将其值增加1。最近一次变更计数器可以由IrMC客户通过级别4 OBEX的GET命令获取,格式如下:GET "telecom/XX/luid/cc.log",其中XX是变更计数器对应的对象库的名字,例如,获取电话簿对象库最近一次的变更计数器:GET "telecom/pb/luid/cc.log"。

    2. 时间标签

    IrMC规范也允许使用时间标签同步锚点,标识指定对象被更改和删除的时间。其格式如下所示,例如:世界标准时间(UTC)2005年3月27日下午3时49分20秒表示为,20050327T154920Z。由于存在一些可变因素影响时间标签锚点,所以在信息日志中规定了3个属性来限制该锚点,可参考前面文章了解这3个属性。

    注意,一定要确保当前时间标签锚点的值大于先前记录值。但是现实往往存在当前值小于先前时刻的情况,例如,当设备在旅游时候设置为自动根据时区调整时间,或者用户自己调整了设备的时间等

    另外,还要确保每个对象的时间标签锚点是唯一的。

    当使用该锚点,在使用级别4 OBEX的CONNECT操作时候,要锁定数据库。至于如何进行级别4的连接操作,会在后面详细说明。

 

 

数据库标识(Database IDs)

 

    IrMC设备创建对象库同时为其创建一个对应的数据库标识。数据库标识是一个任意的字符串,IrMC客户通过它可以判断服务器数据库自从上次同步以来是否被复位或者替换。因此,如果数据库被复位,或者被客户通过级别2的PUT操作替换都要重新创建一个数据库标识,而且如果对象库支持变更计数器类型同步锚点,则当计数器的值从最大值4294967295回滚到0的时候,也认为是数据库进行复位并重新创建一个标识。既然每次数据库被替换都要重新创建标识,所以要求标识必须是唯一的。

    IrMC设备提供的信息日志的第二行指定对应对象库的数据库标识。

 

 

物理和软删除

 

    通常情况IrMC客户基于下面两种原因要求服务器进行对象删除操作:

  1. 用户在客户端数据库中删除了对象,则同步时候要求服务器也必须删除该对象。
  2. 设备空间不足,删除其他对象以容纳其他对象。

    相似的,用户也可能基于下面原因删除设备中的对象:

  1. 用户已经不需要一个库中的对象记录。
  2. 用户发现设备空间不足,从而删除一些记录来腾出空间。

    那么不论对于上面那种情况,操作的另一方都无法确定删除操作是基于什么目的,是彻底从设备中移除还是只是为了腾出空间。为了解决这个问题,就要求IrMC设备支持区分物理删除和软删除的概念,则操作方根据当前删除操作的具体要求进行相应操作,并为另一方所接受。至于对于支持区分物理删除和软删除的设备如何实施在前面已经详细说明。

 

 

变更日志

 

    变更日志,作为同步的辅助工具用于级别4的信息交换。它提供了一种简单的方法允许客户端获取设备的序列号、数据库标识、最大存储容量和当前存储容量。此外,它还提供自从上次同步以来设备发生变更的最新列表。

    变更日志中发生变更的记录按照时间顺序明确排列,最近的变更在表中最前面的位置。变更日志中关于变更的条目对应于对象库中每个发生变更的特定对象。

    变更日志中关于对象变更的条目都包含以下属性:

  • 变更类型(Action):M表示修改(添加操作也属于此类型),D表示删除或者H表示物理删除。
  • 变更计数器(Change Counter):该属性可选,但是规范推荐使用此属性。如果该属性不存在,则设备必须提供时间标签属性
  • 时间标签(Timestamp):该属性可选,如果该属性不存在,则必须提供变更计数器属性。
  • 本地唯一标识(LUID):发生变更对象的本地唯一标识

    注意:没有必要每次传输整个变更日志,所以为了避免混淆,存储的变更日志要参考存储在IrMC设备上的变更日志,传送的变更日志则参考传送给IrMC客户的变更日志。而且服务器未必一定存储变更日志,它可能在需要时候动态创建变更日志。

    日志可以容纳的记录数目由设备类型确定。如果增加新的变更条目时候日志已满,则会删除最早的条目。日志必须足够大以便能够容纳同步时候所有的变更。

 

    1. 获取变更日志

     IrMC客户可以通过使用类似下面的OBEX的GET操作获取设备变更日志:“GET telecom/XX/luid/#####.log”   ,其中XX是指定的对象库名称,#####标识同步锚点的值。例如,如果使用变更计数器锚点,则telecom/pb/luid/123.log表示客户端希望获取电话簿对象库所有大于123的变更记录;而telecom/pb/luid/20050328T150000Z.log表示客户端希望获取电话簿对象库所有2005年3月28号下午3点以后的变更记录。如果设备是第一次被请求变更日志,则客户端根据锚点类型分别指定0.log和19000101T000000Z.log日志对象进行请求,服务器则负责确定客户请求的锚点类型。

    如果客户提交的锚点比设备变更日志中最早的记录还要小,则所有已经被删除条目和“*”被服务器返回;如果客户提交的锚点比日志中最新的记录大,则服务器返回“*”。在变更日志获取返回“*”的情况下,就要考虑进行双方的完全同步了。

    如果数据库被复位,或者被客户通过级别2的PUT操作替换,或者如果对象库支持变更计数器类型同步锚点,则当计数器的值从最大值4294967295回滚到0的时候,都要将变更日志清空。

    服务器返回的变更日志都是采用如下顺序:第一行返回设备序列号,第二行返回数据库标识,第三行和第四行则为当前对象数目和对象库容量,接下来是变更条目。这样也便于同步引擎快速确定数据库是否已经复位或者被替换。下面看一个例子(我从一款西门子6C6手机上得到的):

    SN:354735001562449

    DID:14578531

    Total-Records:1

    Maximum-Records:1000

    M:28::2684358915

    H:27::2684358913

    下面我将说明日志内容的详细定义。(突然才发现我还没有写解析变更日志的VC程序,看来今天的任务又要增加一项了,但是还想去放风筝,郁闷)

 

    2. 变更日志格式定义

    <变更-修改>    定义为    M

    <变更-删除>    定义为    D

    <变更-物理-删除>    定义为     H

    <变更-变更计数器>    定义为     一个以ASCII编码表示的32位无符号整型数据,0-4294967295

    <变更-时间标签>    定义为     标准日期格式,前面有说明

    <变更-变更条目>    定义为     <变更-修改>|<变更-删除>|<变更-物理-删除> : <变更-变更计数器:>|<变更-时间标签> : CRLF

    <变更-条目已满>    定义为     <变更-物理-删除条目> *

    <变更日志对象>    定义为    <设备序列号>CRLF<数据库标识>CRLF<当前对象数目>CRLF<最大容量>CRLF<变更-变更条目>|<变更-条目已满>

 

4:28 PM - Mar. 28, 2005 - comments {0} - post comment


IrMC规范学习笔记(三)

    IrMC(Infrared Mobile Communications 红外移动设备通讯)规范1.1 是由红外数据协会(www.irda.org)制订的,用于无线红外设备的信息传输。目前由于工作需要进行移动电话电话簿的同步开发,对该规范进行了初步的了解和学习,以后我会把IrMC相关规范的中文译文和自己的一些心得发布上来,这也是我现在每天的工作内容。希望有共同兴趣和爱好的朋友一起来交流学习。由于重点是电话簿的同步,所以主要是关于电话簿的内容,而像日历卡片,消息和记事本等内容暂时跳过。

 

 

同步操作

 

    同步最基本的含义就是比较和分析两个对象库并对其进行修改达到完全一致的操作过程。在IrMC中,就是指在两个IrMC设备之间进行同步,但是未必要求两个设备的对象库完全一致。例如,一部移动电话中的对象库是不要求和一台电脑上的数据库结构完全一致的,这是由他们各自的存储和操作能力决定的。这和上面提到的同步的概念并不矛盾,因为在电脑上会驻留一个同步引擎,保证这两个IrMC设备对象库逻辑上的一致性,这也是为什么IrMC客户需要一个同步引擎的原因。

    同步操作在对象库中的对象具有唯一标识的时候是最有效的,所以要求支持同步操作的IrMC设备必须能够支持信息交换级别4和使用唯一索引。

    同步操作有两种基本的同步类型:快速同步(Fast Sync)完全同步(Slow Sync),前面也曾提到过这两种类型的定义,下面简要描述一下两种类型同步的实现过程。

 

    完全同步实现过程

  • IrMC客户通过同步引擎执行级别2 OBEX的GET操作从服务器获取所要求的整个对象库。
  • IrMC客户对收到的数据进行分析处理,并根据分析结果同步其自身数据库。
  • IrMC客户通过同步引擎将其对象库的变更使用级别4/2 OBEX的PUT操作写入IrMC设备(服务器)。

    快速同步实现过程

  • IrMC客户通过同步引擎请求变更日志对象,或得自从上次同步以来的同步锚点。
  • IrMC客户使用级别4 OBEX的GET操作获取变更日志中记录的已经发生变更的对象
  • IrMC客户对自身对象库进行分析处理,得到自从上次同步以来自身发生变更的对象。
  • 将第三步获取的对象使用级别4 OBEX的PUT操作写入IrMC设备。

    下面将对同步操作过程中涉及的一些对象和概念作详细描述。

 

    同步锚点(Sync Anchor)

    前面已经提到过,主要包括两种类型:变更计数器和时间标签。IrMC规范要求客户端必须能够同时支持这两种类型,而对于服务器则不要求。通常建议服务器能够支持变更计数器类型,而对于某些特定对象库,在无法使用计数器类型时候才使用时间标签类型锚点。

 

    今天就写这么多吧,去打篮球去,身体是革命的本钱,不能因为搞计算机把身体搞垮了。这也算我对同行的一个忠告吧。

2:04 PM - Mar. 26, 2005 - comments {0} - post comment


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的格式还包括如下规定:

  • 该域必须能够描述特定库所支持的所有属性、参数和类型
  • 如果IrMC对象(记录)中包含有未被X-IRMC-FIELDS规定的属性,则忽略。
  • 如果不存在X-IRMC-FIELDS,则指定对象库支持的属性必须符合Versit标准或者其他标准化组织制定的相应规范。
  • X-IRMC-FIELDS标签之后必须以尖括号封装“Begin”开始,以尖括号封装“End”结束。
  • 每个X-IRMC-FIELDS规定的属性及其参数必须位于单独一行并以CRLF(回车换行)结束。
  • 属性类型必须以“TYPE=”开始,所有支持的类型必须列举在后面并以“;”分隔。

下面我们看一个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操作,则服务器会执行以下操作:

  • 清除当前对象库中的所有数据
  • 如果支持变更日志和变更计数器,清除变更日志和设置计数器为0。
  • 为对象库分配一个新的数据库标识(DID
  • 将对象数据流中的数据添加到对象库中,并为之分配新的LUID。

    访问受限

    有些对象或者对象库限制写入,则服务器会返回一个未验证的OBEX代码,不包含其他Header

    未找到请求的索引

    如果对一个不存在的对象或者对象库进行写入操作,则服务器返回一个没有找到相应请求的OBEX编码,不包含BODY。

    数据库被锁定

    如果操作的对象库被锁定,则服务器会返回一个表示数据库被锁定的OBEX代码(0xE0),不包含BODY。

    数据库已满

    如果执行操作时候数据库容量已经达到最大,则服务器将返回一个不包含BODY的数据库满的应答(0xE1)。

    发生冲突

    请参考上面关于APP PARAM地说明。

6:45 PM - Mar. 25, 2005 - comments {1} - post comment


IrMC规范学习笔记(一)

    IrMC(Infrared Mobile Communications 红外移动设备通讯)规范1.1 是由红外数据协会(www.irda.org)制订的,用于无线红外设备的信息传输。目前由于工作需要进行移动电话电话簿的同步开发,对该规范进行了初步的了解和学习,以后我会把IrMC相关规范的中文译文和自己的一些心得发布上来,这也是我现在每天的工作内容。希望有共同兴趣和爱好的朋友一起来交流学习。由于重点是电话簿的同步,所以主要是关于电话簿的内容,而像日历卡片,消息和记事本等内容暂时跳过。

 

 

名词解释

 

变更计数器(Change Counter): 同步锚点的一种,是一个32位的无符号数值,用于跟踪记录自从上次数据库同步以来的变更。当对象存储库每次进行改动,其变更计数器就会递增。

变更日志(Change Log): IrMC服务器对象的一种,用于提供指定对象存储库所发生变更的详细信息。通常包括一个发生变更对象的本地唯一标识(LUIDs),变更类型描述(删除,修改等)和一个用于说明变更发生时间的同步锚点。

数据库: 参考对象存储库。

数据库标识: 一个32位的唯一标识符,用于标识特定的对象存储库。

设备同步锚点: 在变更日志中存储的各项的同步锚点

设备信息对象: 一个提供IrMC设备特征详细信息的IrMC对象。

快速同步: 一种同步方式,通过变更日志仅同步那些被更改的对象。

物理和软删除: 为了最大限度地提供合理化同步,有些服务器的对象库支持两种删除操作,物理删除和软删除。物理删除通常由用户执行进行彻底删除操作,软删除则通常由同步引擎在服务器空间不足情况下执行。

收件箱: 一种IrMC对象存储库,能够存放多种格式的其他IrMC对象,例如电话簿,日历卡和消息等。该对象库通常作为一个临时存储区容纳接受到的IrMC对象以便用户决定是将其存储到相应库还是将其删除。

IrMC对象: 就是存储在IrMC设备上的对象,例如一个电话簿条目,一条日历项,变更日志和设备信息等。语义上等价于一条记录。

IrMC客户: 能够和一个IrMC服务器进行通讯的设备 。典型的客户是一台电脑。但是很多情况下,PDA,寻呼和电话也可作为一个IrMC客户。

IrMC设备: 一个至少包含一个IrMC服务器的设备。像电话,寻呼和电脑都可以作为一个IrMC设备。

IrMC静态服务器: 一个支持使用静态索引的2级和3级信息访问的IrMC服务器。

IrMC唯一服务器: 一个支持使用唯一索引的2级和4级信息访问的IrMC服务器。

1级信息访问: 允许IrMC客户向服务器发送单一IrMC对象的访问方式。

2级信息访问: 允许IrMC客户能够向服务器发送和接受整个IrMC对象库的访问方式。

3级信息访问: 允许IrMC客户向服务器通过静态索引发送和接受单一IrMC对象的访问方式。

4级信息访问: 允许IrMC客户向服务器通过唯一索引发送和接受单一IrMC对象的访问方式。同时,该方式还定义了返回一个特定库自从上次同步以来所发生改变的所有对象的列表的方法。

信息日志对象: 一个IrMC对象,指定了一个特定对象库的详细信息特性。例如,一个电话簿日志信息对象可能包括电话簿对象的数目,电话簿对象所支持的格式类型以及电话簿对象库的容量等。

本地唯一标识: 在特定IrMC服务器内本地唯一的标识。

完全同步(Slow Sync): 一种同步方式,一个或者多个对象库中的记录进行逐域比较和同步。

静态索引: 对象库内对象标识的索引。静态索引值被定义为一个一系列连续数值的有限集,从0开始,当一个对象被创建,从集合中为其分配一个未使用的索引值;如果库内一个对象被删除,则为其分配的索引值可以被再次使用。

同步: 所谓同步就是两个IrMC设备交换变更日志和对象库,从而确保两方库中的数据是完全一致的。

同步锚点: 存储在变更日志中的一个数值,用于指定记录被修改的时间。包括两种方式:变更计数器和时间标签,也可能是两种方式共同使用来确定记录的修改时间。

同步引擎锚点: 存储在同步引擎中的同步锚点,从而保证同步引擎能够向同步服务器请求合适的变更日志和进行同步操作。而且我认为也要存储发生在同步引擎方面的对象变更,才能保证两个设备的完全同步。

同步引擎: 一个应用程序,屏蔽同步双方完全不同的设备和数据库结构,进行同步操作和管理。这个很重要,举例来说:电脑上的数据格式和处理能力与移动电话是完全不同的,如果没有同步引擎作为中间的翻译官,电脑和手机之间的通讯是难以想象的。

时间标签: 同步锚点的一种,一个描述了记录最后一次被更改的确定时间和日期的数值。

唯一索引: 对象库内对象标识的索引。其值由一个有限的数值集组成,但是不要求从0开始,也可以是不连续的。当一个对象被创建,为其分配一个从未使用过而且是唯一的数值。

 

 

IrMC规范当前支持的对象和对象库

  1. 电话本对象库:支持vCard 2.1 格式。
  2. 日历卡对象库:支持vCalendar 1.0 格式。
  3. 消息对象库:支持vMessage 1.1 格式
  4. 记事本对象库:支持vNote 1.1 格式
  5. 变更日志对象库:参考上面的名词解释。
  6. 信息日志对象库:在以后会有详细说明。
  7. 设备信息对象:包含了针对该设备的信息,暂时不进行说明。
  8. 变更计数器对象:在以后会有详细说明。
  9. 实时时钟对象:包含了设备当前日期和时间的对象。

 
OBEX信息交换

 

   OBEX(Object Exchange)协议也是由红外数据协会(www.irda.org)制订,所有原子信息交换操作都是基于OBEX协议。所有的IrMC对象和对象库根据IrMC命名规则来标识,并通过OBEX协议被访问。

关于OBEX协议我会另外专门发布相关文章,这里就不再多说。

 

 

原子信息交换级别

 

    如何组织和访问一个对象库取决于IrMC服务器实现和支持的信息交换级别。除了支持级别4信息交换不需要支持级别3信息交换的情况,一个IrMC服务器在实现较高级别的信息交换的时候,也必须提供对低级别信息交换的支持实现。也就说,如果IrMC服务器支持信息交换级别3,则必须也能够支持级别1和2。但是,如果IrMC服务器支持级别4,则级别3可以不支持,但是必须支持级别1和2。一个服务器提供的信息交换级别支持必须明确定义在其日志信息对象和IAS中。关于IAS,在以后我会简单说明,其实我目前对IAS也了解甚少,如果有了解比较详细的朋友可以在评论中给与说明。

 

1. 信息交换级别1(最低级别)

    所有IrMC服务器必须提供该级别支持,但是客户端不要求。该级别可以使用面向连接和无连接的传输服务。

2. 信息交换级别2(访问级别)

    IrMC客户可以通过此级别发送和接受整个对象库,要求是面向连接的传输服务(例如,IrLMP)。该级别创建和操作一个包含库中所有对象的对象流,并且不需要收件箱对象,对象流的命名格式IrMC中有详细规定,例如电话簿对象流命名:“telecom/pb.vcf”。当在OBEX中指定使用级别2 PUT/GET等操作时候,也就是使用指定的该级别的命名。另外,在级别3和级别4中也可以使用级别2的OBEX操作,在以后的同步操作中你会看到这一点的。

3. 信息交换级别3(索引级别)

    该级别也要求面向连接的传输服务。其命名规则在IrMC中也有明确规定,如电话簿的命名“telecom/pb/n.vcf”,其中n就是上面提到的分配给该对象的静态索引。

4.信息交换级别4(同步级别)

   是信息交换的一种特殊形式,通过该级别,IrMC客户可以获取自从上次同步以来对象库中发生变更对象的列表。该级别主要用作数据同步操作的一部分,也要求面向连接的传输服务。其命名规则在IrMC中也有明确规定,如电话簿的命名“telecom/pb/luid/n.vcf”,其中n就是上面提到的唯一索引,当n为0的时候表示机主本人的电话号码。“telecom/pb/luid/cc.log”则表示当前变更计数器对象;“telecom/pb/luid/xxxx.log”代表变更日志对象,其中xxxx就是你要求的变更计数器的值。

    以后着重讨论的也是该级别的信息交换,谁让它是同步级别呢。

7:07 PM - Mar. 24, 2005 - comments {0} - post comment


开篇

人生有很多第一次,这个Blog也是我很多第一次的一次。说实话,我对Blog的概念还不是很清楚,但是能把自己的一些事情记载下来确实令我感到很有兴趣。以后我将在自己的这片天地中记录我的每一天,省察自己,记录自己一天的收获,与有共同兴趣的朋友交流,并从中受益和提高自己。

2:00 PM - Mar. 23, 2005 - comments {2} - post comment


描述
在IT行业混了6年,转身却发现自己一无所有。虽然我贪玩,虽然我懒惰,但是还想挣扎着从头再来。我不太清楚Blog的概念,但是我想n年后即使我依然一无所有,至少有这份记录。
首页
个人档案
存档
最近发布
- blogs updated
- 头晕了
- 搬家也搬不动
- 准备搬家了
- Forumer Contest (Win an Apple IPOD mini)


Free phpBB Hosting