1、基础

      低功耗蓝牙协议栈包含2部分:主机(Host)、控制器(Controller)。 


      控制器部分包括: 物理层(Physical Layer), 链路层(Link Layer), 主机控制接口层(Host Controller Interface)

      主机部分包括:L2CAP逻辑链路控制和自适应协议层(Logical Link Control and Adaptation Protocol),安全管理层(Security Manager),ATT属性协议层(Attribute Protocol),GAP通用访问配置文件层(Generic Access Profile),总协定通用属性配置文件层(Generic Attribute Profile)

      对于开发者而言,只需掌握与应用紧密相关的GAP / GATT层即可满足大部分开发的需求,通过SoftDevice(即协议栈)的API软件接口(以sd开头)调用来实现。

android蓝牙协议栈目录 蓝牙的协议栈_android蓝牙协议栈目录

2、控制器部分(Controller)

2.1,物理层(Physical Layer)


      负责向物理信道发送或接收符合格式要求的数据流。


  低功耗蓝牙的物理层工作于2.4GHz全球通用的免许可频段(2400MHz〜2483.5MHz),共用40个频道(广播频道3个,数据频道37个),频道间隔为2MHz,而经典蓝牙使用79个频道,为1MHz的间隔。

  低功耗蓝牙广播频道为2402MHz(37),2426MHz(38),2480MHz(39),这3个广播频道刚好与无线网络连接无线局域网(WiFi)的信道错开,用于设备发现和建立连接。由于使用3个广播频道,低功耗蓝牙只需0.6到1.2ms的“开启”时间来扫描其他设备。而经典蓝牙需要22.5ms扫描其32个频道。 

  由于蓝牙和无线网络都工作在2.4GHz的频段,在同一使用环境下可能产生相互的影响,为此低功耗蓝牙做了系统共容性的考虑,低功耗蓝牙频道表设计时尽量避开无线网络的工作频道,低功耗蓝牙的所有3个广播频道均在无线频道表之外,除了重叠的数据频道部分,仍有9个数据频道在无线频道之外,确保了低功耗蓝牙系统的可靠性及与无线网络系统的共容性,增强了应用时的抗干扰能力。

       低功耗蓝牙采用GFSK高斯频移键控调制方式(把输入数据经高斯低通滤波器预调制滤波后,再进行FSK调制)。它在保持恒定幅度的同时,能够通过改变高斯低通滤波器的3分贝带宽对已调信号的频谱进行控制,具有恒福包络,功率谱集中,频谱较窄等无线通信系统所希望的特性。

  低功耗蓝牙规范中所定义的最大发射功率为+10 dBm(10mW),最小发射功率为-20 dBm(0.01mW)。接收机灵敏度要求优于-70 dBm(当误码率BER为0.1%时)。 

      当发射功率为0 dBm时,接收机灵敏度为-70 dBm,通信距离约为30米,当发射功率为+10 dBm时,接收机灵敏度为-90 dBm,通信距离约为100米。

2.2,链路层(Link Layer)

      链路层用于控制射频设备的工作状态,包括5种可能的工作状态:待机,广播,扫描,启动和连接。发起连接的设备成为主机,接受连接请求的设备成为从机。

      主机:主机只能从发起态进入。为了成为主机,必须向对端设备发起连接。主机必须定期的向从机发送报文,从机只有通过回复这些报文才能发送自己的数据。(

      从机:从机只能从广播态进入。为了成为从机,它必须向对端设备进行广播。收到主机的一个报文后,从机可以发送自己的报文。如果从机向发送更多的数据,则必须等待主机发送更多的报文回来再回复。(广播者→从机)

      低功耗蓝牙外设在工作时主要有两种状态:广播状态连接状态。广播状态下,通过特定的时间间隔把数据按一定的格式发送出去,可以被主机搜索到。连接状态下,可以与主机进行数据交互。

      设备发现过程:外设将广播特定的数据,以便让任何中心设备知道这是一个可连接设备广播数据包含设备地址,并可以包含一些额外的数据(如设备的名称)中心设备接受的广播数据时,向外围设备发送一个“扫描请求”,外围设备用一个“扫描响应”来回应。连接过程:中央设备发送请求建立与外围设备的连接。

从延时(slave lantency):根据应用需要,从设备可以跳过一些连接事件。

      链路层定义了:1种包格式(含前导,同步字接入地址,协议数据包PDU和CRC),2种PDU类型(广播or数据),7种广播PDU类型广告PDU类型,7种链路层控制过程链路层控制程序。

      前导序言:通常为0x55或0XAA。

      访问地址访问地址:广播包总为0x8e89bed6,数据包的是随机的。

Protocol Data Unit):分组数据单元,具体看书。

      CRC:循环冗余校验,共24位。

2.3,主机控制接口(Host Controller Interface)

    HCI层为主机和控制器之间的通信提供了一种标准化的接口,其主要完成两个任务:1)发送命令给控制器和接收来自控制器的事件; 2)发送和接收来自对端设备的数据。

      在低功耗蓝牙规范中定义了4种物理接口方式:1)UART异步通信接口提供最简单方式。2)3线UART接口提供可靠的通信方式。3)USB同的高速传输方式。4)用于消费电子设备的SDIO安全数字输入输出。

