BLE蓝牙协议详解

news/2024/9/20 3:53:27/ 标签: 网络, 网络协议

BLE蓝牙协议详解

1、BLE协议栈

1、协议栈结构

蓝牙LE协议栈按功能分为三个层:ControllerHostApplication Profiles and Services

在这里插入图片描述

  • HCI event是按BLE Spec标准设计的,是BLE Controller和Host用来交互的事件;
  • GAP event是BLE host定义的一些协议栈流程交互时间通知型事件。
1、Controller

​ 控制层包含着蓝牙LE物理层(PHY)、数据链路层(LL)和控制端主机控制接口(HCI)。蓝牙LE物理层工作在无需许可的2.4GHz频段,它有以下特性:

  • 射频频率范围为2.4GHz~2.4835Hz;
  • 通道带宽为2MHz,工作频带分为40个频道,第k个通道的中心频率为2402+k×2Mhz,k=0,…,39
    用户的数据包在0~36通道传输;
  • 广播数据包在37、38和39通道传输;
  • CH37的频率为24.02Hz,CH38的频率为24.26Hz,CH39的频率是24.80Hz;
  • 采用高斯频移键控(GFSK)调制方案;
  • 采用跳频扩频(FHSS)来减少干扰和对抗衰落信道的影响。频率跳变的时间范围为7.5ms~4s;

(1)LL

​ LL(链路层,即Link Layer)它直接与蓝牙PHY层直接相连,并管理链路状态。BLE状态机如下图所示:

在这里插入图片描述

  • Standby:既不发送也不接收任何数据包,其他的所有状态都可以直接进入待机状态
  • Advertising:BLE正在广播数据包,广播可以被范围内的任何支持BLE的设备接收。
  • Scanning:BLE正在监听在范围内的其他BLE设备所广播的数据包。
  • Initiating:BLE正试图与另一个BLE设备建立连接。
  • Connected:BLE已经连接到另一个BLE的设备,两个设备之间可以交换数据。

(2)HCI

​ HCI层是BLE协议栈中的可选部分,它提供了Host和Controller之间的标准化通信接口HCI为数据包数据的传输和接收定义了一组命令和事件。当从控制器接收数据包时,HCI从控制器提取原始数据发送给主机。
​ HCI作用:如果省略了HCI层,就意味着Host层和Controller层的实现需要在同一个处理器之中;如果使用了HCI层,就可以比如系统的主处理芯片作为Host层,而系统的蓝牙芯片作为Controller层,它们之间可以通过串口、USB等连接。

2、Host

​ Host由Profiles(配置文件)组成。Profile提供了协议栈中的每个协议应该如何相互通信以及如何在特定的使用模型下进行协同工作的详细信息。
​ Host层包括了逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol,即L2CAP)、属性协议(attribute protocol,即ATT)、通用属性配置文件(generic attribute profile,即GATT)、安全管理协议(security manager protocol ,即SMP)和通用访问配置文件(generic access profile,即GAP)。

在这里插入图片描述

(1)L2CAP

​ L2CAP层处理蓝牙数据的收发:

  • 将来自蓝牙LE上层的数据封装成标准的蓝牙LE报文格式进行传输。
  • 根据ATT层和SMP层指定的链路配置,在接收时从标准的蓝牙LL层报文中提取数据。

(2)ATT

​ ATT基于GATT属性概要在客户端和服务端之间传输属性数据。ATT会将数据组织成如下图所示的属性:

在这里插入图片描述

  • attribute handle:由服务端分配的一个16位的标识符,客服端可以通过这个句柄来查询指定的attributes,相当于attribute一个“地址”。

  • attribute type:为全局唯一标识码(universally unique identifier,即UUID) ,长度为2或16字节,UUID的标准长度为16字节,但为了减少传输的数据量,蓝牙协议栈中会将用户提供的2字节UUID映射为一个16字节的UUID。

    UUID分为两种:Service UUIDCharacteristic UUID

  • attribute value:长度可变,与UUID对应的attribute value。

  • attribute permissions:指定属性的读写权限,以及读写权限所需的安全级别。

ATT只是一个protocol,还比较抽象,所以上层进一步定义了GATT。

(3)GATT

