蓝牙协议栈BLE

news2025/1/11 8:13:11

前言

这阵子用到蓝牙比较多,想写一个专栏专门讲解蓝牙协议及其应用,本篇是第一篇文章,讲解低功耗蓝牙和蓝牙协议栈。

参考网上各大神文章,及瑞萨的文章,参考GPT,并且加入了一些本人的理解。

图片部分源自网络,侵删。

有纰漏请指出,转载请说明。

学习交流请发邮件 1280253714@qq.com

专业名词解释

BLE(Bluetooth Low Energy),低功耗蓝牙

SIG(Special Interest Group),蓝牙技术联盟

ISM(Industry Science Medical),工业、科学、医学

IEEE(Institute of Electrical and Electronic Engineers),美国电气与电子工程师学会

HID(Hunman Interface Device),人机交互设备

PDU(Protocol Data Unit),协议数据单元

PHY(Physical Layer),物理层

LL(Link Layer),链路层

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

L2CAP(Logical Link Control and Adaptation Layer Prot),逻辑链路控制和适配协议

ATT(Attribute protocal),属性协议

GATT(Generic Attribute Profile),通用属性协议

SM(Security Manager),安全管理

GAP(Generic Access Protocol),通用访问协议

UUID(Universally Unique Identifier),通用唯一识别码

蓝牙是什么

蓝牙是一种无线通信技术,用于在短距离范围内传输数据。它可以连接不同类型的设备,如手机、电脑、音响等,使它们之间可以进行数据传输和通信。蓝牙技术广泛应用于无线耳机、蓝牙音箱、蓝牙键盘鼠标、蓝牙打印机等各种消费电子产品中。蓝牙技术具有低功耗、简单易用、成本低廉等优点,因此被广泛应用于各种领域。

蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

低功耗蓝牙BLE

BLE是低功耗蓝牙的英文缩写(Bluetooth Low Energy),是蓝牙4.0版本起开始支持的新的、低功耗版本的蓝牙技术规范。

蓝牙技术联盟(Bluetooth SIG)在2010年发布了跨时代的蓝牙4.0,它并不是蓝牙3.0的简单升级版本,而是全新的技术架构,蓝牙4.0版本分两种模式:单模蓝牙和双模蓝牙。

常见的蓝牙音箱,是典型的双模蓝牙,它需要传输大量的音频数据。而小米手环,蓝牙温度计则属于单模蓝牙。行业里一般不讲单模蓝牙,而是统一称为低功耗蓝牙。

蓝牙 4.0 协议版本在蓝牙 3.0 高速版本的基础上增加了低功耗的部分。 有些嵌入式设备在很多应用场景要求能耗非常低,但要求的传输速率不高,对于这类设备,可以仅实现 4.0 协议中低功耗能蓝牙部分,通过与支持双模的主机设备进行通信或者跟同类设备通信。广泛应用于计步器、心律监视器、智能仪表、传感器物联网等众多领域,大大扩展蓝牙技术的应用范围。

蓝牙 4.0 的芯片模式分为 Single mode 与 Dual mode。Single mode 只能与蓝牙 4.0 互相传输无法向下与 3.0/2.1/2.0 版本兼容;Dual mode 可以向下兼容 3.0/2.1/2.0 版本。

BLE有很多功能,例如

1.允许设备物理定位其他设备。例如,使用智能手机寻找启用了BLE的钥匙链,反之亦然。

2.通过BLE传输人机接口设备(HID)数据。例如,用于键盘、鼠标、遥控器等设备。

3.通过BLE传输传感器数据。

//这些功能都是通过“服务”的方式来进行,SIG定义的16bit的UUID服务包括
/// @name 16bit Service UUIDs in air format.
/// @sa https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx
///@{
/** Alert Notification Service */
#define ADV_UUID_ALERT_NOTIFICATION_SERVICE         "\x11\x18"
/** Battery Service */
#define ADV_UUID_BATTERY_SERVICE                    "\x0F\x18"
/** Blood Pressure */
#define ADV_UUID_BLOOD_PRESSURE_SERVICE             "\x10\x18"
...

硬件配置

1.大多数传感器应用倾向于使用集成处理器(SoC)硬件配置,因为它可以降低整体系统的复杂性和相关的印刷电路板(PCB)实现成本。

