蓝牙学习笔记

Bluetoth学习笔记

  1. 前言

    蓝牙技术其实包括BR/EDR、LE以及AMP三种。其中BR是传统的蓝牙技术,也是我们最常用的一种。LE是低功耗模式,是目前流行的模式。三种模式RF都使用2.4GHz ISM(Industrial Scientific Medical) 频段,频率范围是2.400-2.4835 GHz。

  1. 1、BR/EDR(Basic Rate/Enhanced Data Rate)

BRE,传统蓝牙技术。理论速度1Mbps。EDR,理论速度2.1Mbps。BRE采用1M带宽,79个channel,数据传输采用跳频技术(hopping),跳频数目不能少于20个。BRE用于与数据量比较大的传输,如语音。

BR/EDR技术,过于侧重“点对点”通信,以至于虽然在协议的底层(如Logical Link)有提及多播(Unidirectional)和广播(Broadcast)的概念,但在上层的应用场景中,几乎不存在相应的应用。

  1. 2、BLE(Low Energy)

BLE,低功耗蓝牙,应用于实时性要求较高但传输速率较低的产品,如遥控、耳机。

      随着物联网的发展,业界对简单的、不需要连接的多播或广播通信的需求越来越迫切,因此BLE技术在RF和Baseband的协议中,就做出了修改,以适应这种需求,即:使用2M带宽,原有的79个channel减少为40个,并保留了不少于3个的固定channel,用于广播通信,在剩下的37个data channel上跳频。

  1. 3、AMP(Alternate MAC and PHY layer extension)

AMP Bluetooth 在蓝牙3.0引入。基于BR/EDR的controller,在完成通常的点对点连接之后,将后续的数据通信,转移至AMP controller上,借助WiFi的802.11a的物理层实现54Mbps的传输速率。

  1. 4、单模和双模

单模蓝牙设备被称为Bluetooth Smart设备,仅仅支持BLE。

双模蓝牙设备被称为Bluetooth Smart Ready设备,同时支持BRE和BLE。

 

2.架构

      从OSI(Open System Interconnection)模型的角度看,蓝牙协议分为四个层次:物理层(Physical Layer)、逻辑层(Logical Layer)、链路层(L2CAP Layer)和应用层(APP Layer)。

 

      从源码实现的角度看,蓝牙分三层,Application层,Host层和Controller层。这种方式对profile进行了切分,应用层profile和应用程序构成了App层,核心profile和L2CAP构成了Host层,HCI接口、逻辑层和物理层构成了Control层。

 

2.1、Application层

APP层基于L2CAP层提供的channel以及蓝牙的核心profile,实现各种各样的应用功能。

      Profile是蓝牙协议的特有概念,为了实现不同平台下的不同设备的互联互通,蓝牙协议不止规定了核心规范,如GAP、GAT、GATT、SM等等;也为各种不同的应用场景,定义了各种Application规范,如SPP、HSP、HFP、FTP、IPv6/6LoWPAN等等。

       市面上流行的芯片的软件框架大部分是基于RTOS,应用层是单独的TASK,核心协议栈在另外的TASK执行,核心协议栈通过回调函数和应用层进行交互,协议栈通过消息传递机制让应用层TASK知道有蓝牙相关的操作,应用层通过相应的回调函数发现是GAP层的状态改变还是GATT层有数据进行传递,然后执行我们设计的功能。

2.2、Host层

蓝牙协议栈的核心部分,包括核心profile和L2CAP。

  •       GAP负责制定设备工作的角色;
  •       SM负责指定安全连接;
  •       ATT和GATT配合完成命令的定义和规范,为数据传输提供通道。

      L2CAP层作用为协议/通道的多路复用,负责上层应用数据(L2CAP Service Data Units,SDUs)的分割和重组(蓝牙MTU大小为251字节),生成协议数据单元(L2CAP Packet Data Units,PDUs),以满足用户数据传输对延时的要求,并便于后续的重传、流控等机制的实现。

 

2.3、Controller层