​ GATT封装了ATT,主要用来规范attribute中的数据内容,并将不同的attribute进行分组分类。负责协调蓝牙LE链路中配置文件的交换,配置文件包括诸如handle分配、UUID和权限等信息和数据。

(4)SMP

​ SMP通过安全算法对数据包进行加解密。

(5)GAP

​ GAP负责定义设备在蓝牙LE通信中的角色。它还管理连接的建立和安全。GAP直接与应用程序配置文件和App层连接。目前主要用来进行广播、扫描和发起连接。GAP能够访问链路层的状态机。

3、Profile

​ GATT包含了一系列的service,characteristic,service可以通过include 的方式包含其他service,一个service可以包含一个或多个characteristic(特征),characteristic是基本单位,包含了property,value和descriptor,property定义了该特征如何被使用,以及descriptor如何被访问,value就是这个特征的值。

​ 所有的service,characteristic都使用上面ATT的attibute来描述的。

2、协议报文

​ 一般来说,并不主动去操控蓝牙链路层(LL 层)直接发送数据,而是从 ATT 层 、L2CAP 层、LL 层层层封装打包,对端拿到数据是再层层解包, 也是说通过 BLE 传输的数据并不是都是有效数据,还有 “协议数据”。

在这里插入图片描述

​ 上图可以看到各个协议层的 HEADER , LE 1M UNCODED PHY时,Preamble是 1个字节, LE 2M UNCODED PHY时,Preamble是 2个字节。

​ 在BLE 4.0 和 4.1 中,最大 ATT Payload 为 20 字节,在BLE 4.2 和 5.0 中,一种称为数据长度扩展 (DLE) 的新功能允许 ATT 有效负载最多容纳 244 字节的数据,一般 DLE 是可以配置的,从单包数据利用率来看,DLE 调至最大更好,很多蓝牙芯片默认设置就是 DLE 最大。

1、广播报文

​ BLE广播包括广播advertising报文、广播数据、广播参数、搜寻广播。

​ 在一个BLE设备中GAP可以实现:发现蓝牙设备和广播报文并连接、广播并接受连接、发送广播报文、发现蓝牙设备和广播报文但不连接(仅扫描)。对于连接模式而言,两个设备之间可以双向传输数据;对于一个正在广播中的设备而言,无法接收数据(但有一个例外:可以在广播数据中设置接收和回复scan requests报文)。

​ 在蓝牙协议栈中,有40个通道,通道之间的中间间隔为2MHz。其中通道37~39称为主广播通道,而其余37个通道称为次广播通道(在连接期间也用于数据传输)。如果设备需要使用次广播通道,则需要在主广播通道中发送一个指向次广播通道的广播数据包。

​ 如下图所示为广播包的格式,它最终会被封装在LL层packet中的PDU中。

在这里插入图片描述

1、PDU Type

PDU根据不同的广播用途分为了多个类别,具体图下:

在这里插入图片描述

主要含义就是不同作用的广播有不同的类型标志区分,其中在Bluetooth 5.0版本引入的类型,它允许设备在次广播通道进行广播,它的作用是允许更多的广播内容。

  • ADV_EXT_IND: 在主广播通道发送的扩展广播 (Connectable Scannable Undirected广播类型不可用);
  • AUX_ADV_IND: 在次广播通道发送的扩展广播 (Connectable Scannable Undirected广播类型不可用);
  • AUX_SYNC_IND: 周期性广播;
  • AUX_CHAIN_IND: 与其他广播类型一起使用,以保存额外的广播数据(广播包的chain,即多个广播包之间由chain建立关系);

2、RFU(Reserved for future use):保留。

3、ChSel:如果广播设备支持LE Channel Selection Algorithm #2算法,该位会被置1。

4、TxAdd:如果广播设备的地址是随机的,该位置1;如果是公共的,该位置0。

5、RxAdd:如果目标设备的地址是随机的,该位置1;如果是公共的,该位置0。

6、Length:packet中有效数据的长度。

7、PDU Payload:广播数据包的内容及其最大大小取决于PDU类型。包含广播数据的PDU类型有:ADV_IND,ADV_NONCONN_IND, ADV_SCAN_IND;ADV_EXT_IND, AUX_ADV_IND, AUX_SYNC_IND, AUX_CHAIN_IND

