基于蓝牙技术实现嵌入式SyncML服务器的应用方案

描述

  作者:马建辉;吕梦兴;王知学;于良杰;成巍

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分