这些年,我们见证了太多手机厂商下场造汽车,这是智能手机流量见顶之后,资本在智能电动汽车新风口的再次狂欢。但近一年来,吉利、蔚来等汽车厂商开始下场造手机,有点“活久见”的意味。

这个点,这个身份造手机,指定不是奔着颠覆手机市场格局的目的而来,指定不是奔着挑战“雷布斯”的个人魅力而来。从蔚来李斌的话中我们或许可以明白一二:“手机现在是蔚来最重要的连接车的设备,一半以上的用户使用苹果手机。但是苹果现在对汽车很封闭,比如蔚来第二代平台的车标配UWB,苹果又不开放接口,搞得我们很被动”。

“打造以智能电动汽车为中心的万物互联生态,提供更好的用户体验”,这似乎才是汽车厂商造手机的主要目的。而支撑这一伟大愿景的便是底层互连技术,包括NFC、低功耗蓝牙、UWB等。基于这几种技术的数字钥匙原理前文已经介绍过。本系列剥去功能外衣,还原底层连接的一些技术细节。

第一篇毫无意外的拿熟悉而又陌生的低功耗蓝牙底层连接技术开刀。

一、体系结构

低功耗蓝牙的系统体系结构如图1所示。

蓝牙第一次使用(一次枯燥但不无聊的)(1)

图1 低功耗蓝牙体系结构

二、物理层

调制:蓝牙物理层采用的是2.4GHz的无线电波,用的是高斯频移键控(GFSK)的调制方式改变无线电波的频率,传输0或者1的信息。频移键控是指把1和0通过轻微升高或者降低信号的频率进行编码,如下方图2所示。从中心频率出发,超过185KHz的负方向偏移代表的数值为0,超过185KHz的正方向偏移代表的数值为1。也就是说如果选用2402MHz的信道发送数据,则2401.815MHz为比特0,2402.185MHz为比特1,如下方图3所示。

蓝牙第一次使用(一次枯燥但不无聊的)(2)

图2 频移键控

蓝牙第一次使用(一次枯燥但不无聊的)(3)

图3 调制

信道:低功耗蓝牙最低频率为2402MHz,最高频率为2480MHz。该频段正好被划分为40个信道,每个信道的宽度为2MHz,如图4所示。

蓝牙第一次使用(一次枯燥但不无聊的)(4)

图4 无线信道

其中有3个广播信道和37个数据信道,广播类型的报文只能在广播信道发送,数据类型的报文只能在数据信道发送。为了远离诸如WIFI接入点的严重干扰,这3个广播信道分布在无线信道的不同区域。

容限:设备制造时都会有一个容限值,对于蓝牙系统,容限值一般通过频率的精度进行确认。一般认为低功耗蓝牙的中心频率的容限值在±150KHz。那为什么该值会偏高呢,原因在于蓝牙的时钟一般选择16或者32MHz的晶振,要想获得2400MHz的频率就要倍频150倍,晶振本身或者晶振的电路有一点偏差都会使得中心频率放大。举个例子,如果晶振的实际频率为16.0001MHz,则中心频率将偏离理想频率150KHz。我们称这个晶振的误差为62ppm,通常我们常用的晶振的误差会在50ppm以下。

通讯距离:蓝牙有一个很重要的指标就是通讯距离,无线通讯的通讯距离一般会通过理想模型进行计算,发射端用发射功率来表示,接收端用接收灵敏度表示。在理想的模型中我们忽略天线、匹配电路的增益和损耗。对于全向天线路径损耗的公式为:path loss = 40 25log(d)

其中path loss表示路径损耗,d表示发射机和接收机的距离。

低功耗蓝牙要求的最低接收灵敏度为-70dBm,发射功率最低为-20dBm,对于这样的蓝牙系统,允许的路径损耗则为50dB,从下表中对应的通讯距离为2.5m。

同理蓝牙系统中最大发射功率为10dBm,如果此时的接收灵敏度为-90dBm,对于这个蓝牙系统,允许的路径损耗则为100dB,从下表中对应的通讯距离为250m。

所以我们常常听说蓝牙的通讯距离可以达到百米以上,理论上是可行的。