在这里插入图片描述

对于广播类型AD type来说,它有如下取值(具体定义参考官方文档Core Specification Supplement):

在这里插入图片描述

2、蓝牙ibeacon报文

​ BLE ibeacon功能服务端一直广播,广播包里包含的主要是

​ 1、本基站的设备类型。

​ 2、本基站的编号。

​ 3、本基站的发射功率。

​ 客户端靠近基站之后收到了广播包的信息,通过广播包的设备类型判断出这是个ibeacon设备,通过广播包里记载的发射功率与自己接受到的信号功率对比得出和基站的距离。

AD Field LengthTypeCompany IDiBeacon TypeiBeacon LengthUUIDMajorMinorTX Power
  • AD Field Length: Advertisement Data 的长度,表示有用的广播信息长度。

  • Type: 广播类型。

  • Company ID: 数据字段以两字节的公司 ID 码开始。SIG 将这些 ID 码发放给公司,其中 0x004C 代表的是Apple id(只有这个 ID,设备才会叫 iBeacon)。

  • iBeacon Type: 字节 0x02 代表这个设备是 Beacon。

  • iBeacon Length: 剩下字段的长度。

  • UUID: 规定为 ISO/IEC11578:1996 标准的 128 位标识符。

  • Major、Minor: 由 iBeacon 发布者自行设定,都是 16 位的标识符。比如,连锁店可以在 Major 写入区域资讯,可在 Minor 中写入个别店铺的 ID 等。另外,在家电中嵌入 iBeacon 功能时,可以用 Major 表示产品型号,用 Minor 表示错误代码,用来向外部通知故障。

  • TX Power: APP 通过 iBeacon 发送信号强度估算出的在 1 米的时候 RSSI 强度。

    hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 1a ff 4c 00 02 15 fd a5 06 93 a4 e2 4f b1 af cf c6 eb 07 64 78 25 29 11 30 39 cd 00
    

    这里hcitool cmd是Bluez提供的操作蓝牙HCI层的指令,-i hci0是指定使用哪个适配器,0x08是OGF指令、这里指BLE而不是BE/EDR的操作,0x0008是OCF指令、这里是指设置广播数据,后面1e之后到最后00之前的部分正是我们前面讲的ibeacon广播的数据。这里有个小坑注意,1e后面必须跟31个字节的数据,不够的补 00(因为BLE广播数据的长度是31),而1e(30)指的是有效数据的长度,ibeacon的数据长度是30所以这里是1e。

3、ATT协议

ATT协议负责为服务端设备提供客户端能读写的指定格式化的数据,以及客户端访问、写入和读取数据的机制

​ ATT协议定义了一个叫attribute的数据结构,该数据结构由下列四个字段组成:

在这里插入图片描述

​ server端相当于维护一个Attribute的表,BLE服务端的所有Attributes都通过增加Attribute handle的值存储在它维护的表中。

​ ATT协议还定义了读写属性的方式。具体的方式取决于发起属性访问过程的是客户端还是服务端。

1、客户端发起属性访问,有两种操作——WriteRead

  • 客户端使用Read从服务器读取属性的值,服务器响应属性的值。
  • 客户端使用Write将一个属性的值写入服务器,服务器响应写操作是否成功。

2、服务端发起属性访问,有两种操作——NotificationIndication

  • Notification:当Attribute发生改变时,服务端使用该种方式向客户端发送更新后的属性值,客户端收到后不响应此操作。
  • Indication:与Notification类似,但是客户端必须发送是否正确收到该Attribute的响应。

Attribute访问权限
访问权限决定客户端是否可以读、写或读写其中某个属性值,可选权限如下:

  • None:没有读写权限
  • Readable:可读
  • Writable:可写
  • Readable and writable:可读写
3、GATT协议

​ GATT协议层定义了一个框架,在该框架中,服务端数据库上的Attribute可以被组织起来而有一定的层次关系。GATT层定义了一个4层树形框架,其中根节点为Profile(配置),它有不同的Services(服务),不同的服务有不同的Characteristics(特征),不同的特征通过一个具体的Value(值)或者Descriptor(描述符)来定义,如下图所示。

