蓝牙协议学习整理(一)蓝牙的概述
传送门:
(一)蓝牙的概述
(二)蓝牙协议规范(射频、基带链路控制、链路管理)
(三)蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
(四)蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)
引用自xubin的博客
第一章 蓝牙的概述
一、蓝牙版本信息
蓝牙共有六个版本1.1/1.2/2.0/2.1/3.0/4.0
1、1.1版本
传输率约在748~810kb/s,因是早期设计,容易受到同频率之产品所干扰下影响通讯质量。
2、1.2版本
同样是只有748~810kb/s 的传输率,但在加上了(改善 Software)抗干扰跳频功能。
3、2.0+EDR版本
是1.2的改良提升版,传输率约在1.8M/s~2.1M/s,开始支持双工模式——即一面作语音通讯,同时亦可以传输档案/高质素图片,2.0 版本当然也支持 Stereo 运作。
应用最为广泛的是Bluetooth2.0+EDR标准,该标准在2004年已经推出,支持Bluetooth 2.0+EDR标准的产品也于2006年大量出现。虽然Bluetooth 2.0+EDR标准在技术上作了大量的改进,但从1.X标准延续下来的配置流程复杂和设备功耗较大的问题依然存在。
4、2.1版本
更佳的省电效果:蓝牙2.1版加入了SniffSubrating的功能,透过设定在2个装置之间互相确认讯号的发送间隔来达到节省功耗的目的。
5、3.0+HS版本
2009年4月21日,蓝牙技术联盟(Bluetooth SIG)正式颁布了新一代标准规范”Bluetooth Core Specification Version 3.0 High Speed”(蓝牙核心规范3.0版 ),蓝牙3.0的核心是”GenericAlternate MAC/PHY”(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。最初被期望用于新规范的技术包括802.11以及UMB,但是新规范中取消了UMB的应用。
6、4.0 版本
蓝牙4.0包括三个子规范,即传统蓝牙技术、高速蓝牙和新的蓝牙低功耗技术。蓝牙 4.0的改进之处主要体现在三个方面,电池续航时间、节能和设备种类上。拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多特色此外,蓝牙4.0的有效传输距离也有所提升。3.0版本的蓝牙的有效传输距离为10米(约 32英尺),而蓝牙4.0的有效传输距离最高可达到100米(约328英尺)。
7、典型蓝牙与BLE蓝牙对比
二、蓝牙的技术特点
简单地说,蓝牙是一种短程宽带无线电技术,是实现语音和数据无线传输的全球开放性标准。它使用跳频扩谱(FHSS)、时分多址(TDMA)、码分多址(CDMA)等先进技术,在小范围内建立多种通信与信息系统之间的信息传输。
1、Bluetooth的主要技术特点:
(1)、工作频段 :2.4GHz的工科医(ISM)频段,无需申请许可证。大多数国家使用79个频点,载频为(2402+k)MHz(k=0,1, 2…78),载频间隔1MHz。采用TDD时分双工方式。
(2)、传输速率:1Mb/s(V2.0以上版本)
(3)、调试方式:BT=0.5的GFSK调制,调制指数为0.28-0.35。
(4)、采用跳频技术:跳频速率为1600跳/秒,在建链时(包括寻呼和查询)提高为3200跳/秒。蓝牙通过快跳频和短分组技术减少同频干扰,保证传输的可靠性。
(5)、语音调制方式:连续可变斜率增量调制(CVSD,ContinuousVariable Slope Delta Modulation),抗衰落性强,即使误码率达到4%,话音质量也可接受。
(6)、支持电路交换和分组交换业务:蓝牙支持实时的同步定向联接(SCO链路)和非实时的异步不定向联接(ACL链路),前者主要传送语音等实时性强的信息,后者以数据包为主。语音和数据可以单独或同时传输。蓝牙支持一个异步数据通道,或三个并发的同步话音通道,或同时传送异步数据和同步话音的通道。每个话音通道支持64kbps的同步话音;异步通道支持723.2/57.6kbps的非对称双工通信或433.9kbps的对称全双工通信。
(7)、支持点对点及点对多点通信:蓝牙设备按特定方式可组成两种网络:微微网(Piconet)和分布式网络(Scatternet),其中微微网的建立由两台设备的连接开始,最多可由八台设备组成。在一个微微网中,只有一台为主设备(Master),其它均为从设备(Slave),不同的主从设备对可以采用不同的链接方式,在一次通信中,链接方式也可以任意改变。几个相互独立的微微网以特定方式链接在一起便构成了分布式网络。所有的蓝牙设备都是对等的,所以在蓝牙中没有基站的概念。
(8)、工作距离:蓝牙设备分为三个功率等级,分别是:100mW(20dBm)、2.5mW(4dBm)和1mW(0dBm),相应的有效工作范围为:100米、10米和1米。
三、Bluetooth的系统构成
1、无线射频单元(Radio):
负责数据和语音的发送和接收,特点是短距离、低功耗。蓝牙天线一般体积小、重量轻,属于微带天线。
2、基带或链路控制单元(LinkController):
进行射频信号与数字或语音信号的相互转化,实现基带协议和其它的底层连接规程。
3、链路管理单元(LinkManager):
负责管理蓝牙设备之间的通信,实现链路的建立、验证、链路配置等操作。
4、蓝牙软件协议实现:
如上图紫色部分,这个后面我们做详细说明。
四、蓝牙协议规范
传输协议、中介协议、应用协议;
1、传输协议
负责蓝牙设备间,互相确认对方的位置,以及建立和管理蓝牙设备间的物理链路;
- 底层传输协议:蓝牙射频(Radio)部分、基带链路管理控制器(Baseband&Link Controller)、链路管理协议(Link ManagerProtocol LMP)。负责语言、数据无线传输的物理实现以及蓝牙设备间的联网组网。
- 高层传输协议:逻辑链路控制与适配器(LogicalLink Control and Adaptation Protocol)L2CAP 、主机控制接口(HostControl Interface,HCI)。为高层应用屏蔽了跳频序列选择等底层传输操作,为高层程序提供有效、有利于实现数据分组格式。
2、中介协议
为高层应用协议或者程序,在蓝牙逻辑链路上工作提供必要的支持,为应用提供不同标准接口。
- 串口仿真协议:RFCOMM、服务发现协议:SDP、互操作协议IrDA、网络访问协议:PPP、IP、TCP、UDP、电话控制协议:TCS、AT指令集。
3、应用协议
蓝牙协议栈之上的应用软件和所涉及到的协议,如:拨号上网、语言功能的应用程序。
蓝牙的应用框架如下:
- 通用应用类框架:查询、建立连接服务等;
- 蓝牙电话应用类框架:电话控制、语言;
- 蓝牙连网应用类框架:网络应用相关;
- 对象交互服务类框架:IrDA、OBEX;
- 蓝牙音视频控制类框架。
五、硬件接口
一般蓝牙芯片通过UART、USB、SDIO、I2S、PcCard和主控芯片通信。如下图所示,通过UART和主控芯片通信。
第二章 蓝牙协议规范(射频、基带链路控制、链路管理)
蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系统互联(OSI)模型一样,蓝牙技术的协议体系也采用了分层结构,从底层到高层形成了蓝牙协议栈,各层协议定义了所完成的功能和使用数据分组格式,以保证蓝牙产品间的互操作性。
一、射频协议
射频位置如上图红色部分。
1、工作频率
蓝牙工作在2.4GHz ISM频段上,蓝牙采用跳频扩谱技术主动的避免工作频段受干扰(微波炉的工作频率也是2.4GHz)。
地理位置 ISM频段范围 射频信道频率
中国、美国、欧洲 2400.0~2483.5MHz F=(2402+k)MHz,k在0、1、……78中随机取值
法国 2446.5~2483.5MHz F=(2454+k)MHz,k在0、1、……22中随机取值
日本 2471.0~2497.0MHz F=(2473+k)MHz,k在0、1、……22中随机取值
西班牙 2445.0~2475.0MHz F=(2449+k)MHz,k在0、1、……22中随机取值
我国的蓝牙频率在2.402GHz~2.483GHz,蓝牙每个频道的宽度为1MHz,为了减少带外辐射的干扰,保留上、下保护为3.5MHz和2MHz,79个跳频点中至少75个伪随机码跳动,30S内任何一个频点使用时长不能超过0.4S。
2、跳频技术、发射功率、时隙
(1)、发射功率:蓝牙发射功率分三级:一级功率100mW(20dBm);二级功率2.5mW(4dBm);三级功率1mW(0dBm);
(2)、物理信道:蓝牙物理信道有伪随机序列控制的79个跳频点构成,不同跳频序列代表不同的信道。
(3)、时隙:蓝牙跳频速率为1600次/s,每个时间为625uS(1S/1600)称为一个时隙;
二、基带与链路控制协议
蓝牙发送数据时,基带部分将来自高层的数据进行信道编码,向下发给射频进行发送;接收数据时,将解调恢复空中数据并上传给基带,基带进行信道编码传送给上层。
作用:跳频选择、蓝牙编址、链路类型、信道编码、收发规则、信道控制、音频规范、安全设置。
1、蓝牙分组编码为小端模式;
2、蓝牙地址
**BD_ADDR:**BluetoothDevice Address;
**LAP:**LowerAddress Part 低地址部分;
UAP: UpperAddress Part 高地址部分;
NAP: Non-significantAddress Part 无效地址部分。
3、蓝牙时钟
每个蓝牙设备都有一个独立运行的内部系统时钟,称为本地时钟(Local Clock),决定定时器的收发跳频。为了与其他设备同步,本地时钟要加一个偏移量(offset),提供给其他设备同步。
蓝牙基带四个关键周期:312.5uS、625uS、1.25mS、1.28S。
CLKN:本地时钟:
CLKE:预计时钟,扫描寻呼过程中用到;
CLK:设备实际运行的时钟频率。
CLKE、CLK由CLKN加上一个偏移量得到的。
4、蓝牙物理链路:
通信设备间物理层的数据连接通道就是物理链路。
ACL(Asynchronous Connectionless)异步无连接链路;对时间要求不敏感的数据通信,如文件数据、控制信令等。
SCO(Synochronous Connection Oriented)同步面向连接链路;对时间比较敏感的通信,如:语音;最多只支持3条SCO链路,不支持重传。
ACL用于数据传输;
5、蓝牙基带分组:
基带分组至少包括:接入码、分组头、有效载荷;
1
(1)、接入码用于同步、直流、载频泄漏偏置补偿标识;
(2)、分组头包含链路信息,确保纠正较多的错误。
分组类型如下:
分组类别 Type(b3b2b1b0) 时隙 SCO ACL
链路控制分组 0000 1 NULL NULL
0001 POLL POLL
0010 FHS FHS
0011 DM1 DM1
单时隙分组 0100 1 未定义 NULL
0101 HV1
0110 HV2
0111 HV3
1000 DV
1001 NULL AUX1
3时隙分组 1010 3 未定义 DM3
1011 DH3
1100 未定义
1101
5时隙分组 1010 5 未定义 DM5
1111
ACL分组形式为:D(M|H)(1|3|5),D代表数据分组,M代表用2/3比例的FEC的中等速率分组;H代表不使用纠错码的高速率分组;1、3、5分别代表分组所占用的时隙数目;
DM1、DM3、DM5、DH1、DH3、DH5
SCO分组形式为:HV(1|2|3)。HV代表高质量语言分组,1、2、3有效载荷所采用的纠错码方法。1为1/3比例FEC,设备2个时隙发送一个单时隙分组;2为2/3比例FEC,设备4个时隙发送一个单时隙分组;3为不使用纠错码,设备6个时隙发送一个单时隙分组
HV1、HV2、HV3
ALC 分组:
类型 有效载荷头/字节 用户有效载荷/字节 FEC CRC 对称最大速率/kbps 非对称速率/kbps
前向 后向
DM1 1 0~17 2/3 有 108.8 108.8 108.8
DH1 1 0~27 无 有 172.8 172.8 172.8
DM3 2 0~121 2/3 有 258.1 387.2 54.4
DH3 2 0~183 无 有 390.4 585.6 86.4
DM5 2 0~224 2/3 有 286.7 477.8 36.3
MH5 2 0~339 无 有 433.9 723.2 57.6
AUX1 1 0~29 无 无 185.6 185.6 185.6
SCO分组:
类型 有效载荷头/字节 用户有效载荷/字节 FEC CRC 有效载荷长度 同步速率/kbps 占用Tsco数目/语言长度
HV1 无 10 1/3 240位 64 2/1.25ms
HV2 20 2/3 4/2.5ms
HV3 30 无 6/3.75ms
DV 1D 10+(0-9)D 2/3D 有D 64+57.6D
注释:D 只对数据段有用,DV分组包含数据段,也包含语言段。
1
(3)、有效载荷 分语言有效载荷、数据有效载荷。
6、蓝牙的逻辑信道
链路控制信道:LinkControl LC
链路管理信道:Link Manage LM
用户异步数据信道:User AsynchronizationUA
用户同步数据信道:UserSynchronization US
用户等时数据信道:UserIsochronous UI UI
7、蓝牙的收发规则
上图为RX缓存。
上图为TX缓存。
新分组到达时,ACL链路的RX缓存器要流量控制,SCO数据不需要流量控制;
8、蓝牙基带信道和网络控制
(1)、链路控制器状态:
待机、连接
寻呼page、寻呼扫描pagescan、查询inquiry、查询扫描inquiry scan、主设备相应Master Response、从设备相应Slave Response、查询相应inquiry response
(2) 、连接状态
激活模式active、呼吸模式sniff、保持模式hold、休眠模式park。
(3)、待机状态
待机状态是蓝牙设备缺省低功耗状态,此状态下本地时钟以低精度运行。蓝牙从待机转入寻呼扫描状态,对其他寻呼进行响应成为从设备;也可以从待机状态进入查询扫描状态,完成一个完整的寻呼,成为主设备。
9、接入过程
注释:
IAC Inquiry AccessCode 查询接入码;
GIAC:通用查询接入码 DIAC:专用查询接入码;
DAC:DeviceAccess Code 设备接入码;
LAP:
建立连接,必须使用查询、寻呼;查询过程使用IAC,发现覆盖区域内的设备、设备的地址及其时钟;连接过程使用DAC,建立连接的设备处理寻呼过程,成为主设备。
(1)、查询过程
蓝牙设备通过查询来发现通信范围内的其他蓝牙设备。查询信息分为GIAC、DIAC两种。查询发起设备收集所有相应设备的地址、时钟信息。
一设备进入查询状态去发现其他设备,查询状态下连续不断的在不同频点发送查询消息。查询的跳频序列有GIAC的LAP导出。
一设备想被其他设备发现,就要周期性进入 查询扫描状态,以便相应查询消息。如:我们选择设备多长时间可见,其实就是 进入查询扫描状态。
A、查询扫描
查询扫描状态下,接收设备扫描接入码的时间长度,足以完成对16个频率的扫描。扫描区间长度Twindow inquiry scan。扫描在同一个频率上进行,查询过程用32跳专用查询跳频序列,此序列有通用查询的地址决定,相位有本地时钟决定,每隔1.28S变化一次。
B、查询
与寻呼类似,TX用查询跳频序列、RX用查询相应跳频序列。
C、查询相应
从设备响应查询操作。每个设备都有自己的时钟,使用查询序列相位相同的几率比较小。为了避免多个设备在同一查询跳频信道同时激活,从设备查询响应规定:从设备收到查询消息,产生0-1023只觉得额一个随机数,锁定当时相位输入值进行跳频选择,从设备此后的RAND时隙中返回到连接或者待机状态。
(2)、寻呼扫描
DAC:DeviceAccess Code 设备接入码
寻呼扫描状态下的设备扫描窗口Twindowpage scan内监听自己的DAC。监听只在一个跳频点进行。Twindow page scan足够覆盖16个寻呼扫描频点。
寻呼扫描状态,扫描在同一个频率上进行,持续1.28S,在选择另一个不同频率。
SR模式 Tpage scan 寻呼次数Npage
R0 连续 >=1
R1 <=1.28S >=128
R2 <=2.56S >=256
预留 – –
(3)、寻呼
主设备使用寻呼发起一个主—从设备连接,通过在不同的跳频点上重复发送从设备DAC来扑捉从设备,从设备在寻呼扫描状态被唤醒,接收寻呼。
(4)、寻呼相应过程
三、链路管理器
如上图红色部分,负责完成设备:功率管理、链路质量管理、链路控制管理、数据分组管理、链路安全管理。
1、链路管理协议数据单元
蓝牙链路管理器接收到高层的控制信息后,不是向自身的基带部分分发控制信息,就是与另一台设备的链路管理器进行协商管理。这些控制信息封装在链路管理协议数据单元LMP_PDU中,由ACL分组的有效载荷携带。
2、链路管理器协议规范
(1)、设备功率管理
RSSI保持模式、呼吸模式、休眠模式。
(2)、链路质量管理 QoSQuality of Service
A、ACL链路。
B、SCO链路。
(3)、链路控制管理
设备寻呼模式、设备角色转换、时钟计时设置、信息交换:版本信息、支持特性、设备名称;建立连接、链路释放。
(4)、数据分组管理
第二章 蓝牙协议规范(射频、基带链路控制、链路管理)
蓝牙协议是蓝牙设备间交换信息所应该遵守的规则。与开放系统互联(OSI)模型一样,蓝牙技术的协议体系也采用了分层结构,从底层到高层形成了蓝牙协议栈,各层协议定义了所完成的功能和使用数据分组格式,以保证蓝牙产品间的互操作性。
一、射频协议
射频位置如上图红色部分。
1、工作频率
蓝牙工作在2.4GHz ISM频段上,蓝牙采用跳频扩谱技术主动的避免工作频段受干扰(微波炉的工作频率也是2.4GHz)。
地理位置 ISM频段范围 射频信道频率
中国、美国、欧洲 2400.0~2483.5MHz F=(2402+k)MHz,k在0、1、……78中随机取值
法国 2446.5~2483.5MHz F=(2454+k)MHz,k在0、1、……22中随机取值
日本 2471.0~2497.0MHz F=(2473+k)MHz,k在0、1、……22中随机取值
西班牙 2445.0~2475.0MHz F=(2449+k)MHz,k在0、1、……22中随机取值
我国的蓝牙频率在2.402GHz~2.483GHz,蓝牙每个频道的宽度为1MHz,为了减少带外辐射的干扰,保留上、下保护为3.5MHz和2MHz,79个跳频点中至少75个伪随机码跳动,30S内任何一个频点使用时长不能超过0.4S。
2、跳频技术、发射功率、时隙
(1)、发射功率:蓝牙发射功率分三级:一级功率100mW(20dBm);二级功率2.5mW(4dBm);三级功率1mW(0dBm);
(2)、物理信道:蓝牙物理信道有伪随机序列控制的79个跳频点构成,不同跳频序列代表不同的信道。
(3)、时隙:蓝牙跳频速率为1600次/s,每个时间为625uS(1S/1600)称为一个时隙;
二、基带与链路控制协议
蓝牙发送数据时,基带部分将来自高层的数据进行信道编码,向下发给射频进行发送;接收数据时,将解调恢复空中数据并上传给基带,基带进行信道编码传送给上层。
作用:跳频选择、蓝牙编址、链路类型、信道编码、收发规则、信道控制、音频规范、安全设置。
1、蓝牙分组编码为小端模式;
2、蓝牙地址
**BD_ADDR:**BluetoothDevice Address;
**LAP:**LowerAddress Part 低地址部分;
UAP: UpperAddress Part 高地址部分;
NAP: Non-significantAddress Part 无效地址部分。
3、蓝牙时钟
每个蓝牙设备都有一个独立运行的内部系统时钟,称为本地时钟(Local Clock),决定定时器的收发跳频。为了与其他设备同步,本地时钟要加一个偏移量(offset),提供给其他设备同步。
蓝牙基带四个关键周期:312.5uS、625uS、1.25mS、1.28S。
CLKN:本地时钟:
CLKE:预计时钟,扫描寻呼过程中用到;
CLK:设备实际运行的时钟频率。
CLKE、CLK由CLKN加上一个偏移量得到的。
4、蓝牙物理链路:
通信设备间物理层的数据连接通道就是物理链路。
ACL(Asynchronous Connectionless)异步无连接链路;对时间要求不敏感的数据通信,如文件数据、控制信令等。
SCO(Synochronous Connection Oriented)同步面向连接链路;对时间比较敏感的通信,如:语音;最多只支持3条SCO链路,不支持重传。
ACL用于数据传输;
5、蓝牙基带分组:
基带分组至少包括:接入码、分组头、有效载荷;
1
(1)、接入码用于同步、直流、载频泄漏偏置补偿标识;
(2)、分组头包含链路信息,确保纠正较多的错误。
分组类型如下:
分组类别 Type(b3b2b1b0) 时隙 SCO ACL
链路控制分组 0000 1 NULL NULL
0001 POLL POLL
0010 FHS FHS
0011 DM1 DM1
单时隙分组 0100 1 未定义 NULL
0101 HV1
0110 HV2
0111 HV3
1000 DV
1001 NULL AUX1
3时隙分组 1010 3 未定义 DM3
1011 DH3
1100 未定义
1101
5时隙分组 1010 5 未定义 DM5
1111
ACL分组形式为:D(M|H)(1|3|5),D代表数据分组,M代表用2/3比例的FEC的中等速率分组;H代表不使用纠错码的高速率分组;1、3、5分别代表分组所占用的时隙数目;
DM1、DM3、DM5、DH1、DH3、DH5
SCO分组形式为:HV(1|2|3)。HV代表高质量语言分组,1、2、3有效载荷所采用的纠错码方法。1为1/3比例FEC,设备2个时隙发送一个单时隙分组;2为2/3比例FEC,设备4个时隙发送一个单时隙分组;3为不使用纠错码,设备6个时隙发送一个单时隙分组
HV1、HV2、HV3
ALC 分组:
类型 有效载荷头/字节 用户有效载荷/字节 FEC CRC 对称最大速率/kbps 非对称速率/kbps
前向 后向
DM1 1 0~17 2/3 有 108.8 108.8 108.8
DH1 1 0~27 无 有 172.8 172.8 172.8
DM3 2 0~121 2/3 有 258.1 387.2 54.4
DH3 2 0~183 无 有 390.4 585.6 86.4
DM5 2 0~224 2/3 有 286.7 477.8 36.3
MH5 2 0~339 无 有 433.9 723.2 57.6
AUX1 1 0~29 无 无 185.6 185.6 185.6
SCO分组:
类型 有效载荷头/字节 用户有效载荷/字节 FEC CRC 有效载荷长度 同步速率/kbps 占用Tsco数目/语言长度
HV1 无 10 1/3 240位 64 2/1.25ms
HV2 20 2/3 4/2.5ms
HV3 30 无 6/3.75ms
DV 1D 10+(0-9)D 2/3D 有D 64+57.6D
注释:D 只对数据段有用,DV分组包含数据段,也包含语言段。
1
(3)、有效载荷 分语言有效载荷、数据有效载荷。
6、蓝牙的逻辑信道
链路控制信道:LinkControl LC
链路管理信道:Link Manage LM
用户异步数据信道:User AsynchronizationUA
用户同步数据信道:UserSynchronization US
用户等时数据信道:UserIsochronous UI UI
7、蓝牙的收发规则
上图为RX缓存。
上图为TX缓存。
新分组到达时,ACL链路的RX缓存器要流量控制,SCO数据不需要流量控制;
8、蓝牙基带信道和网络控制
(1)、链路控制器状态:
待机、连接
寻呼page、寻呼扫描pagescan、查询inquiry、查询扫描inquiry scan、主设备相应Master Response、从设备相应Slave Response、查询相应inquiry response
(2) 、连接状态
激活模式active、呼吸模式sniff、保持模式hold、休眠模式park。
(3)、待机状态
待机状态是蓝牙设备缺省低功耗状态,此状态下本地时钟以低精度运行。蓝牙从待机转入寻呼扫描状态,对其他寻呼进行响应成为从设备;也可以从待机状态进入查询扫描状态,完成一个完整的寻呼,成为主设备。
9、接入过程
注释:
IAC Inquiry AccessCode 查询接入码;
GIAC:通用查询接入码 DIAC:专用查询接入码;
DAC:DeviceAccess Code 设备接入码;
LAP:
建立连接,必须使用查询、寻呼;查询过程使用IAC,发现覆盖区域内的设备、设备的地址及其时钟;连接过程使用DAC,建立连接的设备处理寻呼过程,成为主设备。
(1)、查询过程
蓝牙设备通过查询来发现通信范围内的其他蓝牙设备。查询信息分为GIAC、DIAC两种。查询发起设备收集所有相应设备的地址、时钟信息。
一设备进入查询状态去发现其他设备,查询状态下连续不断的在不同频点发送查询消息。查询的跳频序列有GIAC的LAP导出。
一设备想被其他设备发现,就要周期性进入 查询扫描状态,以便相应查询消息。如:我们选择设备多长时间可见,其实就是 进入查询扫描状态。
A、查询扫描
查询扫描状态下,接收设备扫描接入码的时间长度,足以完成对16个频率的扫描。扫描区间长度Twindow inquiry scan。扫描在同一个频率上进行,查询过程用32跳专用查询跳频序列,此序列有通用查询的地址决定,相位有本地时钟决定,每隔1.28S变化一次。
B、查询
与寻呼类似,TX用查询跳频序列、RX用查询相应跳频序列。
C、查询相应
从设备响应查询操作。每个设备都有自己的时钟,使用查询序列相位相同的几率比较小。为了避免多个设备在同一查询跳频信道同时激活,从设备查询响应规定:从设备收到查询消息,产生0-1023只觉得额一个随机数,锁定当时相位输入值进行跳频选择,从设备此后的RAND时隙中返回到连接或者待机状态。
(2)、寻呼扫描
DAC:DeviceAccess Code 设备接入码
寻呼扫描状态下的设备扫描窗口Twindowpage scan内监听自己的DAC。监听只在一个跳频点进行。Twindow page scan足够覆盖16个寻呼扫描频点。
寻呼扫描状态,扫描在同一个频率上进行,持续1.28S,在选择另一个不同频率。
SR模式 Tpage scan 寻呼次数Npage
R0 连续 >=1
R1 <=1.28S >=128
R2 <=2.56S >=256
预留 – –
(3)、寻呼
主设备使用寻呼发起一个主—从设备连接,通过在不同的跳频点上重复发送从设备DAC来扑捉从设备,从设备在寻呼扫描状态被唤醒,接收寻呼。
(4)、寻呼相应过程
三、链路管理器
如上图红色部分,负责完成设备:功率管理、链路质量管理、链路控制管理、数据分组管理、链路安全管理。
1、链路管理协议数据单元
蓝牙链路管理器接收到高层的控制信息后,不是向自身的基带部分分发控制信息,就是与另一台设备的链路管理器进行协商管理。这些控制信息封装在链路管理协议数据单元LMP_PDU中,由ACL分组的有效载荷携带。
2、链路管理器协议规范
(1)、设备功率管理
RSSI保持模式、呼吸模式、休眠模式。
(2)、链路质量管理 QoSQuality of Service
A、ACL链路。
B、SCO链路。
(3)、链路控制管理
设备寻呼模式、设备角色转换、时钟计时设置、信息交换:版本信息、支持特性、设备名称;建立连接、链路释放。
(4)、数据分组管理
---------------------
第三章 蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
一、主机控制接口协议 HCI
蓝牙主机-主机控模型
蓝牙软件协议栈堆的数据传输过程:
1、蓝牙控制器接口数据分组:
指令分组、事件分组、数据分组
(1)、指令分组
如:Accpet Connection Request
Opcode为:0x0409
参数长度为: 07
参数中蓝牙地址为:00:0d:fd:5f:16:9f
角色为:从设备 0x01
大端数据模式
指令为:09 04 07 9f 16 5f fd 0d 00 01
(2)、事件分组
如上图:
Opcode :0x0409
状态: 0x00
总长度: 4字节
命令状态:0x0f
(3)、数据分组
ACL 数据分组
连接句柄(12bit) PB(2bit) BC(2bit) 数据长度(16bit)
数据…………
注:PB Packet_Boundary BC Broadcast Flag
1
SCO 数据分组
连接句柄(12bit) PB(2bit) BC(2bit) 数据长度(16bit)
数据…………
(4)、RS232分组指示器:
HCI 分组类型 RS232分组指示器
HCI指令分组 0x01
HCI ACL数据分组 0x02
HCI SCO数据分组 0x03
HCI事件分组 0x04
HCI错误消息分组 0x05
HCI协商分组 0x06
2、HCI控制命令
(1)、链路控制指令
命令 OCF 概述
Inquiry 0x0001 蓝牙设备进入查询模式,搜索临近设备
Inquiry Cancel 0x0002 退出查询模式
Periodic Inquiry Mode 0x0003 蓝牙设备在指定周期内自动查询
Exit Periodic Inquiry Mode 0x0004 退出自动查询模式
Create Connection 0x0005 按指定蓝牙设备的BD_ADDR创建ACL链路
Disconnect 0x0006 终止现有连接
Add SCO Connection 0x0007 利用连接句柄参数指定的ACL连接创建SCO
Cancel Create Connection 0x0008
Accept Connection Request 0x0009 接收新的呼入连接请求
Reject Connection Request 0x000A 拒绝新的呼入连接请求
Link Key Request Reply 0x000B 应答从主机控制器发出的链路密钥请求事件,并指定存储在主机上的链路密钥做为与BD_ADDR指定的蓝牙设备进行连接使用的链路密钥请求事件
Link Key Request Negative Reply 0x000C 如果主机上没有存储链路密钥,作为与BD_ADDR指定的蓝牙设备进行连接使用的链路密钥,就应答从主机控制器发出的链路密钥请求事件
PIN Code Request Reply 0x000D 应答从主机控制器发出的PIN请求事件,并指定用于连接的PIN
PIN Code Request Negative Reply 0x000E 当主机不能指定连接的PIN时,应回答从机控制器发出的PIN请求事件
Change Connection Packet Type 0x000F 改变正在建立连接的分组类型
Authentication Request 0x0011 指定连接句柄关联的两个蓝牙设备之间建立身份鉴权
Set Connection Encryption 0x0013 建立取消连接加密
Change Connection Link Key 0x0015 强制关联了连接句柄的两个设备建立连接,并生成一个新的链路密钥
Master Link Key 0x0017 强制关联了连接句柄的两个设备利用主设备时链路密钥或常规密钥
Remote Name Request 0x0019 获取远端设备的名称
Cancel Remote Name Request
Read Remote Supported Features 0x001B 请求远端设备所支持的特性列表
Read Remote Extended Features
Read Remote Version Information 0x001D 从远端设备读取版本信息
Read Clock Offset 0x001F 读取远端的时钟信息
(2)、链路策略指令
命令 OCF 简介
Hold Mode 0x0001 改变LM状态和本地及远程设备为主模式的LM位置
Sniff Mode 0x0003 改变LM状态和本地及远程设备为呼吸模式的LM位置
Exit Sniff Mode 0x0004 结束连接句柄在当前呼吸模式里的呼吸模式
Park State 0x0005 改变LM状态和本地及远程设备为休眠模式的LM位置
Exit Park State 0x0006 切换从休眠模式返回到激活模式的蓝牙设备
QoS Setup 0x0007 指出连接句柄的服务质量参数
Role Discovery 0x0009 蓝牙设备连接后确定自己的主从角色
Switch Role 0x000B 角色互换
Read Link Policy Settings 0x000C 为指定连接句柄读链路策略设置。链路策略设置允许主机控制器指定用于连接句柄的LM连接模式
Write Link Policy Settings 0x000D 为指定连接句柄写链路策略设置。链路策略设置允许主机控制器指定用于连接句柄的LM连接模式
Read Default Link Policy Settings 0x000E
Write Default Link Policy Settings 0x000F
Flow Specification 0X0010
(3)、主机控制器与基带指令
Set Event Mark 0x0001 使能主机过滤HCI产生的事件
Reset 0x0003 复位蓝牙控制器、链路管理器、基带链路管理器
Set Event Filter 0x0005 使能主机指定不同事件过滤
Flush 0x0008 针对指定的蓝牙句柄,放弃所有作为当前待传输数据,甚至当前是属于多个在主机控制器里的L2CAP指令的数据块
Read PIN Type 0x0009 主机读取指定主机的PIN类型是可变的还是固定的
Write PIN Type 0x000A 主机写入指定主机的PIN类型是可变的还是固定的
Create New Unit Key 0x000B 创建新的单一密钥
Read Stored Link Key 0x000D 读取存放在蓝牙控制器中的单个或者多个密钥
Write Stored Link Key 0x0011 写入存放在蓝牙控制器中的单个或者多个密钥
Delete Stored Link Key 0x0012 删除存放在蓝牙控制器中的单个或者多个密钥
Write Local Name 0x0013 修改蓝牙设备名称
Read Local Name 0x0014 读取蓝牙设备名称
Read Connection Accept Timeout 0x0015 读连接识别超时参数值,定时器终止后蓝牙硬件自动拒绝连接
Write Connection Accept Timeout 0x0016 写连接识别超时参数值,定时器终止后蓝牙硬件自动拒绝连接
Read Page Timeout 0x0017 读寻呼超时参数值,本地设备返回连接失败前,该值是允许蓝牙硬件定义等待远程设备连接申请时间
Write Page Timeout 0x0018 写寻呼超时参数值,本地设备返回连接失败前,该值是允许蓝牙硬件定义等待远程设备连接申请时间
Read Scan Enable 0x0019 写出扫描允许参数值—用来控制蓝牙设备周期性查询
Write Scan Enable 0x001A 读出扫描允许参数值—用来控制蓝牙设备周期性查询
Read Page Scan Activity 0x001B 读寻呼扫描间隔、寻呼扫描区间参数
Write Page Scan Activity 0x001C 写寻呼扫描间隔、寻呼扫描区间参数
Read Inquiry Scan Activity 0x001D 读查询扫描间隔、查询扫描区间参数
Write Inquiry Scan Activity 0x001E 写查询扫描间隔、查询扫描区间参数
Read Authentication Enable 0x001F 读取鉴权允许参数—控制蓝牙设备是否对每个连接进行鉴权
Write Authentication Enable 0x0020 写取鉴权允许参数—控制蓝牙设备是否对每个连接进行鉴权
Read Encryption Mode 0x0021 读加密模式数值—控制蓝牙设备是否对每个连接进行加密
Write Encryption Mode 0x0022 写加密模式数值—控制蓝牙设备是否对每个连接进行加密
Read Class Of Device 0x0023 读取设备类型参数值,用于区别设备能力
Write Class Of Device 0x0024 写设备类型参数值,用于区别设备能力
Read Voice Setting 0x0025 读取语音设置参数值,控制语音连接的各种设置
Write Voice Setting 0x0026 写语音设置参数值,控制语音连接的各种设置
Read Automatic Flush Timeout 0x0027 对指定句柄,读取刷新超时值
Write Automatic Flush Timeout 0x0028 对指定句柄,写入刷新超时值
Read Num Broadcast Retransmissions 0x0029 读取设备的广播重复发送次数,重复发送提高广播消息的可靠性
Write Num Broadcast Retransmissions 0x002A 写入设备的广播重复发送次数,重复发送提高广播消息的可靠性
Read Hold Mode Activity 0x002B 读取Hold Mode Activity的参数值,用来确定Hold挂起的时间
Write Hold Mode Activity 0x002C 写入Hold Mode Activity的参数值,用来确定Hold挂起的时间
Read Transmit Power Level 0x002D 对指定句柄,读取传输功率的参数值
Read Synchronous Flow Control Enable 0x002E 读取SCO流量控制设置。通过使用该设置,主机控制器决定是否主机控制器发送与SCO连接句柄相关的完成分组事件的数量
Write Synchronous Flow Control Enable 0x002F 读写入SCO流量控制设置。通过使用该设置,主机控制器决定是否主机控制器发送与SCO连接句柄相关的完成分组事件的数量
Set Host Controller To Host Flow Control 0x0031 主机控制器的打开、关闭,主机控制器到主机的流量控制
Host Buffer Size 0x0033 主机通知主机控制器自己的ACL、SCO数据缓冲区大小。主机控制器分段传输数据,而数据不会超出这个范围
Host Number Of Completed Packets 0x0035 当主机对于任何连接的句柄准备接受较多的HCI指令时,该指令用于通过主机指出主机控制器
Read Link Supervision Timeout 0x0036 读取连接管理超时参数。主从蓝牙设备用该参数监视链路丢失情况
Write Link Supervision Timeout 0x0037 写入连接管理超时参数。主从蓝牙设备用该参数监视链路丢失情况
Read Number of Supported IAC 0x0038 读取查询扫描期间本地蓝牙扫描的查询识别码(ICA)的数值
Read Current IAC LAP 0x0039 读取创建在查询扫描期间本地蓝牙设备正同时扫描的蓝牙识别码的LAP
Write Current IAC LAP 0x003A 写入创建在查询扫描期间本地蓝牙设备正同时扫描的蓝牙识别码的LAP
Read Page Scan Period Mode 0x003B 读取本地蓝牙设备的强制寻呼扫描区间模式
Write Page Scan Period Mode 0x003C 写入本地蓝牙设备的强制寻呼扫描区间模式
Read Page Scan Mode 0x003D 读取本地蓝牙设备的默认寻呼扫描区间模式
Write Page Scan Mode 0x003E 写入本地蓝牙设备的默认寻呼扫描区间模式
(4)、信息指令参数
Read Local Version Information 0x0001 读取本地蓝牙版本信息
Read Local Supported Features 0x0003 读取本地蓝牙设备特征表
Read Local Extended Features 0x0004
Read Buffer Size 0x0005 返回HCI缓冲容量。缓冲容量用于传输缓冲数据
Read Country Code [Deprecated] 0x0007 读取国家代码状态参数值
Read BD ADDR 0x0009 读取BD_ADDR的参数值
(5)、状态指令参数
Read Failed Contact Count 0x0001 读取对于其他设备特殊连接的Failed Contact Count参数值。Failed Contact Count记录在刷新时终止及当前正在传输的L2CAP数据指令被自动刷新后,主单元或从单元不能连续响应事件次数
Reset Failed Contact Count 0x0002 复位时对于其他设备的连接的Failed Contact Count的参数值。Failed Contact Count记录在刷新时终止及当前正在传输的L2CAP数据指令被自动刷新后,主单元或从单元不能连续响应事件次数
Get Link Quality 0x0003 读取指定连接句柄的Link Quality的值
Read RSSI 0x0005 读取对于其他蓝牙设备连接句柄的接收信号强度指示
Read AFH Channel Map 0x0007
Read BD Clock 0x0009
(6)、测试指令
Read Loopback Mode 0x0001 读取主机端控制器会送模式的设置值。回送模式设置可以确定信息发送路径
Write Loopback Mode 0x0002 写入主机控制器会送模式的设置值。回送模式设置可以确定信息发送路径
Enable Device Under Test Mode 0x0003 允许本地蓝牙设备模块通过LMP测试指令接入测试模式。当主机要求本地设备作为待测试设备,实现蓝牙测试模式文件中规定测试场景,则发送该指令
(7)、错误代码
错误代码 错误含义 错误代码 错误含义
0x01 位置HCI指令 0x14 由于另一端引起连接中断:资源限制
0x02 不能连接 0x15 由于另一端引起连接中断:关机
0x03 硬件故障 0x16 本机中断连接
0x04 寻呼超时 0x17 重复尝试
0x05 身份验证失败 0x18 不允许匹配
0x06 键丢失 0x19 未知LMP PDU
0x07 存储器已满 0x1A 不支持远端特性
0x08 连接超时 0x1B 拒绝SCO补偿
0x09 最大连接数 0x1C 拒绝SCO间歇模式
0x0A 连接到设备A的最大SCO连接数 0x1D 拒绝SCO无线模式
0x0B ACL连接已存在 0x1E 非法链路管理参数
0x0C 指令非法 0x1F 未特别指明错误
0x0D 由于资源有限,主机被拒绝 0x20 不支持链路管理器协议参数
0x0E 由于安全原因,主机被拒绝 0x21 不允许角色改变
0x0F 由于远端设备单连接设备,主机拒绝 0x22 链路管理响应超时
0x10 主机超时 0x23 链路管理错误处理事务冲突
0x11 不支持特性或参数值 0x24 不允许LMP PDU
0x12 非法主机控制接口指令 0x25~0xFF 保留
0x13 由于另一端引起连接中断:用户中断连接
二、逻辑链路控制与适配协议 L2CAP
L2CAP位于基带之上,将基带的数据分组转换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。L2CAP只支持ACL数据传输,不支持SCO数据。
L2CAP本身不提供加强信道可靠性和保证数据完整性的机制,其信道的可靠性依靠基带提供。
1、协议复用:
底层传输协议没有提供对高层协议的复用机制,因而L2CAP支持高层协议复用,L2CAP层可以区分其上的SDP、RFCOMM、TCS等。
2、分段重组:
L2CAP层帮助实现基带的短PDU和高层的长PDU相互传输,L2CAP本身不完成任何PDU的分段重组,具体的分段重组有低层和高层来完成。
3、服务质量
Qualityof Serivce 信息的交换:蓝牙建立连接的过程中,L2CAP允许交互蓝牙所期望的服务质量,建立完成后,通过监视资源的使用情况,来保证服务质量。
4、组抽象:
L2CAP忽略地址组概念,他只关心数据。
L2CAP信道有三种类型:
**A、面向连接信道:**Connection-OrientedCO,用于两个设备之间的数据通信。
**B、无连接信道:**Connection-LessCL,用来向一组设备广播方式传输数据。CID为固定值:0x0002。
**C、信令信道:**Signaling,用于创建CO通道,可以通过协商改变CO信道的特性。
CL信道的L2CAP_PDU
长度(2bytes) 信道ID(0x0002) PSM(最小为2bytes) 有效载荷
PSM为 协议/服务复用器Protocol/Service Multiplexer,一般为SDP、RFCOMM、TCS等中介协议复用。小于0x1000的值,0x0001对应SDP,0x0003对应RFCOMM、0x0005对应TCS。
(1)、蓝牙逻辑链路控制与适配协议信令:
L2CAP的信令通道的CID为0x0001
信令指令分组:
长度(2byte) CID(0x0001) 指令1 指令2 …………… 指令n
L2CAP 分组头部分
信令指令格式:
代码(1byte) 标识符(1byte) 长度(2byte) 数据
信令指令头
如上图所示,一条L2CAP信令,1为L2CAP分组头,2为信令指令头,3为数据部分。
L2CAP:
Role:Master
Address:11
PDULength: 6 //指令的长度,值为06 00
ChannelID: 0x0001 (Signaling)//L2CAP的信令通道,值为01 00
Code:Information request//信息请求,值为0a
Identifier:1//标识符,值为01
CommandLength: 2//命令长度,值为02 00
InfoType:Extended features supported//02 00
所以这条指令完整的为:
06 00 01 00 0a 01 02 00 02 00
信令的其他操作如下:
L2CAP信令指令码:
Code Description
0x00 RESERVED 保留
0x01 Command reject 拒绝命令
0x02 Connection request 连接请求
0x03 Connection response 连接响应
0x04 Configure request 配置请求
0x05 Configure response 配置响应
0x06 Disconnection request 断开请求
0x07 Disconnection response 断开响应
0x08 Echo request
0x09 Echo response
0x0A Information request 信息请求
0x0B Information response 信息响应
1)、连接请求Connection_Request Code=0x02
代码(0x02) 标识符(1字节) 长度(2字节) PSM(2字节) 源CID(2字节)
例如:SDP 连接请求
如上红框所示:
代码(0x02) 标识符(1字节) 长度(2字节) PSM(2字节) 源CID(2字节)
0x02 3 4 SDP 0x0040
2)、连接相应Connection_Response Code=0x03
代码(0x03) 标识符 长度 目标CID 源CID 结果 状态
例如:SDP请求响应
如上面红框所示:
代码(0x03) 标识符 长度 目标CID 源CID 结果 状态
0x03 3 8 0x0040 0x0040 0x0000
(2)、MTU MAXIMUMTRANSMISSION UNIT最大传输单元
MTU最大传输单元,L2CAP应用必须支持最小为48字节的MTU,默认值为672
(3)、QoS 服务质量
三、服务发现协议SDP
SDP两种服务发现模式:
1)、服务搜索:查询具有特定服务属性的服务;
2)、服务浏览:简单的浏览全部可用服务。
1 、PDU 格式:(协议数据单元)
PDU ID(1byte) Transaction ID(2byte) 参数长度(2byte) 参数1 …… 参数N
Header
不同PDU ID实现SDP的不同功能,概述如下表格:
Value Parameter Descirption
0x00 Reserved 保留
0x01 SDP_ErrorResponse 错误响应
0x02 SDP_ServiceSearchRequest 服务搜索请求
0x03 SDP_ServiceSearchResponse 服务搜索响应
0x04 SDP_ServiceAttributeRequest 服务属性请求
0x05 SDP_ServiceAttributeResponse 服务属性响应
0x06 SDP_ServiceSearchAttributeRequest 服务搜索属性请求
0x07 SDP_ServiceSearchAttributeResponse 服务搜索属性响应
0x08-0xff Reserved 保留
2、服务记录表
SDP的服务记录表对每一个服务进行描述,每条记录包含服务句柄、一组服务属性:
Service Record Attributes:服务记录;
Service Record Handle 服务句柄;
四、串口仿真协议 RFCOMM
为建立在串口之上的传统应用提供环境接口,使他们可以做比较少协议改动就可以在蓝牙无线通信无线链路上工作。多路串口仿真是RFCOMM的重要功能,通过多路复用器(multiplexer),一条L2CAP链路可以同时 多个串行应用。
两台设备间的串口仿真:
RFCOMM 两个蓝牙设备之间可以支持多达60多路仿真串口。
RFCOMM帧类型如下:
SABM 异步平衡模式设置指令
UA 未加编号的确认响应
DM 断开连接模式响应
DISC 断开连接指令
UIH 带头校验的未编号信息命令和响应