基带
基带就是蓝牙的物理层,它负责管理物理信道和链路中除了错误纠正、数据处理、调频选择和蓝牙安全之外的所有业务。基带在蓝牙协议栈中位于蓝牙无线电之上,基本上起链路控制和链路管理的作用,比如承载链路连接和功率控制这类链路级路由等。基带还管理异步和同步链路、处理数据包、寻呼、查询接入和查询蓝牙设备等。基带收发器采用时分复用TDD方案(交替发送和接收),因此除了不同的跳频之外(频分),时间都被划分为时隙。在正常的连接模式下,主单元会总是以偶数时隙启动,而从单元则总是从奇数时隙启动(尽管他们可以不考虑时隙的序数而持续传输)。
ACL和SCO链路
基带可以处理两种类型的链路:SCO(同步连接)和ACL(异步无连接)链路。SCO链路是微微网中单一主单元和单一从单元之间的一种点对点对称的链路。主单元采用按照规定间隔预留时隙(电路交换类型)的方式可以维护SCO链路。SCO链路携带语音信息。主单元可以支持多达三条并发SCO链路,而从单元则可以支持两条或者三条SCO链路。SCO数据包永不重传。SCO数据包用于64 kB/s语音传输。
ACL链路是微微网内主单元和全部从单元之间点对多点链路。在没有为SCO链路预留时隙的情况下,主单元可以对任意从单元在每时隙的基础上建立ACL链路,其中也包括了从单元已经使用某条SCO链路的情况(分组交换类型)。只能存在一条ACL链路。对大多数ACL数据包来说都可以应用数据包重传。
逻辑信道
蓝牙有五种逻辑信道,他们可以用来传输不同类型的信息。LC(控制信道)和LM(链路管理)信道用于链路层,而UA、UI和US信道则用于携带异步、类异步和同步用户信息。
蓝牙编址
蓝牙有4种基本类型的设备地址:
BD_ADDR | 48位长的蓝牙设备地址(IEEE802标准)。该地址划分为LAP(24位地址低端部分)、UAP(8位地址高端部分)和NAP(16位无意义地址部分)。 |
AM_ADDR | 3位长的活动成员地址。所有的0信息AM_ADDR都用于广播消息。 |
PM_ADDR | 8位长的成员地址,分配给处于暂停状态的从单元使用。 |
AR_ADDR | 访问请求地址(access request address)被暂停状态的从单元用来确定访问窗口内从单元—主单元半时隙,通过它发送访问消息。 |
24 | 8 | 16 |
LAP | UAP | NAP |
蓝牙数据包
微微网信道内的数据都是通过数据包传输的。通常的数据包格式如下所示:
标准的蓝牙数据包 |
ACCESS CODE [72] | HEADER [54] | PAYLOAD [0-2745] |
* 单位:位 |
访问码(Access code)用于时序同步、偏移补偿、寻呼和查询。访问码分为三类:信道访问码CAC(Channel Access Code)、设备访问码DAC(Device Access Code)和查询访问码IAC(Inquiry Access Code)。信道访问码标识微微网(对微微网唯一),而DAC则用于寻呼及其响应。IAC用于查询。数据包报头包含了数据包确认、乱序数据包重排的数据包编号、流控、从单元地址和报头错误检查等信息。数据包的数据部分(payload)可以包含语音字段、数据字段或者两者皆有。数据包可以占据一个以上的时隙(多时隙数据包),而且可以在下一个时隙中持续传输。数据部分还可以携带一个16位长的CRC码用于数据错误检测和错误纠正。SCO数据包则不包括CRC。
有5种普通类型数据包、4种SCO数据包和7种ACL数据包。其简要说明请见下表。更详细的信息请单击 更多..
蓝牙数据包类型 |
类型 | 名称 | 说明 |
Common | ID | 携带设备访问码(DAC)或者查询访问码(IAC)。占据一个时隙。 |
Common | NULL | NULL数据包没有数据,用于获得链路信息和流控。占据一个时隙,无确认。 |
Common | POLL | 无数据和确认。主单元用它检查从单元是否启动。占据一个时隙。 |
Common | FHS | 表明蓝牙设备地址和发送方时钟的特殊控制数据包。用于寻呼主单元响应、查询响应和跳频同步。占据一个时隙。2/3 FEC编码。 |
Common | DM1 | 支持任何链路中的控制消息。还可以携带规则用户数据,占据一个时隙。 |
SCO | HV1 | 携带10个信息字节。通常用作语音传输。1/3 FEC编码。占据一个时隙。 |
SCO | HV2 | 携带20个消息字节。通常用作语音传输。2/3 FEC编码。占据一个时隙。 |
SCO | HV3 | 携带30个信息字节。通常用作语音传输。无FEC编码。占据一个时隙。 |
SCO | DV | 数据-语音组合数据包。语音字段没有FEC保护。数据字段采用2.3 FEC编码。语音字段从不重传,数据字段可以重传。 |
ACL | DM1 | 携带18个消息字节。2/3 FEC编码。占据一个时隙。 |
ACL | DH1 | 携带28个信息字节。无FEC编码。占据一个时隙。 |
ACL | DM3 | 携带123个信息字节。2/3 FEC编码。占据3个时隙。 |
ACL | DH3 | 携带185个信息字节。无FEC编码。占据3个时隙。 |
ACL | DM5 | 携带226个信息字节。2/3 FEC编码。占据5个时隙。 |
ACL | DH5 | 携带341个信息字节。无FEC编码。占据5个时隙。 |
ACL | AUX1 | 携带30个信息字节。类似DH1但没有CRC代码。占据1个时隙。 |
纠错
纠错方式有三种:1/3 速率FEC、2/3速率FEC和ARQ。采用1/3速率FEC则每个位被重复三遍作为冗余;2/3方式则采用一个生成多项式把10位代码编码为15位代码。ARQ方式下,数据包被重传,直到最终收到确认(或者超时)。蓝牙使用快速的不编号确认,通过设置适当的ARQN值来使用正确认和负确认。如果传输超时,蓝牙丢弃数据包并处理下一个数据包。
蓝牙控制器
流控和同步
蓝牙建议在ACL和SCO链路中采用先入先出(FIFO)队列处理数据包的收发。链路管理器(Link Manager)填充这些队列,链路控制器负责自动清空队列。
![]() |
如果这些RX FIFO 队列全满,流控就会避免丢弃数据包和防止阻塞。如果数据没有收到,STOP表示符即被接收方的链路控制器插入到返回数据包的报头中被传送。当发送方收到STOP表示符,它就冻结其FIFO队列。如果接收方准备完毕即可发送GO数据包从而再次恢复数据流传输。
我们已经知道,蓝牙收发器采用时分复用(TDD)技术方案。这意味着它可以采用同步方式实现交替地传送和接收操作。主单元数据包传输的平均时间相对于理想的625毫秒时隙必定不会快于20 ppm。平均延迟时间应当小于1毫秒。微微网由主单元的系统时钟同步。主单元的蓝牙设备地址(BD_ADDR)决定了跳频序列和信道访问码;主单元的系统时钟确定跳频序列的相位。主单元通过查询方式控制信道上的流量。在微微网存在期间主单元从不调节其系统时钟。从单元为了匹配主单元时钟则采用时序偏移以适应其内部时钟。蓝牙时钟应该达到312.5微秒的精度。
为了让接收方的访问相关器可以搜索到正确的信道访问码并和发送方保持同步,精确接收时间允许有一个20微秒的不确定窗口。当从单元从保持状态返回时,它即可和更大的不确定窗口发生相关直到从单元不再与时隙交迭。暂停的从单元周期性地唤醒以侦听来自主单元的信号并重新同步自身的时钟偏移。
控制器状态
蓝牙控制器主要运行在以下两个状态:待命(Standby) 和 连接(Connection)。微微网内总共有7种子状态可用于增加从单元或者实现连接。这些状态是寻呼(page)、寻呼扫描(page scan)、查询(inquiry)、查询扫描(inquiry scan)、主单元响应(master response)、从单元响应(slave response)和查询响应(inquiry response)。
![]() |
待命状态是蓝牙单元的默认低功耗状态。这种状态下只有设备的自身时钟在运行而且不存在同任何其他设备之间的交互。在连接状态,主单元和从单元可以采用信道(主单元)访问码和主单元蓝牙时钟交换数据包。所采用的跳频方式是信道跳频方案。
正常情况下,两台蓝牙设备之间的连接是如下进行的。首先,主单元使用GIAC和DIAC查询一定范围内(查询子状态)的蓝牙设备。如果附近的蓝牙设备正在侦听这些查询(查询扫描子状态),它就会通过发送自己的地址和时钟信息(FHS数据包)给主单元(查询响应子状态)来响应主单元。发送这些信息之后,从单元就开始侦听来自主单元的寻呼消息(寻呼扫描)。主单元在发现范围内的蓝牙设备之后可以寻呼这些设备(寻呼子状态)以建立连接。处于寻呼扫描状态的从单元如果被该主单元寻呼到,则从单元可以立即用自己的设备访问码(DAC)作为响应(从单元响应子状态)。主单元接收到来自从单元的响应之后即可传送主单元的实时时钟、BD_ADDR、BCH奇偶位以及设备类别(FHS 数据包)作为响应。从单元收到该FHS数据包后,主单元和从单元即进入连接状态。
![]() |
下面我们简要说明一下以上的各个状态:
寻呼(Page) | 该子状态被主单元用来激活和连接从单元。主单元通过在不同的跳频信道内传送从单元的设备访问码(DAC)来发出寻呼消息。 |
寻呼扫描(Page scan) | 在该子状态下,从单元在一个窗口扫描存活期内侦听自己的设备访问码(DAC)。在该扫描窗口内从单元以单一跳频侦听(源自其寻呼跳频序列)。 |
从单元响应(Slave response) | 从单元在该子状态下响应其主单元的寻呼消息。如果处于寻呼扫描子状态下的从单元和主单元寻呼消息相关即进入该状态。从单元接收到来自主单元的FHS数据包之后即进入连接状态。 |
主单元响应(Master response) | 主单元在收到从单元对其寻呼消息的响应之后即进到该子状态。如果从单元回复主单元则主单元发送FHS数据包给从单元,然后主单元进入连接状态。 |
查询(Inquiry) | 查询用于发现相邻蓝牙设备的身份。发现单元收集蓝牙设备地址和所有响应查询消息的单元的时钟。 |
查询扫描(Inquiry scan) | 在该状态下,蓝牙设备侦听来自其他设备的查询。此时扫描设备可以侦听一般查询访问码(GIAC)或者专用查询访问码(DIAC)。 |
查询响应(Inquiry response) | 对查询而言,只有从单元才可以响应而主单元则不能。从单元用FHS数据包响应,该数据包包含了从单元的设备访问码、内部时钟和某些其他从单元信息。 |
连接状态
连接(Connection)状态开始于主单元发送POLL数据包,通过这个数据包主单元即可检查从单元是否已经交换到了主单元的时序和跳频信道。从单元即可以任何类型的数据包响应。
连接状态的蓝牙设备可以处于以下4种状态之下:活动(Active)、保持(Hold)、呼吸(Sniff)和暂停(Park)模式。蓝牙技术中一个显著的技术难点就是如何实现这些状态之间的迁移,特别是从暂停到活动(或者反之)更是相当有难度。这些模式在以下简要说明:
活动(Active) | 该模式下,主单元和从单元通过侦听、发送或者接收数据包而主动参与信道操作。主单元和从单元相互保持同步。 |
呼吸(Sniff) | 该模式下,为了获得主单元发送给自己的消息而侦听每个时隙的从单元在指定的时隙上嗅探。结果从单元可以在空时隙睡眠而节约功率。 |
保持(Hold) | 该模式下,某台设备可以临时不支持ACL数据包并进入低功耗睡眠模式,从而为寻呼、扫描等操作提供可用信道。 |
暂停(Park) | 当某台从单元无需使用微微网信道却又打算维持和信道的同步时,它可以进入暂停模式,这种模式是一种低功耗模式,几乎没有任何活动。设备被赋予一个暂停成员地址(Parking Member Address:PM_ADDR)并失去其活动成员地址(Active Member Address:AM_ADDR)。 |
蓝牙安全
蓝牙安全是很重要的一个课题。在链路层,安全通过对方认证和信息加密而得到维护。出于基本安全的目的,我们需要为每台设备采用唯一的公共地址(BD_ADDR)、两个密钥(认证密钥和加密密钥)和随机数生成器。首先,某台设备通过发出一个质询进行认证,其他设备随后必须根据这个质询、其BD_ADDR、两者分享的链路密钥发送针对该质询的响应。认证之后,通信即可使用加密。
链路密钥的类型分成4种:联合(combination)密钥、单元(unit)密钥、临时(temporary)密钥和初始(initialization)密钥。