在这里插入图片描述

1、Characteristic

Characteristic是一个基本的存储单元,即一个attribute类型。每个Characteristic由以下三个部分组成:

  • 特征声明(Characteristic declaration)
  • 特征值(Characteristic value):实际存储的应用数据
  • 特征描述符(Characteristic descriptor(s)):该字段可选,它会存储更多关于Characteristic的信息。

这三部分的组成都包含一个Attribute

2、Services

Services主要用来组织数据而不是存储数据,它分为主服务(primary service),次服务(secondary service)和包含服务(include service)。Service是多个Chracteristic的集合。(Primary)Service可以包含一个或多个secondary service

3、Profile

Profile是上面分层结构的最顶层,它包含了服务端支持的特定服务。有些服务是可选的,而有些服务是必须实现的,这是为了确保两个有相同GATT profile的设备能够相互通信。

HCI CMD协议

HCI这一层仅仅是将Link Layer所提供的功能封装成特定的Command和Event。

如下面两条命令是简单的通过hci cmd去使能ble的广播并且设置广播数据,

	# enable BLE advertising
hcitool -i hci0 cmd 0x08 0x000A 01# set advertising data to Eddystone UUID
hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00

上面例子中,

  • 0x08:是 OGF(OpCode Group Field)表示 LE Controller Commands;

  • 0x000A:是 OCF(OpCode Command Field)表示 LE enable BLE advertising;

  • 01:表示使能广播

  • 0x08:是 OGF(OpCode Group Field)表示 LE Controller Commands;

  • 0x0008:0x0008是OCF指令,指设置广播数据;

  • 1e 02 01 06 03 03 aa fe 17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00:表示广播数据,最原始的广播数据长度必须为31,不够用0补齐。

1、HCI Command格式

OCF(10bit) + OGF(6bit) + Parameter Total Length + Parameter1 + …

OCF和OGF共同组成16bit的操作码(OpCode);

OGF是OpCode Group Field的简称,长度是6 bits,代码该HCI命令所属的group,对应上面HCI命令中的0x08;

OCF是OpCode Command Field的简称,代码特定的HCI命令,对应上面HCI命令中的0x000A/0x0008;

Parameter Total Length,指示该Command所有参数的长度;

Parameter1、Parameter2、等等,16 bits的参数,由具体的Command决定。

2、BLE常用的HCI CMD
  1. LE Set Event Mask (OCF = 0x0001)

设置 LE 事件掩码以启用或禁用特定的 LE 事件。

sudo hcitool -i hci0 cmd 0x08 0x0001 <event_mask>
  1. LE Read Buffer Size (OCF = 0x0002)

读取 LE 数据包缓冲区的大小。

sudo hcitool -i hci0 cmd 0x08 0x0002
  1. LE Read Local Supported Features (OCF = 0x0003)

读取控制器支持的 LE 特性。

sudo hcitool -i hci0 cmd 0x08 0x0003
  1. LE Set Random Address (OCF = 0x0005)

设置控制器的随机地址。

sudo hcitool -i hci0 cmd 0x08 0x0005 <random_address>
  1. LE Set Advertising Parameters (OCF = 0x0006)

设置广告参数。

sudo hcitool -i hci0 cmd 0x08 0x0006 <adv_interval_min> <adv_interval_max> <adv_type> <own_addr_type> <peer_addr_type> <peer_addr> <adv_channel_map> <adv_filter_policy>
  1. LE Set Advertising Data (OCF = 0x0008)

设置广告数据,广告数据需对应AD协议

sudo hcitool -i hci0 cmd 0x08 0x0008 <adv_data>
  1. LE Set Scan Response Data (OCF = 0x0009)

设置扫描响应数据。

sudo hcitool -i hci0 cmd 0x08 0x0009 <scan_rsp_data>
  1. LE Set Scan Parameters (OCF = 0x000B)

设置扫描参数。

sudo hcitool -i hci0 cmd 0x08 0x000B <scan_type> <scan_interval> <scan_window> <own_addr_type> <scan_filter_policy>
  1. LE Set Scan Enable (OCF = 0x000C)

启用或禁用扫描。

