作者:马建辉;吕梦兴;王知学;于良杰;成巍
SyncML与蓝牙协议
图1为SyncML的蓝牙应用协议结构图。依据SyncML协会定义的蓝牙绑定协议,SyncML服务器的蓝牙实现需要用到SDP和OBEX协议,电话簿同步应用需要用到vCard规范。SDP协议用于SyncML服务器蓝牙服务的注册,查询蓝牙手机的SyncML客户端服务以在RFCOMM层上建立蓝牙连接,该RFCOMM连接是SyncML连接的基础;OBEX(Object Exchange)是对象交换协议,它管理SyncML服务的连接,将SyncML文档封装为Object进行传输并控制传输过程;vCard规范是电子名片规范,定义了个人名片信息的标准格式,方便传播和交换。下面从这三个方面介绍SyncML的电话薄同步应用的关键点。
SDP在SyncML中的应用
SyncML绑定协议中定义了SyncML客户端和服务器的SDP纪录。
SDP是蓝牙服务发现协议,它提供了注册蓝牙服务和搜索及浏览蓝牙服务的方法。注册蓝牙服务是本地行为,以Service Discovery DataBase即服务发现数据库的形式纪录,每条Record即服务发现数据库中的一个条目。搜索及浏览则基于C/S结构(客户端/服务器)的请求-响应形式,使得客户端可以访问服务器端的服务数据库。
作为SyncML的服务器端,首先需要注册该蓝牙服务并处于pageable(可被寻呼)状态,这样才能被蓝牙手机发现本地设备的SyncML服务。SDP Record以结构体形式定义,定义了若干属性和数据类型,包括ServiceClassIDList、protocolDescriptorList、 Service Name、ServiceDescription等,其中ServiceClassIDList属性是最为重要的,以全局唯一标识符UUID表示,客户端搜索服务器端服务的时候便是根据该属性进行定位。
Syncml服务器端的ServiceClassID为00000001-0000-1000-8000-0002EE000002,蓝牙协议为OBEX,数据类型均为DataElSeq。注册该服务时首先给server channel赋值为默认值0,然后为该服务分配Rfcomm 通道,将分配的通道号给server channel重新赋值。
车载蓝牙设备与手机建立免提连接后主动发起跟手机的SyncML服务的连接,首先设备通过SyncML客户端ServiceClassID定位手机端的SyncML服务记录,然后在该服务记录中查询手机为SyncML服务分配的Rfcomm通道号,然后建立Rfcomm层的连接。
OBEX绑定
SyncML应用独立于具体的传输方式,换言之,针对具体的传输方式,SyncML定义了相应的绑定适配协议。对于蓝牙应用,SyncML OBEX绑定协议定义了SyncML在蓝牙上的实现方式。下面介绍OBEX协议,以及SyncML在OBEX上绑定时需要注意的地方。
OBEX(Object Exchange)对象交换协议是采用C/S(客户/服务器)结构的面向会话的协议,它建立了“对象模型”以抽象描述各种实体,并定义了Header的概念来描述对象,一个对象便是一系列Header的集合。
OBEX定义了OBEX客户端和服务器端的应用规范,客户端是指发起OBEX连接、初始化OBEX会话的一端。根据车载设备要在免提连接建立后进行电话薄同步的应用,车载设备需要实现OBEX客户端。OBEX客户端在之前建立的Rfcomm连接的通道上发起连接请求,请求数据为80 00 15 11 00 04 00 46 00 0e 53 59 4e 43 4d 4c 2d 53 59 4e 43。其中0x80为连接操作符,连接请求包长度为0x0015,OBEX版本为version1.1,版本号表示为0x1100,最大OBEX包长度为0x0400,0x46表示Target,Target表明连接的目的或服务,在这里Target为53 59 4e 43 4d 4c 2d 53 59 4e 43即SYNCML-SYNC,表明建立的OBEX连接用于SyncML。
SyncML Document需要封装为SyncML MIME类型的对象在OBEX请求或响应主体内传输,该类型为“application/vnd.syncml+wbxml”。SyncML同步电话薄的速度是个很关键的用户体验,相关的关键属性值为最大OBEX包长度,它决定了每次交互的OBEX包的大小,从而决定了交互次数,该最大包长度越大,交互次数越少,从而同步速度越快,反之,同步速度越慢。该最大包长度在OBEX连接时协商决定,取双方设备能够支持的最大包长度的较小值。
SyncML的蓝牙应用不可避免地会遇到兼容性问题,在测试过程中发现车载设备和Nokia6288手机进行同步时,车载设备通过PUT发给手机的SyncML Document的最后一包必须是空包82 00 03,否则无法继续同步。
vCard解析
SyncML实现的蓝牙手机和车载设备间电话薄同步应用中,首先提取出采用vCard格式的个人信息数据和相关命令,将数据和命令映射在一起存储为结构体形式的列表,然后根据 vCard规范解析出个人信息,根据命令完成添加、删除和替代电话薄条目。解析出的个人信息包括人名、手机号码、家庭电话、办公电话和车载电话,命令为 ADD、DELETE、REPLACE。下面简要介绍vCard规范,以及vCard解析的实现。
vCard电子名片规范定义了个人公共信息交换(PDI)的描述标准和组织格式,该格式与信息传送的方式无关,方便了各种系统和应用之间的信息交换。在vCard中,个人公共信息包括姓名、年龄、地址、电话等与个人紧密相关的基本信息。手机内vCard样例如下:
BEGIN:VCARD
VERSION:2.1
N:denglibao
TEL;WORK:045182605447
TEL;HOME:05307415684
TEL;CELL:13478951524
END:VCARD
现在使用的vCard规范版本为2.1和3.0,定义了数据的存储格式及访问接口的规范,vCard解析需要能够解析这两种版本。根据车载信息娱乐设备的应用,vCard解析函数需要提取出姓名和电话号码两个属性,其中电话号码又包括手机、家庭电话、办公电话、车载电话四类,其属性值均为TEL,参数值分别为CELL、HOME、WORK、CAR,下面给出设计代码的主要部分。
unsigned int vcard_parse(void)
{
unsigned int cnt,end,i,phone_index;
char* p;
end=vcard_length;
value_initia();
/*begin to parse vcard*/
for (cnt=13; cnt after“BEGIN:VCARD”*/
{
if((0xd==an_complete_vcard[cnt])&&(0xa==an_
complete_vcard[cnt+1]))
{
/*extract a property,another property parameter or vcard end*/
cnt=cnt+2;/*skip \r\n*/
/*if vcard end*/
p=&an_complete_vcard[cnt];
if(0==uCompareASCIIName(p,“END:VCARD”,9))
{
if(vcard_cmd==ADD)
{
phonebook_insert();
}//the vcard cmd ADD
else if(vcard_cmd==REPLACE)
{
}// the vcard cmd REPLACE
return 0;
}else if(0==uCompareASCIIName(p,“TEL;”,4))
{
cnt=cnt+4;/* TEL property ,first skip “TEL;”*/ …
p=&an_complete_vcard[cnt];
if(0==uCompareASCIIName(p,“PREF”,4))/*mobile
phonenumber*/
{
cnt=cnt+4;/*skip the “PREF”*/
。..
cnt=cnt-2;/*check next \r\n,in the “for”,cnt++,so -2,not -1*/
}else if(0==uCompareASCIIName(p,“VOICE”,5))
{
}else if(0==uCompareASCIIName(p,“CELL”,4))
{
}else if(0==uCompareASCIIName(p,“HOME”,4))
{
}else if(0==uCompareASCIIName(p,“WORK”,4))
{
} else if(0==uCompareASCIIName(p,“CAR”,3))
{
}
} else if(0==uCompareASCIIName(p,“TEL:”,4))
{ //some phone’s telephone have no parameter,
for example TEL:10086
}else if(0==uCompareASCIIName(p,“N”,1))
{ //name property
}
}
}
return 0;
}
其中,uCompareASCIIName是比较字符串函数,对输入的两个字符串不分大小写按字节进行比较,具体代码略。
结语
现在的一些文章中,对SyncML的蓝牙实现只是泛泛而论,并没有对具体的实现做深入的研究和分析,在一款车载信息娱乐设备上设计实现了基于蓝牙技术的嵌入式SyncML服务器,从SDP和OBEX绑定上具体指出了SyncML蓝牙应用的设计要点,并结合vCard规范给出了电话薄数据解析的具体实现代码。实践证明,车载蓝牙设备的嵌入式SyncML服务器运行稳定,有很好的应用价值。
责任编辑:gt
全部0条评论
快来发表一下你的评论吧 !