蓝牙无线连接可靠性的研究与实现
在蓝牙采用的ARQ方案中,蓝牙的DM、DH和DV分组的数据段可以进行传输或重发,直到收端返回成功接收确认信息(或超时)为止。该确认信息包含在返回分组头里,即捎带( Piggy backing) 。为了确定有效载荷正确与否,循环冗余校验码应该加载于有效载荷中。ARQ方案只工作在分组的有效载荷上(仅针对具有CRC的有效载荷)。分组头和话音有效载荷不受ARQ 保护。
蓝牙使用快速、无编号确认方案。为了应答前次接收分组,应返回ACK (ARQN=1)或NAK (ARQN=0)。在返回分组的分组头里,生成ACK / NACK 域,同时,接收分组的分组头中的ACK / NACK域可表明前面的负载是否正确接收,决定是否需要重发或发送下一个分组。从单元将在主-从时隙后紧跟在从-主时隙中进行应答。主单元则将在下一个事件中应答,该事件将给出同一从单元地址。由于处理时间短,当分组接收时,解码选择在空闲时间进行,并要简化FEC编码结构,以加快处理速度。快速ARQ方案与停止等待ARQ方案相似,但时延最小,实际上没有由ARQ方案引起的附加时延。该结构比退后n帧ARQ更有效,并与选择重传ARQ 效率相同,但由于只有失效的分组被重发,可减少开销。
在快速ARQ方案中,收方为了辨别是重复帧还是新帧(即过滤重传数据),头部将附加SEQN位。通常,每次新的CRC数据有效载荷传输,SEQN位将交替变化。而在重传中,SEQN位不发生变化。这样,通过辨认SEQN位是否发生变化,收方即可辨别出是重复帧还是新帧。
3.2 蓝牙基带协议中的错误校验
在蓝牙无线连接中,至少应该对HEC进行分组头校验。另外,必要时其有效载荷也必须进行CRC校验。使用分组头HEC信息和有效载荷中的CRC信息,可以检测分组错误和传输错误。
3.2.1 分组头HEC检测
为了检测蓝牙分组头,每个分组头的最高8位定义为HEC ( Header-Error-Check,头部错误检测)信息。HEC由多项式647(八进制数)生成,在生成HEC之前,HEC生成器用一个8 位值来初始化。在初始化后,对分组头的其它10位进行计算,得到8位的HEC值。另外,在接收方校验HEC之前,也必须先进行适当的初始化。在接收分组时,首先校验的是访问码,由于在信道访问码中的64位同步字来源于24位主单元的低地址部分(LAP),这样就可以校验LAP是否正确,并可以防止接收方接收来自其它匹克网的分组。
3.2.2 有效载荷的CRC校验
CRC校验即循环冗余码校验,是一种常用的检错编码,而且已经有相应的国际标准,如CRC-CCITT。在蓝牙无线连接中,发送方按照国际标准CRC-CCITT ,即g (D) = ( D + 1 ) ( D7 +D4+D3+D2+D+1),并用线性反馈移位寄存器LFSR硬件电路生成有效载荷(数据信息)的CRC校验码,附加在数据信息后面构成完整的数据帧,由接收方在接收时检查。若出错,返回NAK,发送方收到NAK 后重发该数据帧。
3.3 蓝牙基带协议中的其它可靠性措施
3.3.1 教据加噪
所有的分组头和载荷信息在发送前都要利用数据加噪字进行加噪处理。这主要是为了避免在传输过程中出现过长的连续0或1的位流模式。基带处理器需要从接收到的模拟数据信号中判断数据是0还是1,但过长的连续0或1位流会造成问题。因为在接收到的模拟数据信号中并不存在象直流信号中那样的参考点,因此必须依靠接收到的最后几个传输信号进行校正。任何连续的0或1的长序列位流串都可能导致校正失败。因此需要采用数据加噪技术对信号进行扰码处理,以大大降低出现长序列0或1位流串的可能性。
在蓝牙无线连接的发送方,这种加噪过程先于FEC编码完成。在接收端,接收数据使用相同的数据加噪字进行还原处理,该还原处理在FEC解码后完成。
3.3.2 链路监测
在无线连接中,有很多原因能够引起连接中断,比如,设备关闭、设备移出了蓝牙通信范围。而且在连接中断发生时,通常不会有任何提前报警,所以,在蓝牙主、从单元两端对链路进行监测是非常必要的。
为此,在蓝牙主、从单元均使用链路监测定时器。一旦收到经过HEC校验的分组和正确的蓝牙活动成员地址(AMADDR),定时器就复位。如果在连接状态的任何时刻,定时器达到阈值(该阈值可协商),则连接复位。SCO和ACL 连接使用同一阈值。这样,就能够在蓝牙主、从单元两端对链路进行监测了。
4 蓝牙链路管理层(LM)中的可靠性措施
类似地,在蓝牙链路管理层(LM )中,也定义有保证可靠的无线连接的措施。
在蓝牙接收和发送设备的链路管理层之间是通过协议数据单元(PDU)来相互通信的。PDU 由操作码、事件ID和内容参数组成,其中,7 位操作码用来标识不同类型的PDU。
如果链路管理器收到不能识别操作码的PDU,就用LMP no accepted协议数据单元(PDU)应答,并且LMP no accepted PDU中含有原因码unknown LMP PDU。而且返回的操作码参数同样也是不能够识别的操作码。如果链路管理器收到含有无效参数的PDU,就用LMP no accepted