sudo hcitool -i hci0 cmd 0x08 0x000C <scan_enable> <filter_duplicates>
  1. LE Create Connection (OCF = 0x000D)

创建连接。

sudo hcitool -i hci0 cmd 0x08 0x000D <scan_interval> <scan_window> <initiator_filter_policy> <peer_addr_type> <peer_addr> <own_addr_type> <conn_interval_min> <conn_interval_max> <conn_latency> <supervision_timeout> <min_ce_length> <max_ce_length>
  1. LE Connection Update (OCF = 0x0013)

更新连接参数。

sudo hcitool -i hci0 cmd 0x08 0x0013 <conn_handle> <conn_interval_min> <conn_interval_max> <conn_latency> <supervision_timeout> <min_ce_length> <max_ce_length>
  1. LE Set Data Length (OCF = 0x0022)

设置数据长度。

sudo hcitool -i hci0 cmd 0x08 0x0022 <conn_handle> <tx_octets> <tx_time>
3、链路层数据长度相关指令
  1. LE Set Data Length (0x08|0x0022)

设置指定连接的最大传输数据长度和传输时间。

sudo hcitool -i hci0 cmd 0x08 0x0022 <conn_handle> <tx_octets> <tx_time>

在这里插入图片描述

其中connecttion handle参数可以从连接完成报文中获取,

在这里插入图片描述

  1. LE Read Suggested Default Data Length (0x08|0x0023)

读取控制器建议的默认传输数据长度和传输时间。

sudo hcitool -i hci0 cmd 0x08 0x0023
  1. LE Write Suggested Default Data Length (0x08|0x0024)

设置控制器建议的默认传输数据长度和传输时间。

sudo hcitool -i hci0 cmd 0x08 0x0024 <suggested_max_tx_octets> <suggested_max_tx_time>
  1. LE Read Maximum Data Length (0x08|0x002F)

读取控制器支持的最大传输数据长度和传输时间。

sudo hcitool -i hci0 cmd 0x08 0x002F

在这里插入图片描述

ATT协议和GATT协议的区别

在 Bluetooth Low Energy (BLE) 中,ATT(Attribute Protocol)和 GATT(Generic Attribute Profile)是两个核心协议,它们定义了数据传输和通信的机制。尽管它们紧密相关,但它们在 BLE 架构中的角色和功能是不同的。

1、ATT(Attribute Protocol)

ATT 是一个底层协议,用于在 BLE 设备之间传输数据。它定义了如何在两个设备之间传输数据的基本机制。每个 BLE 设备上的数据都组织成一组属性(Attributes),每个属性由以下几个部分组成:

  1. Handle:一个唯一的标识符,用于引用该属性。
  2. Type:一个 UUID,用于标识属性的类型。
  3. Value:属性的数据值。

ATT 的主要功能包括

  • Discovering Attributes:发现并列出设备上的所有属性。
  • Reading Attributes:读取属性的值。
  • Writing Attributes:写入新的值到属性。
  • Indicating and Notifying:允许设备主动通知或指示属性值的变化。
2、GATT(Generic Attribute Profile)

GATT 是基于 ATT 协议之上的一个更高级的协议,它定义了在 BLE 设备之间交换复杂数据的方式。GATT 提供了一个框架,用于定义服务(Services)和特征(Characteristics),从而使 BLE 设备能够组织和访问数据。

GATT 的主要组件包括

  1. Services(服务)
    • 一个服务是一个逻辑上的数据集合,包含一个或多个特征。
    • 每个服务都有一个唯一的 UUID,可以是标准的 16 位 UUID 或自定义的 128 位 UUID。
  2. Characteristics(特征)
    • 一个特征是服务中的一个数据项,包括一个值和描述该值的属性。
    • 每个特征也有一个 UUID。
    • 特征可以包括描述符(Descriptors),提供更多的元数据。

GATT 的主要功能包括

  • Discovering Services and Characteristics:发现并列出设备上的所有服务和特征。
  • Reading and Writing Characteristics:读取和写入特征的值。
  • Subscribing to Notifications and Indications:订阅特征的通知和指示,以接收实时数据更新。