2.强大的计算设备,如智能手机和平板电脑通常选择外部处理器,配备相应的人机交互协议(HCI协议),这些协议可以是专有的或标准的。这种方法还允许集成专门的微控制器进行蓝牙低功耗(BLE)连接,而无需修改整体设计。

配置文件与协议

蓝牙规范明确区分了协议和配置文件的概念。这种区别是由于每个概念所服务的目的不同。总体规格分为:

协议:是所有符合蓝牙规范的设备所使用的构建块。协议本质上构成了实现不同数据包格式、路由、多路复用、编码和解码的层,这些层允许数据在对等点之间有效地发送。

配置文件:是功能的垂直切片,定义所有设备所需的基本操作模式(如通用访问配置文件和通用属性配置文件)或特定用例(接近配置文件,葡萄糖配置文件);概要文件本质上指定了应该如何使用协议来实现特定的目标,无论是通用的还是特定的。

广播与连接

BLE设备使用两种不同的通信方法,广播和连接。每种方法都有一定的优点和局限性,这两种方法都遵循通用访问配置文件(GAP)建立的某些程序。

面向连接时,角色为客户端和服务端

Central<-->Peripheral 允许连接

中央设备通常是具有更强的处理能力和电池电量,如智能手机。外围设备通常是处理能力较低且能源资源有限的设备,如健身追踪器、心率监测器等。

在连接的过程中,外围设备发送可连接的广播包,中央设备扫描到广播包后,发送连接请求,之后建立连接。一旦连接建立,外围设备和中央设备遵循一定的时序,定期传输数据,数据可以双向传输。

面向广播,角色为广播者和扫描者

Observer<-->Broadcast 只能广播

广播时,广播设备发送无连接的广播包到任何正在扫描的设备,只有通过广播才能在同一时刻内将一端数据传输到多端。

蓝牙广播包

先用通俗的方法来讲解一下蓝牙数据包的组成,比如我要将传感器数据(01A9)发出去,作为开发者,只需要将传感器数据(01A9)丢到应用层。

