BLE蓝牙协议详解

news2024/9/20 6:17:47

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 0x0C80

         min/max range: 7.5ms to 4s. Multiply factor: 1.25ms
         timeout 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: 0x00
        TX PHYs preference: 0x02
          LE 2M
        RX PHYs preference: 0x02
          LE 2M

4、Supervision Timeout:

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

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

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

相关文章

环境配置 --- miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块

环境配置 — miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因&#xff1a;fbegmm.dll文件出现问题 解决方案&#xff1a; 使用依赖分析工具https://github.com/lucasg/Dependencies/releases/tag/v1.11.1 检测报错提示的那个dll文件发现哪个文…

Nuclei:开源漏洞扫描器

Nuclei 拥有灵活的模板系统&#xff0c;可以适应各种安全检查。 它可以使用可自定义的模板向多个目标发送请求&#xff0c;确保零误报并实现跨多台主机的快速扫描。 它支持多种协议&#xff0c;包括 TCP、DNS、HTTP、SSL、文件、Whois、Websocket 等。 特征 模板库&#xf…

Java中的定时器(Timer)

目录 一、什么是定时器? 二、标准库中的定时器 三、实现定时器 一、什么是定时器? 定时器就像一个"闹钟"&#xff0c;当它到达设定的时间后&#xff0c;就会执行预定的代码。 例如&#xff0c;我们在TCP的超时重传机制中讲过&#xff0c;如果服务器在规定的时间…

XDMA - AXI4 Memory Mapped

目录 1. What is SG DMA2. Descriptor3. Transfer for H2CStep 1. The host prepares stored data and creates descriptors in main memoryStep 2. The host enables DMA interruptsStep 2. The driver initializes DMA with descriptor start addressStep 3. The driver writ…

数据结构(邓俊辉)学习笔记】串 06——KMP算法:构造next[]表

文章目录 1. 递推2. 算法3. 实现 1. 递推 接下来的这节&#xff0c;我们就来讨论 next 查询表的构造算法。我们将会看到非常有意思是&#xff0c; next 表的构造过程与 KMP 主算法的流程在本质上是完全一样的。 在这里&#xff0c;我们不妨采用递推策略。我们只需回答这样一个…

带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈&#xff01;关注我&#xff0c;每日带你深入浅出一个新面经。 我们要了解面经要如何“说”&#xff01; 很重要&#xff01;很重要&#xff01;很重要&#xff01; 我们通常采取总-分-总方式来阐述&#xff01;&#xff08;有些知识点&#xff0c;你可以去…

python脚本请求数量达到上限,http请求重试问题例子解析

在使用Python的requests库进行HTTP请求时&#xff0c;可能会遇到请求数量达到上限&#xff0c;导致Max retries exceeded with URL的错误。这通常发生在网络连接不稳定、服务器限制请求次数、或请求参数设置错误的情况下。以下是一些解决该问题的策略&#xff1a; 增加重试次数…

【负载均衡式在线OJ】项目设计

文章目录 程序源码用到的技术项目宏观结构代码编写思路 程序源码 https://gitee.com/not-a-stupid-child/online-judge 用到的技术 C STL 标准库。Boost 准标准库(字符串切割)。cpp-httplib 第三方开源网络库。ctemplate 第三方开源前端网页渲染库。jsoncpp 第三方开源序列化…

栈和队列有何区别?

栈和队列是两种常见的数据结构&#xff0c;它们分别用于解决不同类型的问题。在程序设计中&#xff0c;栈和队列都是非常重要的数据结构&#xff0c;因为它们可以帮助我们解决很多实际的问题。 栈&#xff1a; 首先&#xff0c;让我们来讨论栈, 栈是一种后进先出&#xff08;…

学NLP不看这本书等于白学!一书弄懂NLP自然语言处理(附文档)

随着人工智能技术的飞速发展&#xff0c;自然语言处理成为了计算机科学与人工智能领域中不可或缺的关键技术之一。作为一名长期致力于人工智能和自然语言处理研究的学者&#xff0c;今天给大家推荐的这本《自然语言处理&#xff1a;大模型理论与实践》正是学NLP自然语言非常牛逼…

黑神话悟空用什么编程语言

《黑神话&#xff1a;悟空》作为一款备受瞩目的国产单机动作游戏&#xff0c;其背后的开发涉及了多种编程语言和技术。根据公开信息和游戏开发行业的普遍做法&#xff0c;可以推测该游戏主要使用了以下几种编程语言&#xff1a; C&#xff1a; 核心编程语言&#xff1a;作为《黑…

【C++ Primer Plus习题】5.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Car {string brand;int year; }Car;int main() {int count 0;cout << "请问你家有多少辆车呢?" << endl;cin >> count;cin.get();Car* ca…

Java 入门指南:Java IO流 —— 序列化与反序列化

序列化 序列化是指将对象转换为字节流的过程&#xff0c;以便能够将其存储到文件、内存、网络传输等介质中&#xff0c;或者在不同的进程、网络或机器之间进行数据交换。 序列化的逆过程称为反序列化&#xff0c;即将字节流转换为对象。过反序列化&#xff0c;可以从存储介质…

【mysql】mysql之索引学习

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

面试搜狐大型模型算法工程师,感受非凡体验!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…

【Office】激活文件无法打开-DragonKMS--解决办法

【解决办法】右键 文件属性>>最下面勾选解除锁定即可打开。 【原因】&#xff1a;网络上下载的文件&#xff08;包括exe、zip等&#xff09;。

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…

esp32 控制 st7735s 显示屏(spi)

Lcd初始化后全屏为花屏&#xff0c;必须再把整个屏幕转成全底白色消除花屏后再显示图片&#xff0c;字符。 我理解为什么是花屏&#xff0c;因为只是初始化各个参数&#xff0c;显示内存现在还是为空&#xff0c;还没有执行0x2c命令。 图片 #include "driver/spi_master…

统一 transformer 与 diffusion !Meta 融合新方法剑指下一代多模态王者

本文引入了 Transfusion&#xff0c;这是一种可以在离散和连续数据上训练多模态模型的方法。 来源丨机器之心 一般来说&#xff0c;多模态生成模型需要能够感知、处理和生成离散元素&#xff08;如文本或代码&#xff09;和连续元素&#xff08;如图像、音频和视频数据&#xf…

软件测试-Selenium+python自动化测试

目录 一、元素定位 1.1一个简单的模板 1.2单选框radio定位实战 1.3下拉操作 1.4弹窗 1.5文件上传 1.6 iframe(类似于页中页,嵌套进去了) 二、元素定位实战 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览…