3、关系和区别
  1. 层次关系
    • ATT 是底层协议:它定义了如何在两个 BLE 设备之间传输数据的基本机制。
    • GATT 是基于 ATT 的高级协议:它定义了如何组织和访问这些数据,以实现更复杂和有意义的通信。
  2. 功能区别
    • ATT:主要处理基本的读、写、通知和指示操作。
    • GATT:提供了一个框架,允许将数据组织成服务和特征,以便于发现和操作。
  3. 应用场景
    • ATT:任何需要直接访问 BLE 设备数据的操作都会涉及 ATT。
    • GATT:适用于需要组织和访问复杂数据的应用,如健康监测设备、智能家居设备等。
示例

假设你有一个心率监测器(Heart Rate Monitor),它使用 GATT 来组织数据:

  1. 服务(Service)
    • Heart Rate Service,UUID 为 0x180D
  2. 特征(Characteristic)
    • Heart Rate Measurement,UUID 为 0x2A37,包含当前心率值。
    • Body Sensor Location,UUID 为 0x2A38,包含传感器的位置(如手腕、胸部等)。

在这个例子中,心率监测器上的数据被组织成一个服务和两个特征。GATT 定义了如何发现这个服务和特征,以及如何读取心率值或传感器位置。而 ATT 协议处理这些操作的具体数据传输。

总结
  • ATT 是 BLE 中的底层协议,负责基本的数据传输操作。
  • GATT 是构建在 ATT 之上的高级协议,定义了如何组织和访问数据。
  • ATT 提供了基础的读写和通知功能,而 GATT 提供了一个结构化的框架,以便于发现和使用这些数据。

通过理解 ATT 和 GATT 的关系和区别,可以更好地设计和实现 BLE 应用程序。

BLE传输速率

在 BLE 连接中,一个连接间隔内可以发送多个数据包,这受限于以下几个因素:

  1. 连接间隔:两个连续连接事件之间的时间,一般为7.5ms-4s。
  2. 数据包数量:一个连接事件中可以传输的数据包数量,受限于链路层的调度和缓冲区大小。
  3. 数据包大小:每个数据包的大小,通常受限于 MTU 大小。
  4. 链路层发包大小

​ 一旦BLE设备建立连接后,两个设备会以相等的时间间隔交换数据,这个间隔成为连接间隔(Connection Interval),间隔范围是7.5ms-4s。并且,要交互的数据都发生在Connection Event之间,其余时间处于sleep状态,即使应用层无数据交互,整个链路也会以Connection Interval间隔交互数据(空包),应用层数据多,Connection Event时间就越长,sleep时间就越短。

在这里插入图片描述

​ 因此,连接间隔决定着传输频率,值越小,发送数据越快,但功耗也会越大。整个BLE的传输速度由连接间隔、每个间隔的数据包数量和MTU共同决定。

1、计算步骤
  1. 每秒的连接事件数量
    连接事件数量 = 1000 m s / 连接间隔 连接事件数量=1000ms/连接间隔 连接事件数量=1000ms/连接间隔

  2. 每秒最大传输数据量
    每秒最大传输数据量 = 每秒连接事件数量 ∗ 每个连接事件中数据包的数量 ∗ M T U 每秒最大传输数据量=每秒连接事件数量*每个连接事件中数据包的数量*MTU 每秒最大传输数据量=每秒连接事件数量每个连接事件中数据包的数量MTU

  3. 转换为 KB/s
    传输速率 = 每秒最大传输数据量 / 1024 传输速率=每秒最大传输数据量/1024 传输速率=每秒最大传输数据量/1024

  4. 考虑协议开销和传输效率

    实际传输速率需要考虑协议开销(LL层和PHY层开销)和其他因素。

2、提升蓝牙速率设置参数

1、Data Length Extension (DLE) Parameters:

  • Max TX Octets: 增加每个数据包的最大传输字节数。
  • Max TX Time: 增加每个数据包的最大传输时间。

可以使用HCI CMD命令协议设置,格式如下:

sudo hcitool -i hci0 cmd 0x08 0x0022 <conn_handle> <tx_octets> <tx_time>

示例:

hcitool -i hci0 cmd 0x08 0x0022 0 0x00 0xfb 0x00 0x90 0x42
  • 0 0x00:连接句柄。
  • 0xfb 0x00:251字节。
  • 0x90 0x42:17040微秒。