蓝牙第一次使用(一次枯燥但不无聊的)(5)

图5 路径损耗与距离表格

三、链路层

链路层的状态机定义了5种工作状态,分别为就绪态、广播态、扫描态、连接态、发起态,如下图6所示。

蓝牙第一次使用(一次枯燥但不无聊的)(6)

图6 链路层状态机

从图6可以看出链路层的状态机在任一时刻只能处于上述5种状态中的一种,所以当车上的蓝牙节点即当主设备执行扫描功能又当从设备执行广播功能时,这需要主设备不断的切换链路层的状态机,扫描和广播的频率决定了功耗的大小以及性能的优劣。扫描和广播的频率高了,功耗会增加,那从发现和到蓝牙系统建立连接的时间就会短,性能提升;反之亦然。

链路层的状态机不但解释了设备间是如何发现以及建立连接,也解释了低功耗蓝牙的另一个基本的设计策略:将广播、发现和连接过程与连接中的数据传输分离开来。

链路层的状态机跳转严格遵循图6固定的流程,链路层还有一个原则就是不能同时执行主设备和从设备两个角色。

就绪态:一般情况下蓝牙初始化后会处于就绪态,在就绪态,链路层不收发报文,从就绪态可进入广播态、扫描态或者发起态。

广播态:广播态只能由就绪态进入,此时可以发送广播的报文,同时也可以监听该广播报文触发的扫描SCAN_REQ报文,并可发送扫描SCAN_RSP报文,以回应主动扫描的设备。

扫描态:扫描态分为主动扫描和被动扫描。主动扫描可以发送扫描请求给广播态的设备,并获取附加的扫描响应数据,被动扫描仅仅接收广播报。所以在车内的蓝牙系统中,各个从节点只能获取手机的RSSI值。从节点唤醒后可以一直处在被动扫描态,一直获取手机广播的RSSI值。

发起态:为了发起连接,链路层需要处于发起态,如果处于发起态的发起者收到来自其侦听设备的广播报文,则链路层会向其发起连接请求。

连接态:连接态可从广播态或者连接态进入,由广播态进入的为从设备,由发起态进入的为主设备。主设备必须定期的向从设备发送报文,从设备只有收到主设备的一个报文后才能发送一个自己的报文。

四、连接过程

蓝牙第一次使用(一次枯燥但不无聊的)(7)

图7 蓝牙连接