Controller实现射频相关的模拟和数字部分,完成最基本的数据发送和接收。

      物理层包括BR/EDR、LE以及AMP三种。负责在物理channel上收发蓝牙packet。对BR/EDR和LE RF来说,还会接收来自Baseband的控制命令来控制RF频率的选择和timing。AMP PHY使用802.11(WIFI)的规范。

      链路层基于物理层PHY,负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。

       Host controller interface。HCI作为Host和Controller的接口层,用来解耦和规范Host层与Controller层之间的通信协议和通信命令。

 

2.3.1、总结

 

3、蓝牙核心框架详解

       在BLE协议栈中,Physical Layer负责提供一系列的Physical Channel;基于这些Physical Channel,Link Layer可在两个设备之间建立用于点对点通信的Logical Channel;而L2CAP则将这个Logical Channel划分为一个个的L2CAP Channel,以便提供应用程序级别的通道复用。到此之后,基本协议栈已经构建完毕,应用程序已经可以基于L2CAP欢快的run起来了。蓝牙核心规范所定义的框架如下:摘录自:Core_v4.2.pdf ---->Vol1: Architecture & Terminology Overview---->Part A: Architecture---->2 CORE SYSTEM ARCHITECTURE。

3.1、物理层PHY

蓝牙物理层包括BR/EDR、LE以及AMP三种。负责以下功能:

  • 定义物理通道,如RF channel的频率、频宽;
  • RF发射相关的特性(Transmitter Characteristics),包括发射功率(Transmission power、调制方式(Modulation),高斯频移键控(Gaussian Frequency Shift Keying ,GFSK)、Spurious Emissions、Radio Frequency Tolerance等等。
  • RF接收相关的特性(Receiver Characteristics),包括接收灵敏度等。

 

3.2、链路层

3.2.1、状态机

LL层状态机如下:

 

  • Standby状态

初始状态,即不发送数据,也不接收数据。根据上层实体的命令(如位于host软件中GAP),可由其它任何一种状态进入,也可以切换到除Connection状态外的任意一种状态。

  • Advertising状态

可以通过广播通道发送数据的状态,由Standby状态进入。它广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,也可切换为Connection状态。

  • Scanning状态

可以通过广播通道接收数据的状态,由Standby状态进入。根据Advertiser所广播的数据的类型,有些Scanner还可以主动向Advertiser请求一些额外数据。上层实体可通过命令将Scanning状态切换回Standby状态。

  • Initiating状态

和Scanning状态类似,不过是一种特殊的接收状态,由Standby状态进入,只能接收Advertiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Advertiser都会切换到Connection状态。

  • Connection状态

和某个设备建立了单独通道的状态,在通道建立之后,由Initiating或者Advertising自动切换而来。通道断开后,会重新回到Standby状态。

      通道建立后(通常说“已连接”),处于Connection状态的双方,分别有两种角色Master和Slave:Initiater方称作Mater,Advertiser方称作Slave。

 

3.2.2、Link Controller & Baseband resource management

       Link Controller和Baseband resource management组成了蓝牙的基带(baseband)。Link Controller负责链路控制,主要是根据当前物理channel的参数、逻辑channel的参数、逻辑transport的参数将数据payload组装成bluetooth packet。另外,通过Link Control Protocol(对LE来说是LL Layer Protocol),可以实现流控、ack、重传等机制。而Baseband resource management,主要用于管理RF资源。

 

3.2.3、Link Manager

      Link Manager主要负责创建、修改、释放蓝牙逻辑连接(Logical Link),同时也负责维护蓝牙设备之间物理连接(Physical Link)的参数。它的功能主要是通过Link Management Protocol(LMP,for BR/EDR)和Link Layer Protocol(LL,for LE)完成。

​​​​​​​3.3、Device Manager

Device Manager主要负责控制蓝牙设备的通用行为(蓝牙数据传输除外的行为),主要是:

  • 搜索附近的蓝牙设备
  • 连接到其他的蓝牙设备
  • 使得本地的蓝牙设备connectable和discoverable
  • 控制本地蓝牙设备的属性(例如本地蓝牙设备的名字、link key等)

 

​​​​​​​3.4、HCI(Host Controller Interface)

定义Host和Controller(通常是两颗IC)之间的通信协议,可基于Uart、USB等物理介质,对理解蓝牙协议来说,是可选的。

 

​​​​​​​3.5、L2CAP(Logical Link Control and Adaptation Protocol)

L2CAP位于Bluetooth Host中,包括两个子模块:

  • Channel Manager

主要负责创建、管理、释放L2CAP channel。

  • L2CAP Resource Manager

负责统一管理、调度L2CAP channel上传递的PDU(Packet Data Unit),以确保那些高QoS的packet可以获得对物理信道的控制权。

 

L2CAP的主要功能有:

  • Protocol/channel multiplexing,协议/通道的多路复用;
  • Segmentation and reassembly,上层应用数据(L2CAP Service Data Units,SDUs)的分割(和重组),生成协议数据单元(L2CAP Packet Data Units,PDUs),以满足用户数据传输对延时的要求,并便于后续的重传、流控等机制的实现;
  • Flow control per L2CAP channel,基于L2CAP Channel的流控机制;
  • Error control and retransmissions,错误控制和重传机制;
  • Support for Streaming,支持流式传输(如音频、视频等,不需要重传或者只需要有限重传);
  • Fragmentation and Recombination,协议数据单元(PDUs)的分片(和重组),生成符合Link Layer传输要求的数据片(长度不超过251);
  • Quality of Service,QoS的支持。

 

​​​​​​​3.5.1、多路复用

multiplexing的手段,简单又直接(称的上“协议”的标配):

  • 数据发送时,将用户数据分割为一定长度的数据包(L2CAP Packet Data Units,PDUs),加上一个包含特定“ID”的header后,通过逻辑链路发送出去。
  • 数据接收时,从逻辑链路接收数据,解析其中的“ID”,并以此判断需要将数据转发给哪个应用。

这里所说的ID,就是多路复用的手段,L2CAP提供两种复用手段:基于连接的方法和无连接的方法。

​​​​​​​3.5.1.1、基于连接的方法

      这里的连接,是指基于L2CAP的应用程序,在通信之前,先建立一个基于Logical Channel的虚拟通道(称作L2CAP channel,和TCP/IP中的端口类似)。L2CAP会为这个通道分配一个编号,称作channel ID(简称CID)。

      L2CAP channel建立之后,就可以把CID放到数据包的header中,以达到multiplexing的目的。这些基于CID实现的多路复用,就称作channel multiplexing(基于通道的多路复用)。

那CID是怎么确定的呢?有一些固定用途的L2CAP Channel,其CID是固定值,另外一些则是动态分配的,具体如下:

                                             图片3 BLE CID分配

有关CID的具体数值可参考:Core_v4.2.pdf, Volume 3, Part A - Logical Link Control and Adaptation Protocol Specification

​​​​​​​3.5.1.2、 无连接的方法

      为了提高数据传输的效率,方便广播通信等应用场景,L2CAP在提供基于连接的通信机制之外,也提供了无连接的数据传输方法。基于这种方法,CID不存在了,取而代之的是一个称作Protocol/Service Multiplexer(PSM)的字段。

这种多路复用的手段则成为Protocol multiplexing(基于协议的多路复用)。

 

​​​​​​​3.6、SMP(Security Manager Protocol)

SMP是一个点对点的协议,基于专用的L2CAP channel,完成配对(pairing,)、认证(authentication)和加密(encryption)等过程。

 

​​​​​​​3.7、SDP(Service Discover Protocol)

      SDP也是一个点对点的协议,基于专用的L2CAP channel,用于发现其它蓝牙设备能提供哪些profile以及这些profile有何特性。在了解清楚了其他蓝牙设备的profile以及特性之后,本蓝牙设备可以发起对自己感兴趣的蓝牙profile的连接动作。

​​​​​​​3.8、AMP Manager

      基于L2CAP channel,和对端的AMP manager交互,用于发现对方是否具备AMP功能,以及收集用于建立AMP物理链路的信息。

​​​​​​​3.9、 GAP(Generic Access Profile)

      GAP是一个基础的蓝牙profile,用于提供蓝牙设备的通用访问功能,包括设备发现、连接、鉴权、服务发现等等。

GAP 是所有其它应用模型的基础,它定义了在 Bluetooth 设备间建立基带链路的通用方法。还定义了一些通用的操作,这些操作可供引用 GAP 的应用模型以及实施多个应用模型的设备使用。GAP 确保了两个 蓝牙设备(不管制造商和应用程序)可以通过 Bluetooth 技术交换信息,以发现彼此支持的应用程序。

GAP层的蓝牙设备角色(role):

1. Broadcaster Role,设备正在发送advertising events;

2. Observer Role,设备正在接收advertising events;

3. Peripheral Role,设备接受Link Layer连接(对应Link Layer的slave角色);

4. Central Role,设备发起Link Layer连接(对应Link Layer的master角色)。

 

GAP的状态机如下图所示:

 

在Standby状态,双方设备都处于未连接状态,Advertiser尝试广播数据,Scanner接收到广播数据后尝试进行扫描请求,并且得到扫描回复。此时Scanner产生连接意图,转变成Initiator发送连接请求,成功连接后发送广播的Advertiser作为Slave,进行连接请求的Initiator成为Master。

 

​​​​​​​3.10、 ATT(Attribute Protocol)

   ATT,属性协议,用于定义底功能蓝牙设备的属性,属性由三部分构成:

  • Handle:16bit的句柄;
  • UUID:16bit(需要购买)或128bit,定义attribute的类型;
  • Value:UUID不同,含义不同,长度不定;

    由多条属性(Attribute)可以组成一个特性(Characteristic),特性由以下三部分组成:

  • 特性申明:申明该特性的读写性质,申明该特性的属性的句柄,UUID。
  • 特性数值:必须查询该特性的服务规格书才知道其具体意义。
  • 特性描述符:并不是必须的,可以没有。

   特性characteristic由ATT服务来发布,ATT服务存储属性,ATT客户端不存储任何内容,用于和ATT服务交互。

 

​​​​​​​3.11、 GATT(Generic Attribute Profile)

      GATT,通用属性服务,它定义了一组ATT属性如何分组成有意义的服务。比如服务定义发现,读取,写入,通知、指示特性,以及配置特性的广播。

3.12、小结

        蓝牙设备被抽象的最小数据单位是属性attribute(比如属性头发,有长发短发,比如属性肤色,有黑色黄色白色),若干个属性组成特性(比如特性中国人,由头发属性、肤色属性、性格属性、饮食属性等组成),特性存储在server端,比如蓝牙耳机、蓝牙音箱,server需要周期性的advertise特性(特性定义了广播周期)。client(一般是手机)收到广播后,获取到server的各种特性,决定是否建立连接,然后向advertiser发起请求,建立连接。完成后client 的角色是master,server的角色是slave,为何?这是低功耗蓝牙的模型设计,蓝牙设备周期性的广播自己的特性,周期长短可通过修改属性定制,这样蓝牙设备仅仅在广播时耗电,其他时候功耗非常低。蓝牙手机接收广播后,显示可用的蓝牙设备,用户点击后发起连接。连接完成后一般是手机主动请求数据,蓝牙设备不能主动发送数据,这样做也是为了蓝牙设备的省电。蓝牙设备只能在收到手机的数据后才能返回数据,甚至可以定义蓝牙设备收到若干次数据后才回复一次数据。这也是为何手机叫master,蓝牙设备叫salve。

 

4、蓝牙连接

       假设我们有一台手机A(以安卓手机为例),一个设备B(设备名称:Nordic_HRM),如下所示,我们可以通过安卓设置菜单里面的蓝牙界面,让两者连接起来。

  1. 打开安卓设置菜单
  2. 选择“蓝牙”条目
  3. 打开蓝牙
  4. 等待系统搜索结果,不出意外的话,设备“Nordic_HRM”会出现在结果列表中
  5. 点击“Nordic_HRM”,手机将与此设备建立连接

https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002027071-1762450998.png

上述即为大家直观感受到的“连接”,那么手机要与设备Nordic_HRM建立连接,具体包含哪些流程?他们为什么可以连接成功?

​​​​​​​4.1、广播(advertising)

      在手机A(Observer观察者)跟设备B建立连接之前,设备B需要先进行广播,即设备B(Advertiser)不断发送广播信号,t为广播间隔。每发送一次广播包,我们称其为一次广播事件(advertising event),因此t也称为广播事件间隔。虽然图中广播事件是用一根线来表示的,但实际上广播事件是有一个持续时间的,蓝牙芯片只有在广播事件期间才打开射频模块,这个时候功耗比较高,其余时间蓝牙芯片都处于idle状态,因此平均功耗非常低,以Nordic nRF52810为例,每1秒钟发一次广播,平均功耗不到11uA

 https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002154131-174494960.png

      上面只是一个概略图,按照蓝牙spec,实际上每一个广播事件包含三个广播包,即分别在37/38/39三个射频通道上同时广播相同的信息,即真正的广播事件是下面这个样子的。

 https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002230342-2145438133.png

      设备B不断发送广播信号给手机(Observer),如果手机不开启扫描窗口,手机是收不到设备B的广播的,如下图所示,手机要开启射频接收窗口,而且要跟广播发送的发射窗口匹配成功,并在同一个channel,手机才能收到设备B的广播信号。也就是说,如果设备B在37通道发送广播包,而手机在扫描38通道,那么即使他们俩的射频窗口匹配,两者也是无法进行通信的。由于这种匹配成功是一个概率事件,因此手机扫到设备B也是一个概率事件,也就是说,手机有时会很快扫到设备B,比如只需要一个广播事件,手机有时又会很慢才能扫到设备B,比如需要10个广播事件甚至更多。

https://img2018.cnblogs.com/blog/1366713/201811/1366713-20181115112024457-1765361787.png

 

​​​​​​​4.2、建立连接(connection establishment)

      根据蓝牙spec规定,advertiser发送完一个广播包之后150us(T_IFS),advertiser必须开启一段时间的射频Rx窗口,以接收来自observer的数据包。Observer就可以在这段时间里给advertiser发送连接请求。如下图所示,手机在第三个广播事件的时候扫到了设备B,并发出了连接请求CONN_REQ(CONN_REQ又称为CONNECT_IND)

 https://img2018.cnblogs.com/blog/1366713/201811/1366713-20181115112331803-748944254.png

 

上图的交互流程比较粗略,为此我们引入下图,以详细描述连接建立过程。

https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002512648-481754524.png

图5:连接建立过程

注:图中M代表手机,S代表设备B,M->S表示手机将数据包发给设备B,即手机开启Tx窗口,设备B开启Rx窗口;S->M正好相反,表示设备B将数据包发给手机,即设备B开启Tx窗口,手机开启Rx窗口。

如图所示,手机在收到A1广播包ADV_IND后,以此为初始锚点(这个锚点不是连接的锚点),T_IFS时间后给Advertiser发送一个connection request命令,即A2数据包,告诉advertiser我将要过来连你,请做好准备。Advertiser根据connect_req命令信息做好接收准备,connect_req包含如下关键信息:

  • Transmit window offset,定义如图5所示
  • Transmit window size,定义如图5所示
  • connect_req数据包完整定义如下所示  

https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002642874-286768904.png

      connect_req其实是在告诉advertiser,手机将在Transmit Window期间发送第一个同步包(P1)给你,请在这段时间里把你的射频接收窗口打开。设备B收到P1后,T_IFS时间后将给手机回复数据包P2(ACK包)。一旦手机收到数据包P2,连接即可认为建立成功。当然,实际情况会比较复杂,手机有可能收不到P2,这个时候手机将持续发送同步包直到超时时间(supervision timeout),在此期间只要设备B回过一次ACK包,连接即算成功。所以一旦P1包发出,主机(手机)即认为连接成功,而不管有没有收到设备的ACK包。这也是为什么在Android或者iOS系统中,应用经常收到连接成功的回调事件(该回调事件就是基于P1包有没有发出,只要P1包发出,手机即认为连接成功,而不管有没有收到设备的ACK包),但实际上手机和设备并没有成功建立连接。后续手机将以P1为锚点(原点),Connection Interval为周期,周期性地给设备B发送数据包(Packet),Packet除了充当数据传送功能,它还有如下两个非常重要的功能:

  1. 同步手机和设备的时钟,也就是说,设备每收到手机发来的一个包,都会把自己的时序原点重新设置,以跟手机同步。
  2. 告诉设备你现在可以传数据给我了。连接成功后,BLE通信将变成主从模式,因此把连接发起者(手机)称为Master或者Central,把被连接者(之前的Advertiser)称为Slave或者Peripheral。BLE通信之所以为主从模式,是因为Slave不能“随性”给Master发信息,它只有等到Master给它发了一个packet后,然后才能在规定的时间把自己的数据回传给Master。

4.3、连接失败

有如下几种典型的连接失败情况:

  1. 如图5所示,如果slave在transmit window期间没有收到master发过来的P1,那么连接将会失败。此时应该排查master那边的问题,看看master为什么没有在约定的时间把P1发出来。
  2. 如果master在transmit window期间把P1发出来了,也就是说master按照connect_req约定的时序把P1发出来了,但slave没有把P2回过去或者没有在超时时间内把P2回过去,那么连接也会失败。此时应该排查slave这边的问题,看一看slave为什么没有把P2回过去
  3. 如果master把P1发出来了,slave也把P2回过去了,此时主机或者从机还是报连接失败,这种情况有可能是软件有问题,需要仔细排查master或者slave的软件。
  4. 还有一种比较常见的连接失败情况:空中射频干扰太大。此时应该找一个干净的环境,比如屏蔽室,排除干扰后再去测试连接是否正常。

4.4、Connection events

      连接成功后,master和slave在每一个connection interval开始的时候,都必须交互一次,即master给slave发一个包,slave再给master发一个包,整个交互过程称为一个connection event或者gap event。蓝牙芯片只有在connection event期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都是处于idle状态的,因此蓝牙芯片平均功耗就非常低,以Nordic nRF52810为例,每1秒钟Master和Slave通信1次,平均功耗约为6微安左右。Master不可能时时刻刻都有数据发给slave,所以master大部分时候都是发的空包(empty packet)给slave。同样slave也不是时时刻刻都有数据给master,因此slave回复给master的包大部分时候也是空包。另外在一个connection event期间,master也可以发多个包给slave,以提高吞吐率。综上所述,连接成功后的通信时序图应该如下所示:

 https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002708393-419602791.png

图7: 连接成功后的通信时序图(每个connection event只发一个包)

https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002818335-1761917951.png

图9: 连接成功后的通信时序图( connection event可能发多个包)

 https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430002837207-145463955.png

图10:connection event细节图

​​​​​​​4.5、Slave latency

图10中出现了slave latency(slave latency = 1),那么什么叫slave latency?

      如前所述,在每一个connection interval开始的时候,Master和Slave必须交互一次,哪怕两者之间交互的是empty packet(空包),但如果slave定义了slave latency,比如slave latency = 9,此时slave可以每9个connection interval才回复一次master,也就是说slave可以在前面8个connection interval期间一直睡眠,直到第9个connection interval到来之后,才回复一个packet给master,这样将大大节省slave的功耗,提高电池续航时间。当然如果slave有数据需要上报给master,它也可以不等到第9个connection interval才上报,直接像正常情况进行传输即可,这样既节省了功耗,又提高了数据传输的实时性。

​​​​​​​4.6、GAP层角色总结

      对上面提到的手机和设备B,在BLE通信过程中,随着时间的推移,他们的状态在发生变化,两者的关系也在发生变化,为此蓝牙spec根据不同的时间段或者状态给手机和设备B取不同的名字,即GAP层定义了如下角色:

  • advertiser。 发出广播的设备
  • observer或者scanner。可以扫描广播的设备
  • initiator。能发起连接的设备
  • master或者central。连接成功后的主设备,即主动发起packet的设备
  • slave或者peripheral。连接成功后的从设备,即被动回传packet的设备

图11通过时间把observer,initiator和central串起来了,其实这三个角色是相互独立的,也就是说一个设备可以只支持observer角色,而不支持initiator和central角色。同样,图11也把advertiser和peripheral串起来了,其实advertiser和peripheral也是相互独立的,即一个设备可以只作为advertiser角色,而不支持peripheral角色。

https://images2018.cnblogs.com/blog/1366713/201804/1366713-20180430003005175-1508520545.png

图11:GAP层角色

 

 

 

 

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值