一般由server端设置,server端设置成功后,会主动跟client端交互配置参数,最终两端连接参数相同。

在这里插入图片描述

2、Connection Interval:

  • Connection Interval Min: 设置为较短的时间间隔,以增加数据传输频率。
  • Connection Interval Max: 设置为与最小时间间隔相同,或者略长,以保持连接稳定。
hcitool lecup --handle 0x0000 --min 6 --max 6 --latency 0 --timeout 500
参数含义如下:
lecup <handle> <min> <max> <latency> <timeout>Options:--handle=<0xXXXX>  LE connection handle--min=<interval>   Range: 0x0006 to 0x0C80--max=<interval>   Range: 0x0006 to 0x0C80--latency=<range>  Peripheral latency. Range: 0x0000 to 0x03E8--timeout=<time>   N * 10ms. Range: 0x000A to 0x0C80min/max range: 7.5ms to 4s. Multiply factor: 1.25mstimeout range: 100ms to 32.0s. Larger than max interval

3、PHY Mode:

  • 使用 2M PHY 模式,以提高传输速率(需要设备支持 BLE 5.0 或更高版本)。
 hcitool -i hci0 cmd 0x08 0x0031 0x00 0x02 0x02参数含义如下:All PHYs preference: 0x00TX PHYs preference: 0x02LE 2MRX PHYs preference: 0x02LE 2M

4、Supervision Timeout:

  • 确保监督超时足够长,以防止连接在高负载下断开。

http://www.ppmy.cn/news/1516659.html

相关文章

《Spring Boot 集成 Swagger:打造高效接口文档与开发体验》

Swagger 一.导语&#xff1a; ​ 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前端调用后端&#xff0c;还是后…

Vue(1)——创建实例

Vue创建实例 Vue是用于构建用户界面的渐进式框架。 创建Vue实例&#xff0c;初始化渲染 准备容器引包(开发版本/生产版本)创建Vue实例指定配置项&#xff0c;渲染数据 el指定挂载点 data提供数据 <!-- 准备容器 --><div id"app"><h1>{{msg}}<…

【C#】【EXCEL】Bumblebee/Classes/ExFont.cs

Bumblebee/Classes/ExFont.cs Flow diagram 根据您提供的代码和要求&#xff0c;我将创建一个流程图来展示ExFont类的结构。这个流程图将使用中英双语标注&#xff0c;并对应到代码中的英文。 #mermaid-svg-uaTfYlccE1dTu1A6 {font-family:"trebuchet ms",verdana,…

git-20240822

