×
汽车电子 > 汽车分类 > 详情

基于蓝牙技术的数据同步的实现

发布时间:2020-05-18 发布时间:
|

引言:

免提通话是蓝牙技术在汽车中最广泛的应用,在大部分蓝牙车载设备实现的免提通话功能中,用户一般在手机端拨打电话,在免提端接听电话(一般控制按键在方向盘上)。由于在拨打电话时,需要在手机上进行查找电话本、拨打等操作,给行车带来一定的危险性,如果可以实现电话本在蓝牙车载设备和手机之间的同步,那么便可以借助方向盘和车载液晶屏进行操作,从而保证了开车和打电话两不耽误,提高了安全性[1]。事实上电话本同步作为蓝牙技术的车载应用之一,和免提应用结合起来,不仅可以实现从车载设备端拨打电话,还可以实现来电提示、语音播报等功能,进一步方便了用户的使用。由于蓝牙技术存在众所周知的兼容性问题,为了实现对大部分手机的电话本同步功能,笔者在所设计的蓝牙车载设备中采取多种方式进行电话本的下载,并实现相应的电话本解析,下面首先介绍下四种下载方式,然后描述电话本解析的实现方法。
电话本下载:
笔者设计实现了三种电话本自动下载的方式-PBAPSyncMLAT命令,可以下载大部分蓝牙手机的电话本。PBAPPhoneBook Access Profile的缩写,它是蓝牙SIG为电话本同步应用专门定义的剖面,可以自动下载手机和SIM卡中的电话本和呼叫记录;SyncML是传统的数据同步协议,用于在用户的各种设备之间同步个人信息(包括电话本),可以绑定在蓝牙OBEX(对象交换协议)协议上实现[2],除了电话本下载功能,它还可以实现电话本的自动更新即增、删、修改电话本条目的功能,从而省去了每次重新下载电话本,降低了通信数据量,提高了同步速度;AT命令是传统的命令响应式,有几条特殊的AT命令用于电话本下载。
对于不支持上述三种下载方式的手机,还可以选择手动推送的方式,在车载蓝牙设备上实现OPP Server功能,同时在设备初始化阶段设置其设备类型class of device支持对象交换功能,这样用户在手机上选择部分电话本“通过蓝牙发送”时,便可以搜索到车载蓝牙设备,然后手动推送到设备上。因为几乎所有手机都支持这种手动推送的方式,这样通过三种自动下载和一种手动推送的方式,便可以下载绝大部分手机的电话本。
下面以PBAP为例,介绍下电话本下载的具体实现。
PBAP(PhoneBook Access Profile)是在OBEX协议的基础上实现的,它将电话本定义为文件形式的对象模型,文件类型为"x-bt/phonebook"[3]Local Phone电话本的文件名为"telecom/pb.vcf"SIM卡电话本文件为SIM1/telecom/pb.vcf"PBAP定义了ClientServer两种角色,所有的请求都有Client发起,Server根据请求做出相应的响应[4],在电话本同步应用中,车载蓝牙设备为Client,手机为Server
首先车载蓝牙设备发起PBAP连接请求,手机根据自身状态接受或拒绝连接;连接建立后,车载蓝牙设备通过一个Application Specific Header设置电话本数据即VCARD的属性,一般设置为含有VERSION-版本、N-名字、TEL-电话号码;设置完成后,车载蓝牙设备通过GET命令请求类型为"x-bt/phonebook"、名称为"telecom/pb.vcf"的文件,并设置单包数据量大小,这样便启动了手机电话本的下载,当接收到一包新数据时,可以判断出是否还有未下载数据,如果有,发起继续传输的请求,便可以下载更多数据,当然也可以根据需要终止当前的下载过程。
对蓝牙车载设备的用户体验而言,电话本的下载速度无疑是一个很关键的指标,通过研究发现,下载速度是由传输数据量大小和交互次数决定的,首先在设置VCARD属性时,通过过滤VCARD中不必要的属性减少传输数据量,如PHOTO之类的数据量很大但对车载蓝牙设备无用的属性便可以过滤掉,从而减少了数据传输量,加快下载速度;然后在发起GET请求时,在内存允许的情况下设置尽可能大的单包数据量大小,这样便可以减少交互次数提高下载速度。
电话本解析:
在上一章介绍的四种下载方式中,PBAPSyncMLOPP下载的电话本条目采用vCard的形式,需要按照vCard规范进行解析。
vCard是电子名片规范,定义了个人信息数据的存储格式及访问接口的规范,现在广泛应用的是v2.1版本。对于电话本条目而言,需要解析出的信息为姓名和电话号码,而电话号码又包含多种类别,根据车载应用的需要,我们提取出家庭电话、工作电话、手机、车载电话这四种电话号码。vCard举例如下:
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;:9A6C5EFA8F89
TEL;CELL:13475909642
TEL;WORK:053182605413
END:VCARD
在电话本下载过程中,电话本数据是按大小分包次序传输的,所以首先通过查找VCARD的头"BEGIN:VCARD"和尾"END:VCARD"提取出一个完整的VCARD,然后通过判断处于VCARD行首的属性查找姓名和电话号码,分别对应NTEL,每个属性项中的':'后为属性值,按照这种规定,在以上的vCard样例中,姓名为UTF-8字符0x9A6C 0x5EFA 0x8F89 即马建辉,电话号码有两条:手机13475909642和工作电话053182605413
AT命令下载的电话条目有自己独特的格式,举例如下:+CPBR: 4, "13475909642", 129, "MaJianHui"+CPBR表示电话本条目,同样在':'后为各个属性值,首先是索引号,然后是手机号码,然后是姓名字符编码方式,然后是姓名,在该例子中,索引号为4的电话号码为13475909642,人名为MaJianHui
兼容性设计:
蓝牙是个开放性的协议,它引入了很多其它技术领域的成熟协议,比如vCardvCard协议被用来和PBAPOPP协议结合,进行电话本条目的封装、下载和解析,由于不同的手机在用vCard封装电话本时存在很大的灵活性,这就带来了电话本解析的兼容性问题[5]
在上一章中提到,需要从VCARD中提取出手机号码、家庭电话、工作电话和车载电话这四种电话号码,在vCard规范中,相应的参数关键字便是CELLHOMEWORKCAR。但是我们在对多部手机进行测试的过程中发现仅提取这几个关键字是不能满足要求的,有的手机在封装VCARD时,还使用了PREFVOICE作为关键字,这个时候我们必须把PREFVOICE之后的电话号码也提取出来,然后按照优先原则和占位原则进行处理。我们用某款Nokia手机做过测试,某个电话本条目对应的VCARD如下所示:
BEGIN:VCARD
VERSION:2.1
N;:test
TEL;PREF:13476156288
END:VCARD
按照占位原则,我们把13476156288提取为手机号码,如果对应的VCARD如下所示:
BEGIN:VCARD
VERSION:2.1
N;:test
TEL;PREF:13476156288
TEL;CELL:13475909642
END:VCARD
按照优先原则,将CELL对应的13475909642提取为手机号码,覆盖13476156288这个号码。之所以如此处理,是因为当手机有一定的灵活性时,车载设备也必须具备相应足够的灵活性,才能满足尽可能多手机的要求。
兼容性问题不仅表现在多个手机对VCARD封装方式的差别上,还表现在同一部手机在不同运行状态下对VCARD封装的差别。比如在姓名提取应用中,某款Sony Erricson手机对姓名字段的封装为
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;Td
这样提取出Td,而有时封装为
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;Td=E3=80=80=E3=80=80
这样提取出来的姓名为'T''d' E3 80 80 E3 80 800xE38080是一种特殊字符,表示空格,对于仅支持英文字符的显示设备,无法正确显示,处理方法为将特殊字符E38080处理为空格对应的ASCII0x20。可见兼容性问题的另一个解决方法就是枚举尽可能多的特殊情况特殊对待,其他情况在此不再赘述,有关兼容性问题的原因分析及解决方法,可以参考笔者的《蓝牙车载产品的兼容性设计》一文。
结语
笔者为某款车载蓝牙设备设计的电话本同步功能,实现了电话本下载及解析,灵活可靠,兼容大部分手机,现已成功运用于某国产车型上,运行稳定,有良好的实用价值。
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
低成本的PLD管理图像数据