但是实际上BLE协议栈不只发传感器数据(01A9),我们先来看一下简单的广播情况,这种情况下,我们把设备A叫advertiser(广播者),设备B叫scanner或者observer(扫描者)。由于设备B可以同时接收到很多设备的广播,因此数据包还必须包含设备A的设备地址(0x8E89BED6)以确认该广播包来自设备A,链路层还要检查数据的完整性,即数据在传输过程中有没有发生窜改,为此引入CRC24对数据包进行检验 (假设为0x73D165) ,同时还要标明这一帧数据的长度。同时为了调制解调电路工作更高效,每一个数据包的最前面会加上1个字节的preamble(前导帧),preamble一般为0x55或者0xAA。这样,整个空中包就变成AA 8E89BED6 02 1A 48872D9B16EB 03 03 0A18 09 09 444C472D5052454C 05 FF CDAB A901 73D165 (注:空中包用小端模式表示!

以下是用纬图抓包得到的结果

有关服务的内容后面再讨论

前导序列+访问地址+PDU报头+PDU长度+PDU数据+CRC

preamble 1-2

Access-Address 4

PDU 2-258

CRC 3

广播模式

  //广播模式有很多种,包括

ADV_IND :可连接的非定向广播,表示当前设备可以接受任何设备的连接请求;

ADV_DIRECT_IND:可连接的定向广播,设备不能被主动扫描;

ADV_NONCONN_IND:不可连接的非定向广播,仅发送广播数据,而不被连接;

ADV_SCAN_IND:可扫描的非定向广播,设备可以被发现,既可以发送广播数据,也可以响应扫描发送扫描回应数据,但不能建立连接;

SCAN_REQ:主动扫描请求;

SCAN_RSP :主动扫描回复;

CONNECT_REQ :连接请求;

...
  /* Advertise mode operations                        */
    /* ************************************************ */
    /// Start non connectable advertising
    GAPM_ADV_NON_CONN,
    /// Start undirected connectable advertising
    GAPM_ADV_UNDIRECT,
    /// Start directed connectable advertising
    GAPM_ADV_DIRECT,
    /// Start directed connectable advertising using Low Duty Cycle
    GAPM_ADV_DIRECT_LDC,
    /// Update on the fly advertising data
    GAPM_UPDATE_ADVERTISE_DATA,

    /* Scan mode operations                             */
    /* ************************************************ */
    /// Start active scan operation
    GAPM_SCAN_ACTIVE,
    /// Start passive scan operation
    GAPM_SCAN_PASSIVE,
...

广播地址Broadcast-Address:是一个固定值(0x8E89BED6),扫描到数据包后验证确认是广播访问地址后才把它认定为广播包,否则认为是噪音或者无效包;

数据访问地址Access-Address:是一个随机值,不同的连接对应不同的值;当主机扫描到广播后,发送连接请求,这个请求会包含一个连接访问地址(断开重连后此地址不同,随机生成),连接上后数据包都是用这个地址;

数据传输单元PDU:蓝牙PDU(Protocol Data Unit)是蓝牙通信中的数据传输单元。

PDU是在蓝牙协议栈的不同层之间传输的数据包。在蓝牙协议栈中,PDU被用于在不同的层之间传递数据和控制信息。不同的层会根据自身的功能和需求对PDU进行封装和解封装。

在蓝牙物理层,PDU通常包含了物理层的控制信息,如同步字、帧类型、频道指示等。物理层的PDU被称为PHY PDU。

在蓝牙链路层,PDU被称为LL PDU,包含了链路层的控制信息和数据。LL PDU被用于处理蓝牙设备之间的连接管理、数据传输和错误检测等功能。

在蓝牙协议的更高层,如L2CAP(逻辑链路控制和适配协议)、RFCOMM(串行端口协议)和应用层,PDU被用于封装和传输更高层的数据和控制信息。

总之,蓝牙PDU是蓝牙通信中的数据传输单元,用于在不同层之间传递数据和控制信息。不同层的PDU具有不同的结构和功能,用于实现蓝牙协议栈的各项功能。

链路状态机

蓝牙链路状态机是指蓝牙设备在建立和维护蓝牙连接时所遵循的状态转换规则。蓝牙链路状态机由一系列状态和事件组成,设备在不同的状态下对不同的事件做出相应的响应。状态转换规则可以根据蓝牙协议规范进行定义和实现,以确保蓝牙设备之间的连接能够正确建立和维护。

Standby:待机状态;

Advertising: 发送广播包;

Scaning:主动或被动扫描;

Initiating:初始化连接设备;

Connection:连接上,可通信状态。

BLE协议栈

蓝牙协议栈有点难,但是如果学过OSI参考模型,这里应该就比较好理解一些。

其实就是每一层,向下封装,向上提供服务。

OSI参考模型是一种用于描述计算机网络体系结构的概念模型,它将网络通信过程划分为七个不同的层次。每一层都有不同的功能和责任,下面是对每一层的简要描述:

  1. 物理层(Physical Layer):该层负责传输数据的物理媒介,例如电缆、光纤等。它定义了电气、光学和机械特性,以及数据的传输速率、编码和调制等。

  2. 数据链路层(Data Link Layer):该层负责在物理连接上传输数据帧,并提供错误检测和纠正的功能。它将原始比特流转换为有意义的数据块,并通过帧同步和流量控制来管理数据的传输。

  3. 网络层(Network Layer):该层负责在不同网络之间进行数据路由和转发。它使用IP地址来标识和定位网络设备,并通过路由选择算法将数据包从源主机传输到目标主机。

  4. 传输层(Transport Layer):该层负责提供端到端的可靠数据传输。它通过分段和重组数据流,并为数据包提供错误检测和纠正,以确保数据的完整性和可靠性。

  5. 会话层(Session Layer):该层负责建立、管理和终止会话(Session)或连接。它提供了会话控制和同步功能,以及数据交换的管理机制。

  6. 表示层(Presentation Layer):该层负责数据的格式化和表示,以便不同系统之间的互操作性。它处理数据的加密、压缩和转换,以确保数据的安全性和可靠性。

  7. 应用层(Application Layer):该层负责提供特定应用程序的服务和协议。它包含了各种应用层协议,如HTTP、FTP、SMTP等,用于实现不同的应用功能。

每一层都在为上一层提供服务,并利用下一层的功能来实现数据通信。通过这种分层的结构,网络协议的设计和实现变得更加模块化和可扩展,不同的层次可以独立进行开发和优化。

协议栈分为主要的三层,控制器、主机和应用。

蓝牙协议栈通常由控制器、主机和应用三个部分组成,它们各自承担着不同的功能和责任。

  1. 控制器(Controller):控制器是蓝牙协议栈的底层硬件部分,通常由蓝牙芯片实现。控制器负责处理物理层和数据链路层的功能,包括发送和接收蓝牙信号、处理频率跳转、执行链路管理和错误处理等。控制器通过蓝牙HCI(Host Controller Interface)与主机进行通信。

  2. 主机(Host):主机是蓝牙协议栈的中间层,负责处理网络层、传输层和会话层的功能。主机通过蓝牙HCI与控制器通信,控制器将处理后的数据传输给主机。主机负责管理蓝牙连接、数据传输和协议处理,如路由选择、分段和重组数据、建立和终止会话等。

  3. 应用(Application):应用层是蓝牙协议栈的最上层,负责提供特定应用程序的服务和功能。应用层使用主机层提供的协议和接口,实现各种蓝牙应用,如文件传输、音频传输、设备控制等。应用层可以根据具体需求开发自定义的蓝牙应用程序。

总结起来,控制器负责底层物理层和数据链路层的处理,主机负责中间层的网络层、传输层和会话层的处理,应用层则负责最上层的应用程序的服务和功能。通过这种分层结构,蓝牙协议栈能够实现不同层次的功能划分和模块化开发,从而提供灵活且可扩展的蓝牙通信能力。

蓝牙协议栈是一组协议层,用于管理和控制蓝牙设备之间的通信。它分为以下几个层级,每个层级都有不同的功能和任务:

  1. 物理层(Physical Layer):物理层负责处理蓝牙设备之间的无线通信,包括射频信号的发送和接收,调制解调,频率跳频等。它定义了蓝牙设备的无线通信规范,确保设备之间可以正确地进行无线通信。

  2. 链路层(Link Layer):链路层负责建立和管理蓝牙设备之间的连接,包括设备的发现、配对和连接过程。它还负责处理链路的管理和控制,包括数据的分段和重组,错误检测和纠正等。

  3. L2CAP(Logical Link Control and Adaptation Protocol)层:L2CAP 层位于链路层和应用层之间,提供透明的数据传输服务,以便上层的应用程序可以通过蓝牙连接进行数据交换。它负责数据的分段和重组,通道管理,服务质量控制等。

  4. ATT(Attribute Protocol)层:ATT 层位于 L2CAP 层之上,用于在蓝牙设备之间传输和管理属性数据。它定义了属性的结构和操作,包括属性的读写、通知和指示等。

  5. GATT(Generic Attribute Profile)层:GATT 层是建立在 ATT 层之上的协议层,用于定义和管理蓝牙设备的属性数据库。它提供了一种统一的数据模型和访问机制,使得设备之间可以方便地交换和访问属性数据。

  6. 应用层(Application Layer):应用层是蓝牙协议栈的最上层,负责处理具体的应用逻辑和功能。它可以是各种不同的应用程序,如音频传输、数据同步、远程控制等。

总之,蓝牙协议栈的各层在不同的层次上负责管理和控制蓝牙设备之间的通信和数据交换。它们共同工作,实现了蓝牙设备之间的互操作性和功能扩展。

物理层(PHY)

物理层负责处理蓝牙设备之间的无线通信。它定义了蓝牙设备之间的无线传输方式和规范。

BLE蓝牙物理层使用2.4 GHz的ISM频段进行通信,采用频率跳变扩频技术,以减少干扰和提高通信质量。它将频率分成40个通道,每个通道的宽度为1 MHz,设备在通信过程中会不断地在这些通道之间进行频率跳变。

蓝牙物理层还定义了不同的传输速率,包括1 Mbps的基本速率和2 Mbps的增强速率。这些速率可以根据通信需求和设备能力进行选择。

此外,蓝牙物理层还定义了蓝牙设备之间的连接管理和功率控制,以确保通信的稳定性和可靠性。它还支持多点连接,使得一个设备可以同时与多个其他设备进行通信。

数据链路层(LL)

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

主机控制器接口(HCI)

控制器端的HCI通过标准化接口提供了与主机通信的手段。蓝牙规范将HCI定义为主机和控制器相互交互的一组命令和事件,以及数据包格式和一组流控制和其他过程的规则。此外,该规范还定义了几种传输,每种传输都为特定的物理传输(UART、USB、SDIO等)增强了HCI协议。

主机端的HCI接口提供了一种通过标准化接口与控制器通信的方式。与控制器端HCI类似,该层的实现是通过软件API或通过硬件接口(如UART或SPI)建立的。

特别说明,如果主机和控制器都在同一片SOC上(一般是低功耗产品),那么HCI接口就是通过软件API实现的。

逻辑链路控制与适应协议(L2CAP)

L2CAP(Logical Link Control and Adaptation Protocol)是蓝牙协议栈中的一个重要协议,位于主机层和应用层之间。它的主要功能是提供透明的数据传输服务,以便上层的应用程序可以通过蓝牙连接进行数据交换。

L2CAP 提供了以下主要功能:

  1. 数据分段和重组:L2CAP 将上层应用程序的数据分割成适合于蓝牙链路传输的小数据包,并在接收端重新组装成完整的数据。这样可以有效地利用蓝牙链路的带宽和资源。

  2. 可靠的数据传输:L2CAP 提供了可靠的数据传输机制,包括数据包的确认、重传和错误检测等。这样可以确保数据的完整性和可靠性,减少数据传输的错误和丢失。

  3. 通道管理:L2CAP 可以在蓝牙连接中创建多个逻辑通道(Logical Channel),每个通道可以独立地传输数据。这样可以实现同时进行多个应用程序的数据传输,提高蓝牙连接的效率和灵活性。

  4. 服务质量(Quality of Service):L2CAP 支持服务质量参数的设置,可以根据应用程序的需求调整数据传输的优先级、延迟和带宽等。这样可以满足不同应用场景下的实时性和可靠性需求。

总之,L2CAP 是蓝牙协议栈中的一个关键协议,提供了可靠的数据传输和通道管理功能,为上层的应用程序提供了高效、可靠的蓝牙数据交换服务。

L2CAP层为上层提供数据封装服务。因此,L2CAP允许使用数据传输进行逻辑端到端通信。从本质上讲,L2CAP作为一个协议多路复用器,从上层接收多个协议并将它们封装成标准的BLE数据包格式,反之亦然。L2CAP还负责包的碎片化和重组。在这个过程中,来自发送端的上层的大数据包被装入最大有效载荷大小27字节的BLE数据包。接收端则是相反的过程,零散的上层大数据包被多个小BLE数据包重新组装,并向上游发送给相应的上层实体。L2CAP层负责两个主要协议:属性协议(ATT)和安全管理协议(SMP)。此外,L2CAP还可以为高吞吐量的数据传输创建自己的用户定义通道,这种特性称为基于LE信用的流量控制模式。

属性协议(ATT)

蓝牙ATT(Attribute Protocol)是蓝牙协议栈中的一个重要协议,位于主机层和L2CAP之间。它是一种轻量级的协议,用于在蓝牙设备之间传输和管理属性数据。

ATT 协议的主要功能包括:

1. 属性定义:ATT 协议使用属性(Attribute)来表示设备的各种功能和数据。每个属性都有一个唯一的标识符(Attribute Handle)和一个类型(Attribute Type),用于标识和描述属性的特性。

2. 属性读写:ATT 协议提供了读取和写入属性值的操作。通过读取操作,一个设备可以获取另一个设备的属性值。通过写入操作,一个设备可以修改另一个设备的属性值。

3. 属性通知和指示:ATT 协议支持属性通知和指示功能。设备可以通过通知或指示方式向其他设备发送属性值的更新信息。接收设备可以及时获取到更新的属性值,以便做出相应的处理。

4. 属性控制:ATT 协议支持属性的控制操作,包括属性的添加、删除和修改等。设备可以通过控制操作来管理和配置属性,以适应不同的应用需求。

5. 属性权限:ATT 协议定义了属性的权限机制,用于控制对属性的访问权限。不同的属性可以设置不同的权限,以保护属性的安全性和隐私性。

ATT 协议是蓝牙低功耗(Bluetooth Low Energy,BLE)技术中的核心协议,用于实现低功耗、短距离通信和设备间的数据交换。它提供了灵活、高效的属性数据传输和管理机制,为蓝牙设备之间的通信和互操作性提供了基础。

ATT层使BLE设备能够向另一个BLE设备提供某些数据片段(称为属性)。在ATT上下文中,公开属性的设备称为服务器,对这些属性感兴趣并使用这些属性的对等设备称为客户端。设备的链路层状态(主或从)与设备的ATT角色无关。例如,主设备可以是ATT服务器或ATT客户端,而从设备也可以是ATT服务器或ATT客户端。一个设备同时是ATT服务器和ATT客户端也是可能的。本质上,ATT是一个简单的基于设备所呈现的属性的客户机/服务器无状态协议。客户端向服务器请求数据,服务器向客户端发送数据。该协议是严格的,这意味着在一个待处理请求的情况下(即对于已经发出的请求还没有收到响应),在响应被接收和处理之前,不能提交进一步的请求。在两个对等点同时充当客户端和服务器的情况下,这独立地适用于两个方向。每个ATT服务器包含以属性形式组织的数据,每个属性被分配一个16位的属性句柄,称为通用唯一标识符(UUID),一组权限,最后是一个值。实际上,属性句柄只是一个用于访问属性值的标识符。UUID指定值中包含的数据的类型和性质。当客户机希望从服务器读取或向服务器写入属性值时,它使用属性句柄向服务器发出读取或写入请求。服务器将使用属性值或确认进行响应。在读取操作的情况下,由客户端根据属性的UUID解析值并理解数据类型。另一方面,在写操作期间,期望客户端提供与属性类型一致的数据,如果不是这种情况,服务器可以自由地拒绝该操作。

通用属性配置文件(GATT)

通用属性配置文件(GATT)层是一个服务框架,它定义了使用属性协议(ATT)的所有子过程。GATT详细描述了如何通过BLE连接交换配置文件和用户数据。GAP定义了与设备的低级交互,而GATT只处理实际的数据传输过程和格式。

GATT还为SIG定义的所有基于GATT的配置文件提供了参考框架。通过有效地覆盖配置文件的精确用例,GATT确保了来自不同供应商的设备之间的互操作性。因此,所有标准BLE配置文件都是基于GATT的,必须遵守GATT才能正确运行。这使得GATT成为BLE规范的关键部分,因为与应用程序和用户相关的每个数据收集都必须根据其规则进行格式化、打包和传输。

GATT为交互BLE设备定义了两个角色:

客户端:向服务器发送请求,接收响应和潜在的服务器发起的更新。GATT客户端事先并不知道服务器的属性,因此它必须首先通过服务发现来查询这些属性的存在和性质。服务发现完成后,它开始读写在服务器上找到的属性,并接收服务器发起的更新。它对应于ATT客户端。

服务器:接收来自客户端的请求并发出响应。它还发送服务器发起的更新(当配置为这样做时),并且是负责存储用户数据并使用户数据对客户端可用的角色,以属性组织。销售的每个BLE设备必须至少包括一个基本的GATT服务器,该服务器可以响应客户端请求,即使只是返回错误响应。对应于ATT服务器。

GATT和GAP角色是完全独立的,但同时彼此兼容。例如,GAP中心设备和GAP外围设备都可以充当GATT客户机或服务器,甚至可以同时充当两者。

GATT使用ATT作为设备间数据交换的传输协议。这些数据在称为服务的部分中按层次组织,这些部分将概念上相关的用户数据片段(称为特征)分组。

通用访问配置文件(GAP)

通用访问配置文件(GAP)层负责整个连接功能。GAP处理设备的访问模式和过程,包括直接与应用程序和/或配置文件接口的设备发现,并处理设备的设备发现和与连接相关的服务。此外,GAP还负责安全特性的启动。

从本质上讲,GAP可以被视为BLE最顶层的控制层,因为GAP规定了设备如何执行设备发现和建立安全连接等控制过程。这样做是为了确保互操作性,从而允许来自不同供应商的设备之间的数据交换。

GAP规定了设备在BLE网络中可以扮演的四种角色:

广播器:设备用特定的数据做广告,让任何发起的设备知道,例如,它是一个可以建立连接的设备。此通告包含设备地址和可选的附加数据,如设备名称。

观察者:扫描设备在收到广告后,向广告方发送“扫描请求”。广告商的回应是“扫描回应”。这是设备发现的过程,在此之后,扫描设备意识到广告设备的存在,并且知道与广告设备的连接是可能的。

中心:发起连接时,中心设备必须指定要连接的对端设备地址。如果收到与对端设备地址匹配的通告,中心设备将发出请求,与该通告设备建立连接(链接)。它将在连接建立过程中考虑特定的连接参数。

外围设备:连接建立后,如果设备是发布设备,则充当从设备;如果设备是发起设备,则充当主设备。

从根本上说,GAP建立了不同的规则和概念集来规范和标准化设备的底层操作。特别是:

角色和它们之间的交互。

这些设备之间的操作模式和转换。

操作程序实现一致和可互操作的通信。

所有安全方面,包括安全模式和程序。

非协议数据的附加数据格式。

服务

在蓝牙低功耗(BLE)中,服务(Service)是指一组相关的特征(Characteristics)的集合,用于定义蓝牙设备之间的数据交换和功能。每个BLE设备可以提供一个或多个服务,每个服务可以包含一个或多个特征。

BLE服务通过唯一的服务UUID(Universally Unique Identifier)来标识,UUID是一个128位的标识符,用于唯一标识一个特定的BLE服务。常见的BLE服务包括:

1. Generic Access Service (GAP):GAP服务是BLE设备中必须提供的一个基本服务,用于管理设备的连接和广告。它包含了设备名称、外观、连接参数等信息。

2. Generic Attribute Service (GATT):GATT服务是BLE设备中定义的一种通用属性协议,用于在设备之间传输和管理属性数据。GATT服务包含了一个或多个特征,每个特征包含了一个或多个属性值。

3. Battery Service:电池服务用于获取BLE设备的电池电量信息。它包含了一个电池电量特征,可以通过读取该特征的值来获取设备的电池电量。

4. Heart Rate Service:心率服务用于获取BLE设备的心率数据。它包含了一个心率测量特征,可以通过读取该特征的值来获取设备的心率数据。

5. Environmental Sensing Service:环境传感服务用于获取BLE设备的环境传感数据,如温度、湿度、光照等。它包含了多个环境传感特征,每个特征对应一种环境传感数据。

6. Health Thermometer Service:健康温度计服务用于获取BLE设备的体温数据。它包含了一个体温测量特征,可以通过读取该特征的值来获取设备的体温数据。

这些是一些常见的BLE服务,不同的设备可能会提供不同的服务和特征,以实现各种不同的功能和应用。通过BLE服务,设备可以实现数据的传输、监测和控制等功能。

参考文章

全面且简单明了的蓝牙服务及UUID介绍

BLE低功耗蓝牙技术详解

协议栈文档

1. Introduction — DA14585/DA14531 SW Platform Reference Manual

服务

DA145XX Tutorial Create a Custom GATT Profile — DA145XX Tutorial Create a Custom GATT Profile

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内的几款强大的智能—AI语言模型

1、Tomchat &#xff1a;Tomchat https://www.tomchat.uk 支持gp4 支持 midjourny绘画 AI绘画功能&#xff1a;点我 介绍 1、4聊天 2、AI绘画 3、头像制作 1、国内百度研发的&#xff0c;文心一言&#xff1a; https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【…

基于SSM的校园驿站管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Nebula数据库安装

1、什么是nebula NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库&#xff0c;能够承载包含数千亿个点和数万亿条边的超大规模数据集&#xff0c;并且提供毫秒级查询。 2、利用docker-compose安装Nebula数据库 1、前提条件 主机中安装了docker主机中安装了Docke…

opencv旋转图像

0 、使用旋转矩阵旋转 import cv2img cv2.imread(img.jpg, 1) (h, w) img.shape[:2] # 获取图像的宽和高# 定义旋转中心坐标 center (w / 2, h / 2)# 定义旋转角度 angle 90# 定义缩放比例 scale 1# 获得旋转矩阵 M cv2.getRotationMatrix2D(center, angle, scale)# 进行…

STM32使用FAT文件系统-常见概念、代码走读

fat文件系统的所有外部接口都在ff.h中 格式化 挂载 使用文件系统的第一步&#xff0c;就是挂载。 函数原型&#xff1a;FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ static FATFS fs; FRESULT fres f_mo…

Lenovo联想拯救者笔记本Legion Y7000P IRH8 2023款(82YA)原装出厂Win11系统镜像

自带硬件设备的所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff1a;12.5GB 链接&#xff1a;https://pan.baidu.com/s/1a2lpGlwiJvCF7e0feN2QbA?pwdn4n6 提取码&a…

ELK集群搭建流程(实践可用)

一、概述 ELK 是一个由三个开源软件工具组成的数据处理和可视化平台&#xff0c;包括 Elasticsearch、Logstash 和 Kibana。这些工具都是由 Elastic 公司创建和维护的。 Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以将大量数据存储在一个或多个节点上&#xf…

日常开发小点汇总(2)之防止网络不佳,获取不到css,页面logo做法

防止网络不佳&#xff0c;获取不到css&#xff0c;页面logo做法 <div><a href"//www.baidu.com" class"logo">百度</a></div>.logo {display: inline-block;width: 256px;height: 0;background: url(./logobai.png);background-r…

AndroidStudio最下方显示不出来Terminal等插件

File->Settings->Plugins 然后在上面的输入框中输入Terminal&#xff0c;并将最右侧的对勾打上即可。 安装即可

【快应用】二级页面如何携带参数返回一级页面?

【关键词】 快应用、router、onBackPress 【问题背景】 页面栈有A、B两个页面&#xff0c;怎么在B页面中调A页面的方法或传参&#xff1f;场景是&#xff1a;A页面是列表页&#xff0c;B页面是详情页&#xff0c;B页面状态改变后返回A页面状态也要改变。 【解决方法】 在onB…

ABB 3BHB003688R0101接口模块

通信接口&#xff1a;3BHB003688R0101 接口模块通常具有各种通信接口&#xff0c;例如以太网、串口、CAN总线等&#xff0c;以便与其他设备和系统进行数据交换和通信。 数据传输&#xff1a;它通常用于将数据、信号或控制命令从一个设备传输到另一个设备&#xff0c;以实现设备…

电商系统架构设计系列(十一):在电商的交易类系统中,如何正确地使用 Redis 这样的缓存系统呢?需要考虑哪些问题?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;在电商的交易类系统中&#xff0c;如何正确地使用 Redis 这样的缓存系统呢&#xff1f;需要考虑哪些问题&#xff1f; 这篇文章&#xff0c;我们来聊聊。 引言 我们知道&#xff0c;大部分面向公众用户的互联网系统&a…

LeetCode 202 快乐数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 法一&#xff1a;哈希 使用哈希表循环判断每次经过平方和的数&#xff0c;如果为1则直接返回true&#xff0c;若之前存在过但不为1则直接返回false 代码 class Solution { public:// 计算…

如何消除误差?室内定位中的关键技术

1、互相关干扰消除技术 在室内复杂的定位环境中&#xff0c;接收机很有可能接收到定位源直射的强信号和经过反射、折射的弱信号&#xff0c;强信号和弱信号的功率差可以达到20&#xff5e;30dB。此时在弱信号的相关解算中&#xff0c;强信号产生的互相关峰与弱信号产生的自相关…

基于session实现发送短信和验证码登录注册功能

&#xff08;笔记总结自《黑马点评》项目&#xff09; 实现短信验证码登录流程&#xff1a; 一、发送短信 Controller层&#xff1a; PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {// TODO 发…

检测摄像头的fps

需求 项目中经常遇到不是摄像头就是网线的问题&#xff0c;曾经遇到一个项目算法日志一直报 warning&#xff0c;经过好几个小时的远程排查&#xff0c;发现是摄像头的 fps 不稳定&#xff0c;而且出现 fps 逐渐降低的情况&#xff0c;所以算法跑着跑着就挂了。 于是就需要开…

LeetCode每日一题:1123. 最深叶节点的最近公共祖先(2023.9.6 C++)

目录 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&…

linux 下 C++ 与三菱PLC 通过MC Qna3E 二进制 协议进行交互

西门子plc 有snap7库 进行交互&#xff0c;并且支持c 而且跨平台。但是三菱系列PLC并没有现成的开源项目&#xff0c;没办法只能自己拼接&#xff0c;我这里实现了MC 协议 Qna3E 帧&#xff0c;并使用二进制进行交互。 #pragma once#include <stdio.h> #include <std…

linux c++ 开发 - 05- 使用CMake创建一个动态库

外层CMakeList.txt中的内容&#xff1a; cmake_minimum_required(VERSION 3.16) PROJECT(HELLO) ADD_SUBDIRECTORY(lib bin)lib中CMakeLists.txt中的内容&#xff1a; SET(LIBHELLO_SRC hello.cpp) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})hello.h: hello.cpp: ADD_LIBR…

Liquid Studio 2023.2 Crack

Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说&#xff0c;直观的界面和全面的功能将帮助您节省…