目录 初始化仓库 Git init Git init project --bare 查看提交的记录 git log --prettyoneline 查看当前git远程库地址 git remote -v 查看详细提交记录 git log 撤出暂存区的文件 git reset HEAD file(.代表全部文件&#xff09; 提交数据到远程仓库 git config --global push.…

高级前端工程师React面试题

什么是React&#xff1f;React和Vue有什么区别&#xff1f;请描述React的组件生命周期。什么是JSX&#xff1f;React中的state和props有什么区别&#xff1f;请解释React中的虚拟DOM。什么是React Hooks&#xff1f;useState和useEffect Hooks有什么用途&#xff1f;在React中&…

docker常见指令——镜像指令and容器指令

docker镜像指令 查看镜像 docker images 搜索镜像 docker search 镜像名 上传镜像 docker pull 镜像名 或 docker pull 镜像名&#xff1a;tag 注:不加:tag表示最新版本 &#xff0c;加:tag表示指定版本 运行镜像 docker run 镜像名 保存镜像 docker save 镜像名/镜像id -o 要…

【前端基础篇】JavaScript基础介绍

文章目录 前言初始JavaScriptJavaScript是什么发展历史JavaScript和HTML和CSS之间的关系JavaScript的运行过程JavaScript的组成 JavaScript的书写形式行内式内嵌式外部式注释 输入输出基础语法变量数据类型 运算符 JavaScript对象对象new关键字 常用对象数组创建数组数组操作函…

若依权限控制前端+后端实现思路梳理(PreAuthorize、hasPermi、v-hasPermi)

一、权限控制引发的思考 引言 最近接手了公司的一个项目&#xff0c;实施反馈说&#xff0c;客户那边要求对不同的权限的用户操作权限做限制。场景就是&#xff0c;比如一个项目列表&#xff0c;这部分数据有可能是针对某个公司某个部门的&#xff0c;对应不同的部门用户能看…

Leetcode Hot 100刷题记录 -Day2(哈希表)

一、字母异位词分组 问题描述&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 简单理解&#xff1a;字母异位词就是字母个数和种类都相同&#xff0c;但字…

高性能web服务器4——Nginx反向代理A

Nginx 反向代理 Nginx 的反向代理功能是其最强大的特性之一&#xff0c;它允许 Nginx 作为中间层来接收客户端的请求&#xff0c;并将这些请求转发到后端服务器。这种架构不仅可以提高安全性&#xff0c;还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向…

深度学习-11-为什么AI需要GPU

几十年前,CPU 作为通用处理器几乎处理所有计算任务,那个时代的显卡有助于加快应用程序中图形的绘制速度。但在今天ChatGPT引爆的人工智能iPhone时刻,GPU成为了整个行业最具主导地位的芯片之一。大家都在抢购GPU,龙头企业英伟达也因此赚的盆满钵满。 服务器中有处理器、内存…

【C++ 面试 - 内存管理】每日 3 题(三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

如何解决 Cloudflare | 使用 Puppeteer 和 Node.JS

我认为&#xff0c;现在自动化任务越多&#xff0c;越能体现它们的价值&#xff0c;因此挑战也变得更加明显和困难。例如&#xff0c;Cloudflare 目前提供了强有力的安全措施来保护网站免受所有形式的自动化工具的侵扰。 但对于从事自动化项目&#xff08;如网络爬虫、数据提取…

依赖包更新了但是没有release,如何安装更新的依赖包

问题描述:有一个python仓库mmrotate,仓库更新了support training mmrotate on NPU (#806)这个commit, 但是pip没有release,怎么安装这个新的commit? 解决: 要安装未发布的commit&#xff0c;可以通过从Python仓库直接安装特定commit的版本。以下是安装mmrotate仓库中支持在NP…

PG库表被锁怎么办?

查询PG库是否有被锁的表 SELECT t.relname AS table_name,l.locktype,l.database,l.pid,l.mode,l.granted FROM pg_locks l JOIN pg_class t ON l.relation t.oid WHEREt.relkind r ANDl.mode IS NOT NULL;解锁表 根据查询结果中的进程ID&#xff08;‌PID&#xff09;‌&a…

CentOS网址

CentOS网址 CentOS镜像

网络通信编程UDP/TCP

一、不同体系结构间的互联互通 通信本质&#xff1a;不同主机上进程间的通信。通过 IP 标识网络中的一台主机&#xff0c;本质上是 32 位的整型数据&#xff1b;通过端口号标识某个进程&#xff0c;本质上是 16 位的整型数据。网络模型&#xff1a;主要有 C/S&#xff08;客户…

文件上传漏洞(看过就能学会)

一、什么是文件上传漏洞&#xff1f; 在有上传功能的系统中&#xff0c;如果应用程序没有对用户上传的文件做严格的校验&#xff0c;那么可能会导致用户上传脚本文件&#xff0c;然后用户再通过访问这些文件的方式&#xff0c;来达到执行该脚本文件&#xff0c;从而控制服务器…

一文讲明白如何将shell脚本闭源

目录 目的使用帮助举例实现:打包查看检查打包后的文件验证问题1:注意事项:目的 我们使用的脚本都是可以直接查看,因为这个是一个解释性的执行过程,那么有没有可能让脚本闭源呢,也就是说,我们辛苦的写的脚本,不想让别人看到,有没有好的办法呢? 这里我们可以使用makese…

Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)

Kakfa的核心概念-Replica副本&#xff08;kafka创建topic并指定分区和副本的两种方式&#xff09; 1、kafka命令行脚本创建topic并指定分区和副本2、springboot集成kafka创建topic并指定分区和副本2.1、springboot集成kafka2.1.1、springboot集成kafka创建topic并指定5个分区和…