新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 蓝牙车载产品的兼容性设计

蓝牙车载产品的兼容性设计

作者:马建辉 单铁城 山东省科学院自动化研究所山东省汽车电子重点实验室 马共立 哈尔滨威克科技时间:2010-05-07来源:电子产品世界收藏

  对于这种兼容性问题,需要对手机在不同应用上下文的表现特性进行分析,并根据其差异进行分类。通过对手机在配对完成后的处理进行分析,有的手机配对完成后马上自动连接,有的需要用户确认再手动连接,有的会通过SDP读取车载设备的服务列表然后针对车载设备提供的服务自动连接(车载设备提供免提服务、SPP服务、SyncML服务、流媒体音乐播放服务),而有的不会自动连接,这样分类后,根据手机特性的不同设计实现配对后的自动连接如下:

本文引用地址:http://www.eepw.com.cn/article/108773.htm

  车载设备在配对完成后的4秒内无操作,配对后马上自动连接的手机(如nokia 6500c)和大部分读取SDP后自动连接的手机(如三星SGH-U608、SGH-E208),可以迅速连接上车载设备。配对完成四秒后车载设备通过SDP判断配对设备的类型(包括免提、音频流、免提+音频流三种类型),如果类型为免提+音频流,则在连接免提成功后等待10秒再去连接音频流,之所以10秒后再去连接音频流是因为免提连接成功后,需要连接PBAP或SyncML或SPP去下载电话本,如果同时进行A2DP的连接去连接配对设备的流媒体服务,会造成链路丢失,免提连接及音频流连接断开。如果连接免提失败,则不再连接其音频流服务,因为有的手机如多普达D600的PDA手机,配对完成后读取SDP然后自动连接,有时会造成免提连接不成功,如果去连接其音频流,连接成功,但之后从车载设备端连接手机无法连接成功。断开流媒体后,连接免提一直失败,必须重新配对才行。

  对于用户确认手动连接的手机和部分读取SDP然后自动连接车载设备的手机,在车载设备自动连接手机期间,可能会收到手机的连接请求,如果连接请求的手机与自动连接的手机为同一设备(地址相同),则接收该连接请求,否则会造成自动连接失败。同时由于车载设备支持SPP的dev A,PDA手机的dev A可能会在配对后自动连接车载设备的SPP dev A,这时要拒绝该连接,如果不对该连接请求进行处理,会造成PDA手机处于长时间无法响应的状态。

  蓝牙技术是个开放性的协议,它借鉴了很多成熟的已经得到广泛应用的协议,比如Syncml

  引入协议带来的兼容性

,封装在蓝牙OBEX协议上可以实现个人信息的同步更新,比如vCard,它和PBAP、OPP协议结合,用来进行电话本条目和呼叫日志的封装、下载和解析,这些协议本身便存在一定的兼容性问题,需要深入研究引入的协议,并尽量多地测试更多手机以尽量完善应用程序。下面以vCard的解析为例来说明该兼容性问题的解决方法。

  vCard是电子名片规范,定义了个人信息数据的存储格式及访问接口的规范,现在广泛应用的是v2.1版本和3.0版本,对于电话本条目和呼叫日志而言,关键信息为姓名、电话号码及呼叫时间。含有多个电话号码的电话本条目,我们将之定义为VCARD,其电话号码包含家庭电话、工作电话、手机、车载电话四种属性。

  vCard样例如下:

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-
      PRINTABLE;:=9A=6C=5E=FA=8F=89
TEL;CELL:13475909642
TEL;WORK:053182605413
END:VCARD
以上的vCard样例中,人名字段提取为“马建辉”的UTF-8字符0x9A6C 0x5EFA 0x8F89,这部分的兼容性在于不同手机在封装电话本条目的人名字段时所使用的字符集和编码方式不一致,字符集有ASCII和UTF-8,编码方式有8BIT、QUOTED-PRINTABLEPRINTABLE、BASE64这么几种方式,需要对这几种方式分别处理,比如以上vCard人名字段的处理需要把=9A=6C=5E=FA=8F=89转换为0x9A6C 0x5EFA 0x8F89,处理代码如下所示,temp_name数组为未处理的人名字符串,处理好的人名放在NAME数组中:
if(temp_name[i]=='=')
 {
        if((temp_name[i+1]>=0x41)&&(temp_name[i+1]<=0x46))
 temp1=temp_name[i+1]-0x37;
         else if((temp_name[i+1]>=0x30)&&(temp_name[i+1]<=0x39))
 temp1=temp_name[i+1]-0x30;
         if((temp_name[i+2]>=0x41)&&(temp_name[i+2]<=0x46))
 temp2=temp_name[i+2]-0x37;
         else if((temp_name[i+2]>=0x30)&&(temp_name[i+2]<=0x39))
 temp2=temp_name[i+2]-0x30;
      
         NAME[name_len]=(temp1<<4)+temp2;
         name_len++; 
          i+=3;   
 }

  另外还需要考虑一些特殊情况,如Sony Erricson 手机电话本条目的人名字段有时会把空格处理为0xE38080,所以如果提取出0xE38080,需要把该特殊字符以空格0x20代替,否则会处理为乱码。



关键词: 汽车电子 蓝牙

评论


相关推荐

技术专区

关闭