广播:从设备的广播事件可以分为不同的类型,分别是可链接无向事件(ADV_IND)、可链接定向事件(ADV_DERECT_IND)、不可链接事件(ADV_NONCONN_IND和可扫描无向事件(ADV_SCAN_IND)。在这里我们主要用到的是可链接无向事件广播类型,该事件指的是扫描者设备和发起者设备允许可以向广播者设备发送广播包。

下图是一个完整的无扫描响应的广播包事件,一个事件包含3个广播包,在发送完一个ADV_IND广播包后,广播者会在相同的信道监听SCAN_REQ和CONNECT_REQ数据包,如果该信道没有收到这些数据,则会转向另一个信道发送广播包,以此类推直到事件结束。其中一个广播事件中两个广播包的间隔时间应该小于或者等于10ms。

蓝牙第一次使用(一次枯燥但不无聊的)(8)

图8 无扫描响应的广播包事件

广播信道使用规定好的3个信道,广播类型又分为连续广播方案和非连续广播方案,在车上应用的广播类型一般为非连续广播方案。一次完整的非连续广播事件的时间间隔由两个参数决定,分别为advInterval和advDelay。其中advInterval是用来表征两个连续的广播事件的开始时间间隔,这个数值是必须是0.625ms的整数倍,在20ms~10.24s之间。advDelay是一个随机值,在0~10ms之间,由广播者自己给出。advDelay加上advInterval的值就定义了连续两个广播事件的间隔时间。

扫描:ADV_IND广播包有链接响应才可建立主从设备间的连接。在蓝牙系统建立连接的流程中,广播包的发送属于第一步,扫描属于第二步。

扫描是在一定的范围内用来发现其他低功耗蓝牙的广播过程。主设备一般情况下处在主动扫描状态,主设备在扫描过程中使用的是也是广播信道,但和广播过程不一样,扫描过程没有严格的时间定时以及信道选择,由主机设置扫描定时参数(scanInterval、scanWindow)。两个连续的扫描时间窗口的开始时间间隔称为scanInterval,一个扫描事件持续的时间称为scanWindow。scanInterval和scanWindow的数值必须为0.625ms的整数倍,范围是2.5ms~10.24s之间,另外scanWindow的数值总是小于或者等于scanInterval的数值。下图是广播到扫描的过程。

蓝牙第一次使用(一次枯燥但不无聊的)(9)

图9 扫描响应事件

在这个过程中引入一个帧间隔(IFS)的概念,指的是在包交换序列中,两个连续包之间的时间间隔。

指的是从上一个包结束到下一个包开始的时间,称为T_ IFS,这个值为150us。当主设备收到广播包,在150us之后主设备会发送SCAN_REQ给从设备请求更多的信息量,当从设备收到SCAN_REQ,在150us之后会响应SCAN_RSP给主设备。

连接:当主设备收到SCAN_RSP的广播报文后,主设备会主动发起连接请求(CONNECT_REQ),此时还是用的广播信道,当发送完CONNECT_REQ后,主设备将移动到数据信道进行通讯。

CONNECT_REQ的数据包中会包含访问地址、窗大小、窗漂移、延迟、超时、信道分布、信道跳跃长度、连接时间间隔和CRC的初始值。当主设备发送CONNECT_REQ后,主设备即认为自身已经有了连接,该连接已经创建(created),但是还不能完全确立(established)。只有收到数据包确认后,才能视为正式确立。

蓝牙第一次使用(一次枯燥但不无聊的)(10)

图10 连接事件

链路层的连接由3个参数确认,分别为连接事件时间间隔(connInterval)、从设备潜伏期(connSlaveLatency)和连接监督的暂停事件(connTimeout)。

连接事件时间间隔(connInterval):指的是两个连续的连接事件的开始点之间的时间间隔。这个值可以是7.5ms~4s之间的任意值,但是必须是1.25ms的整数倍。这个相当于在连接过程中,包的周期最快可以是7.5ms,最慢可以是4s。

从设备潜伏期(connSlaveLatency):在不对称的链路层连接时,定义这个参数意味着从设备可以忽略多少个连接的事件。如果connSlaveLatency=0,意味着从设备必须每次都要响应主设备的连接事件;如果connSlaveLatency=5,意味着从设备可以忽略前面5次的连接事件。

连接监督的暂停事件(connTimeout):主设备和从设备会使用一个连接监督计时器(TLLconnSupervision),当链路层的连接完成时,连接监督计时器(TLLconnSupervision)会和连接监督的暂停事件(connTimeout)做比较,只有收到有效的数据信道的报文,计时器才会清零,当计时器达到connTimeout时,则认为连接丢失。

举个例子,如果连接事件时间间隔(connInterval)=10ms,设备潜伏期(connSlaveLatency)=5,那从设备可以忽略前面5个连接事件,也就是在第6个连接事件才开始侦听,前面的50ms从设备可以一直处于睡眠状态,到第60ms时才开始侦听主设备的报文。连接监督的暂停事件(connTimeout)必须大于60ms才行,不然会使得连接丢失。

配对与认证:主从设备在进行配对和认证时,连接其实已经确认,认证过程实际上和车端经常用到的认证过程没有本质区别,只是数据流的载体不一样。一般情况下采用AES128的认证算法就可以。主从设备在进行配对和认证时,因为连接已经确认,在握手后的信道进行数据的通讯就可以。

链路层的报文格式如下所示,主从设备根据报文结构交换认证数据就可以。

蓝牙第一次使用(一次枯燥但不无聊的)(11)

图11 报文结构

从上图可以看出一包报文中有效的数据长度为27个BYTE,这里要注意如果报文需要进行加密,则需要包含4个字节MIC。

五、小结

底层枯燥的原理撑起个个活泼灵动的功能,期望通过本文的介绍,可以给即将或者正在开发蓝牙系统的工程师带来些许帮助,为蓝牙钥匙在车端的普及添砖加瓦。

,