3、主机部分(Host)

3.4,L2CAP逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol)

  为更高层提供数据封装服务,允许逻辑的端到端数据通信。

3.5,安全管理层(Security Manager)

  定义了配对和密钥分发的方法,并为其他堆栈层的安全连接以及与另一个设备交换数据提供功能。

3.6,ATT属性协议层(Attribute Protocol)

  用于所有低功耗蓝牙的数据传输,采用了客户端(Client) - 服务器(Server)架构

       特点:1)服务器存储数据 。2)客户端请求数据。3)服务器启动通知(通知)和指示(标志)。

       ATT属性协议允许一台设备公开某些被称为“属性(属性)”的数据块到另一个设备。在ATT属性协议中,公开属性的设备被称为“服务器”,其对端设备被称为“客户端”。

       属性具有句柄:在ATT协议中,属性是可寻址的,每个属性都有一个属性句柄,客户端使用句柄来寻址所期望的属性。

       属性具有类型:属性类型是一个UUID(通用唯一识别码)类型是由特征规范(Characteristic Specifications)所定义,也可以通用访问配置文件(Generic Access Profile)或通用属性配置文件(Generic Attribute Profile)定义。

       蓝牙核心规范制订了两种不同的UUID,一种是基本的UUID:0000xxxx-0000-1000-8000-00805F9B34FB。一种是代替基本UUID的16位UUID,目的是进一步简化基本UUID,每个蓝牙技术联盟定义的属性有一个唯一的16位UUID,例如,心率测量特性使用0X2A37作为其16位UUID。16位的UUID能够唯一的识别蓝牙技术联盟所定义的各种属性。

       但蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID。

        SoftDevice根据蓝牙技术联盟定义UUID类似的方式定义UUID:先增加一个待定的基本UUID,再定义一个16位的UUID加载在基本UUID上。基本UUID可使用软件nRFgo Studio生成,蓝牙核心规范并没有任何规则或是建议如何对加入基本UUID的16位UUID进行分配,故可以按照自己的意图来任意分配。

       随机基本UUID的生成:1、打开nRFgo Studio。2、在nRF518001 Setup菜单中,选择Edit 128-bit UUIDs选项,点击Add new。

        例如,生成的基本UUID为6e40xxxx-b5a3-f393-e0a9-e50e24dcca9e,我们可将16位UUID分别设置为0001,0002,0003。

3.7,GAP通用访问配置文件层(Generic Access Profile)

  低功耗蓝牙协议栈的GAP层与应用层Profile直接连接,负责处理设备的接入方式和过程,包括设备发现,链路建立,链路终止,启动安全功能以及设备配置。具有强制性,是所有其他蓝牙应用规范的基础,可以保证不同的蓝牙产品可以互相处理发现并建立连接。

       它定义了:1)在蓝牙设备间建立基带链路的通用方法,2)必须在所有蓝牙设备中实施的功能,3)发现和链接设备的通用步骤,4)基本用户界面术语。

       GAP层定义了4种角色:1)广播者(Broadcaster) —— 广播数据,不可连接(如温度传感器)。2)观察者(Observer) -——扫描广播,但不能主动发起连接(如温度显示器)。 3)外部设备(Peripheral) ——可连接的广播者,在一个单一的链路层连接中作为从机工作(如智能手表)。4)中心设备(Central)——扫描广播并发起连接,在一个单一的链路层中作为主机工作(如智能手机)。

外部设备的协议栈,也就是说只能广播,不能扫描。S120是针对中心设备的协议栈,就是说可以扫描。

3.8,GATT通用属性配置文件层(Generic Attribute Profile)

  GATT层是一个服务框架,定义使用ATT的子过程.GATT规定了配置文件资料的结构。在低功耗蓝牙中所有的数据块由一个简介服务或所使用的数据库称为特性(Characteristic)。  低功耗的连接设备两个之间发生的所有数据通过GATT的子过程处理,故应用以及配置文件直接使用GATT层。GATT层是传输真正数据所在的层,包括一个数据传输和存储框架以及其基本操作。

       与属性协议ATT相同的客户端(Client) - 服务器(Server)架构如图

android蓝牙协议栈目录 蓝牙的协议栈_数据_02

       数据封装在服务(Service)中,数据放置在特性(Characteristic)中。

android蓝牙协议栈目录 蓝牙的协议栈_低功耗蓝牙_03

       提供数据的设备称为服务器(Server),访问服务器而获得数据的设备称为客户端(Client)。一个设备可以同时为服务器和客户端。

       特性:描述设备状态的相关属性,含可用功能(可读,指示等),句柄,表示内容(单位,说明,数据类型)。

       一个GATT服务器通过一个称为属性表的表格组织数据,这些数据就是真正用于发送的数据。句柄是属性在GATT表中的索引,在一个设备中每一个属性的句柄都是唯一的。UUID是全球唯一的128位号码,包含属性表中数据类型的信息,用于识别不同的特性。在一个GATT表中可能有许多属性,这些属性可能有相同的UUID。