Bluetooth LE AT 示例

[English]

本文档主要介绍 Bluetooth® Low Energy AT 命令集 的使用方法,并提供在 ESP 设备上运行这些命令的详细示例。

简介

ESP-AT 当前仅支持 Bluetooth LE 4.2 协议规范,本文档中的描述仅适用于 Bluetooth LE protocol 4.2 协议规范。请参考 核心规范 4.2 获取更多信息。

Bluetooth LE 协议架构

Bluetooth LE 协议栈从下至上分为几个层级:Physical Layer (PHY)Link Layer (LL)Host Controller Interface (HCI)Logical Link Control and Adaptation Protocol Layer (L2CAP)Attribute Protocol (ATT)Security Manager Protocol (SMP)Generic Attribute Profile (GATT)Generic Access Profile (GAP)

  • PHY:PHY 层主要负责在物理信道上发送和接收信息包。Bluetooth LE 使用 40 个射频信道。频率范围:2402 MHz 到 2480 MHz。

  • LL:LL 层主要负责创建、修改和释放逻辑链路(以及,如果需要,它们相关的逻辑传输),以及与设备之间的物理链路相关的参数的更新。它控制链路层状态机处于 准备广播监听/扫描发起连接已连接 五种状态之一。

  • HCI:HCI 层向主机和控制器提供一个标准化的接口。该层可以由软件 API 实现或者使用硬件接口 UARTSPIUSB 来控制。

  • L2CAP:L2CAP 层负责对主机和协议栈之间交换的数据进行协议复用能力、分段和重组操作。

  • ATT:ATT 层实现了属性服务器和属性客户端之间的点对点协议。ATT 客户端向 ATT 服务端发送命令、请求和确认。ATT 服务端向客户端发送响应、通知和指示。

  • SMP:SMP 层用于生成加密密钥和身份密钥。SMP 还管理加密密钥和身份密钥的存储,并负责生成随机地址并将随机地址解析为已知设备身份。

  • GATT:GATT 层表示属性服务器和可选的属性客户端的功能。该配置文件描述了属性服务器中使用的服务、特征和属性的层次结构。该层提供用于发现、读取、写入和指示服务特性和属性的接口。

  • GAP:GAP 层代表所有蓝牙设备通用的基本功能,例如传输、协议和应用程序配置文件使用的模式和访问程序。GAP 服务包括设备发现、连接模式、安全、身份验证、关联模型和服务发现。

Bluetooth LE 角色划分

在 Bluetooth LE 协议栈中不同的层级有不同的角色划分。这些角色划分互不影响。

  • LL:设备可以划分为 主机从机,从机广播,主机可以发起连接。

  • GAP:定义了 4 种特定角色:广播者观察者外围设备中心设备

  • GATT:设备可以分为 服务端客户端

重要

  • 本文档中描述的 Bluetooth LE 服务端Bluetooth LE 客户端 都是 GATT 层角色。

  • 当前,ESP-AT 支持 Bluetooth LE 服务端Bluetooth LE 客户端 同时存在。

  • 不论 ESP-AT 初始化为 Bluetooth LE 服务端还是 Bluetooth LE 客户端,同时连接的最大设备数量为 3

GATT 其实是一种属性传输协议,简单的讲可以认为是一种属性传输的应用层协议。这个属性的结构非常简单。它由 服务 组成,每个服务由不同数量的 特征 组成,每个 特征 又由很多其它的元素组成。

GATT 服务端GATT 客户端 这两种角色存在于 Bluetooth LE 连接建立之后。GATT 服务器存储通过属性协议传输的数据,并接受来自 GATT 客户端的属性协议请求、命令和确认。简而言之,提供数据的一端称为 GATT 服务端,访问数据的一端称为 GATT 客户端

重要

  • ESP32 Bluetooth LE 服户端需烧录 ble_data.bin 文件到 flash 中,用以提供 Bluetooth LE 服务。

    • 如何生成 ble_data.bin 文件,请参考文档 自定义 Bluetooth LE Services 工具

    • ble_data.bin 文件的烧录地址,见 at_customize.csvble_data 对应的地址,或者在文件 build/download.config 中记录的地址。

Bluetooth LE 客户端读写服务特征值

以下示例同时使用两块 ESP32 开发板,其中一块作为 Bluetooth LE 服务端(只作为 Bluetooth LE 服务端角色),另一块作为 Bluetooth LE 客户端(只作为 Bluetooth LE 客户端角色)。这个例子展示了应如何使用 AT 命令建立 Bluetooth LE 连接,完成数据通信。

重要

在以下步骤中以 ESP32 Bluetooth LE 服务端 开头的操作只需要在 ESP32 Bluetooth LE 服务端执行即可,以 ESP32 Bluetooth LE 客户端 开头的操作只需要在 ESP32 Bluetooth LE 客户端执行即可。

  1. 初始化 Bluetooth LE 功能。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEINIT=2
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLEINIT=1
    

    响应:

    OK
    
  2. ESP32 蓝牙 LE 服务器获取其 MAC 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:d6:e4:46"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  3. ESP32 Bluetooth LE 服务端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  4. ESP32 Bluetooth LE 服务端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  5. ESP32 Bluetooth LE 服务端发现服务特征。

    命令:

    AT+BLEGATTSCHAR?
    

    响应:

    +BLEGATTSCHAR:"char",1,1,0xC300,0x02
    +BLEGATTSCHAR:"desc",1,1,1,0x2901
    +BLEGATTSCHAR:"char",1,2,0xC301,0x02
    +BLEGATTSCHAR:"desc",1,2,1,0x2901
    +BLEGATTSCHAR:"char",1,3,0xC302,0x08
    +BLEGATTSCHAR:"desc",1,3,1,0x2901
    +BLEGATTSCHAR:"char",1,4,0xC303,0x04
    +BLEGATTSCHAR:"desc",1,4,1,0x2901
    +BLEGATTSCHAR:"char",1,5,0xC304,0x08
    +BLEGATTSCHAR:"char",1,6,0xC305,0x10
    +BLEGATTSCHAR:"desc",1,6,1,0x2902
    +BLEGATTSCHAR:"char",1,7,0xC306,0x20
    +BLEGATTSCHAR:"desc",1,7,1,0x2902
    +BLEGATTSCHAR:"char",1,8,0xC307,0x02
    +BLEGATTSCHAR:"desc",1,8,1,0x2901
    +BLEGATTSCHAR:"char",2,1,0xC400,0x02
    +BLEGATTSCHAR:"desc",2,1,1,0x2901
    +BLEGATTSCHAR:"char",2,2,0xC401,0x02
    +BLEGATTSCHAR:"desc",2,2,1,0x2901
    
    OK
    
  6. ESP32 Bluetooth LE 服务端开始广播,之后 ESP32 Bluetooth LE 客户端开始扫描并且持续 3 秒钟。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEADVSTART
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLESCAN=1,3
    

    响应:

    OK
    +BLESCAN:"5b:3b:6c:51:90:49",-87,02011a020a0c0aff4c001005071c3024dc,,1
    +BLESCAN:"c4:5b:be:93:ec:66",-84,0201060303111809095647543147572d58020a03,,0
    +BLESCAN:"24:0a:c4:d6:e4:46",-29,,,0
    

    说明:

    • 您的扫描结果可能与上述响应中的不同。

  7. 建立 Bluetooth LE 连接。

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLECONN=0,"24:0a:c4:d6:e4:46"
    

    响应:

    +BLECONN:0,"24:0a:c4:d6:e4:46"
    
    OK
    

    说明:

    • 输入上述命令时,请使用您的 ESP Bluetooth LE 服务端地址。

    • 如果 Bluetooth LE 连接成功,则会提示 +BLECONN:0,"24:0a:c4:d6:e4:46

    • 如果 Bluetooth LE 连接失败,则会提示 +BLECONN:0,-1

  8. ESP32 Bluetooth LE 客户端发现服务。

    命令:

    AT+BLEGATTCPRIMSRV=0
    

    响应:

     +BLEGATTCPRIMSRV:0,1,0x1801,1
     +BLEGATTCPRIMSRV:0,2,0x1800,1
     +BLEGATTCPRIMSRV:0,3,0xA002,1
     +BLEGATTCPRIMSRV:0,4,0xA003,1
    
    OK
    

    说明:

    • ESP32 Bluetooth LE 客户端查询服务的结果,比 ESP32 Bluetooth LE 服户端查询服务的结果多两个默认服务(UUID: 0x1800 和 0x1801),这是正常现象。正因如此,对于同一服务,ESP32 Bluetooth LE 客户端查询的 <srv_index> 值等于 ESP32 Bluetooth LE 服户端查询的 <srv_index> 值 + 2。例如上述示例中的服务 0xA002,当前在 ESP32 Bluetooth LE 客户端查询到的 <srv_index> 为 3,如果在 ESP32 Bluetooth LE 服户端通过 AT+BLEGATTSSRV? 命令查询,则 <srv_index> 为 1。

  9. ESP32 Bluetooth LE 客户端发现特征值。

    命令:

    AT+BLEGATTCCHAR=0,3
    

    响应:

    +BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
    +BLEGATTCCHAR:"desc",0,3,1,1,0x2901
    +BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
    +BLEGATTCCHAR:"desc",0,3,2,1,0x2901
    +BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
    +BLEGATTCCHAR:"desc",0,3,3,1,0x2901
    +BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
    +BLEGATTCCHAR:"desc",0,3,4,1,0x2901
    +BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
    +BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
    +BLEGATTCCHAR:"desc",0,3,6,1,0x2902
    +BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
    +BLEGATTCCHAR:"desc",0,3,7,1,0x2902
    +BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
    +BLEGATTCCHAR:"desc",0,3,8,1,0x2901
    
    OK
    
  10. ESP32 Bluetooth LE 客户端读取一个特征值。

    命令:

    AT+BLEGATTCRD=0,3,1
    

    响应:

    +BLEGATTCRD:0,1,0
    
    OK
    

    说明:

    • 请注意目标特征值必须要有读权限。

    • 如果 ESP32 Bluetooth LE 客户端读取特征成功,ESP32 Bluetooth LE 服务端则会提示 +READ:0,"7c:df:a1:b3:8d:de"

  11. ESP32 Bluetooth LE 客户端写一个特征值。

    命令:

    AT+BLEGATTCWR=0,3,3,,2
    

    响应:

    >
    

    符号 > 表示 AT 准备好接收串口数据,此时您可以输入数据,当数据长度达到参数 <length> 的值时,执行写入操作。

    OK
    

    说明:

    • 如果 ESP32 Bluetooth LE 客户端写特征描述符成功,ESP32 Bluetooth LE 服务端则会提示 +WRITE:<conn_index>,<srv_index>,<char_index>,[<desc_index>],<len>,<value>

  12. Indicate 一个特征值。

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLEGATTCWR=0,3,7,1,2
    

    响应:

    >
    

    符号 > 表示 AT 准备好接收串口数据,此时您可以输入数据,当数据长度达到参数 <length> 的值时,执行写入操作。

    为了接收 ESP32 Bluetooth LE 服务端发送过来的数据(通过 notify 方式或者 indicate 方式),ESP32 Bluetooth LE 客户端需要提前向服务端注册。对于 notify 方式,需要写入值 0x0001,对于 indicate 方式,需要写入值 0x0002。在本例中写入 0x0002 来使用 indicate 方式。

    OK
    

    说明:

    • 如果 ESP32 Bluetooth LE 客户端写特征描述符成功,ESP32 Bluetooth LE 服务端则会提示 +WRITE:<conn_index>,<srv_index>,<char_index>,<desc_index>,<len>,<value>

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEGATTSIND=0,1,7,3
    

    响应:

    >
    

    符号 > 表示 AT 准备好接收串口数据,此时您可以输入数据,当数据长度达到参数 <length> 的值时,执行 indicate 操作。

    OK
    

    说明:

    • 如果 ESP32 Bluetooth LE 客户端接收到 indication, 则会提示 +INDICATE:<conn_index>,<srv_index>,<char_index>,<len>,<value>

    • 对于同一服务,ESP32 Bluetooth LE 客户端的 <srv_index> 值等于 ESP32 Bluetooth LE 服户端的 <srv_index> 值 + 2,这是正常现象。

    • 对于服务中特征的权限,您可参考文档 如何自定义低功耗蓝牙服务

Bluetooth LE 服务端读写服务特征值

以下示例同时使用两块 ESP32 开发板,其中一块作为 Bluetooth LE 服务端(只作为 Bluetooth LE 服务端角色),另一块作为 Bluetooth LE 客户端(只作为 Bluetooth LE 客户端角色)。这个例子展示了应如何建立 Bluetooth LE 连接,以及服务端读写服务特征值和客户端设置,notify 服务特征值。

重要

步骤中以 ESP32 Bluetooth LE 服务端 开头的操作只需要在 ESP32 Bluetooth LE 服务端执行即可,以 ESP32 Bluetooth LE 客户端 开头的操作只需要在 ESP32 Bluetooth LE 客户端执行即可。

  1. 初始化 Bluetooth LE 功能。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEINIT=2
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLEINIT=1
    

    响应:

    OK
    
  2. ESP32 Bluetooth LE 服务端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  3. ESP32 Bluetooth LE 服务端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  4. ESP32 蓝牙 LE 服务器获取其 MAC 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:d6:e4:46"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  5. 设置 Bluetooth LE 广播数据。

    命令:

    AT+BLEADVDATA="0201060A09457370726573736966030302A0"
    

    响应:

    OK
    
  6. ESP32 Bluetooth LE 服务端开始广播。

    命令:

    AT+BLEADVSTART
    

    响应:

    OK
    
  7. ESP32 Bluetooth LE 客户端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  8. ESP32 Bluetooth LE 客户端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  9. ESP32 Bluetooth LE 客户端获取 Bluetooth LE 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:03:a7:4e"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  10. ESP32 Bluetooth LE 客户端开始扫描,持续 3 秒。

    命令:

    AT+BLESCAN=1,3
    

    响应:

    OK
    +BLESCAN:"24:0a:c4:d6:e4:46",-78,0201060a09457370726573736966030302a0,,0
    +BLESCAN:"45:03:cb:ac:aa:a0",-62,0201060aff4c001005441c61df7d,,1
    +BLESCAN:"24:0a:c4:d6:e4:46",-26,0201060a09457370726573736966030302a0,,0
    

    说明:

    • 您的扫描结果可能与上述响应中的不同。

  11. 建立 the Bluetooth LE 连接。

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLECONN=0,"24:0a:c4:d6:e4:46"
    

    响应:

    +BLECONN:0,"24:0a:c4:d6:e4:46"
    
    OK
    

    说明:

    • 输入上述命令时,请使用您的 ESP Bluetooth LE 服务端地址。

    • 如果 Bluetooth LE 连接成功,则会提示 +BLECONN:0,"24:0a:c4:d6:e4:46

    • 如果 Bluetooth LE 连接失败,则会提示 +BLECONN:0,-1

ESP32 Bluetooth LE 服务端:

命令:

AT+BLECONN=0,"24:0a:c4:03:a7:4e"

响应:

+BLECONN:0,"24:0a:c4:03:a7:4e"

OK

说明:

  • 输入上述命令时,请使用您的 ESP Bluetooth LE 客户端地址。

  • 如果 Bluetooth LE 连接成功,则会提示 OK,不会提示 +BLECONN:0,"24:0a:c4:03:a7:4e

  • 如果 Bluetooth LE 连接失败,则会提示 ERROR,不会提示 +BLECONN:0,-1

  1. ESP32 Bluetooth LE 客户端查询本地服务。

    命令:

    AT+BLEGATTSSRV?
    

    响应:

    +BLEGATTSSRV:1,1,0xA002,1
    +BLEGATTSSRV:2,1,0xA003,1
    
    OK
    
  2. ESP32 Bluetooth LE 客户端发现本地特征。

    命令:

    AT+BLEGATTSCHAR?
    

    响应:

    +BLEGATTSCHAR:"char",1,1,0xC300,0x02
    +BLEGATTSCHAR:"desc",1,1,1,0x2901
    +BLEGATTSCHAR:"char",1,2,0xC301,0x02
    +BLEGATTSCHAR:"desc",1,2,1,0x2901
    +BLEGATTSCHAR:"char",1,3,0xC302,0x08
    +BLEGATTSCHAR:"desc",1,3,1,0x2901
    +BLEGATTSCHAR:"char",1,4,0xC303,0x04
    +BLEGATTSCHAR:"desc",1,4,1,0x2901
    +BLEGATTSCHAR:"char",1,5,0xC304,0x08
    +BLEGATTSCHAR:"char",1,6,0xC305,0x10
    +BLEGATTSCHAR:"desc",1,6,1,0x2902
    +BLEGATTSCHAR:"char",1,7,0xC306,0x20
    +BLEGATTSCHAR:"desc",1,7,1,0x2902
    +BLEGATTSCHAR:"char",1,8,0xC307,0x02
    +BLEGATTSCHAR:"desc",1,8,1,0x2901
    +BLEGATTSCHAR:"char",2,1,0xC400,0x02
    +BLEGATTSCHAR:"desc",2,1,1,0x2901
    +BLEGATTSCHAR:"char",2,2,0xC401,0x02
    +BLEGATTSCHAR:"desc",2,2,1,0x2901
    
    OK
    
  3. ESP32 Bluetooth LE 服务端发现对端服务。

    命令:

    AT+BLEGATTCPRIMSRV=0
    

    响应:

     +BLEGATTCPRIMSRV:0,1,0x1801,1
     +BLEGATTCPRIMSRV:0,2,0x1800,1
     +BLEGATTCPRIMSRV:0,3,0xA002,1
     +BLEGATTCPRIMSRV:0,4,0xA003,1
    
    OK
    

    说明:

    • ESP32 Bluetooth LE 服务端查询服务的结果,比 ESP32 Bluetooth LE 客户端查询服务的结果多两个默认服务(UUID: 0x1800 和 0x1801)。正因如此,对于同一服务,ESP32 Bluetooth LE 服务端查询的 <srv_index> 值等于 ESP32 Bluetooth LE 客户端查询的 <srv_index> 值 + 2。例如,上述示例中的服务 0xA002,当前在 ESP32 Bluetooth LE 服务端查询到的 <srv_index> 为 3,如果在 ESP32 Bluetooth LE 服务端通过 AT+BLEGATTSSRV? 命令查询,则 <srv_index> 为 1。

  4. ESP32 Bluetooth LE 服务端发现对端特征。

    命令:

    AT+BLEGATTCCHAR=0,3
    

    响应:

    +BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
    +BLEGATTCCHAR:"desc",0,3,1,1,0x2901
    +BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
    +BLEGATTCCHAR:"desc",0,3,2,1,0x2901
    +BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
    +BLEGATTCCHAR:"desc",0,3,3,1,0x2901
    +BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
    +BLEGATTCCHAR:"desc",0,3,4,1,0x2901
    +BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
    +BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
    +BLEGATTCCHAR:"desc",0,3,6,1,0x2902
    +BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
    +BLEGATTCCHAR:"desc",0,3,7,1,0x2902
    +BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
    +BLEGATTCCHAR:"desc",0,3,8,1,0x2901
    
    OK
    
  5. ESP32 Bluetooth LE 客户端设置服务特征值。

    选择支持写操作的服务特征(characteristic)去设置服务特征值。

    命令:

    AT+BLEGATTSSETATTR=1,8,,1
    

    响应:

    >
    

    命令:

    写入一个字节 ``9``
    

    响应:

    OK
    
  6. ESP32 Bluetooth LE 服务端读服务特征值。

    命令:

    AT+BLEGATTCRD=0,3,8,
    

    响应:

    +BLEGATTCRD:0,1,9
    
    OK
    
  7. ESP32 Bluetooth LE 服务端写服务特征值。

    选择支持写操作的服务特性写入特性。

    命令:

    AT+BLEGATTCWR=0,3,6,1,2
    

    响应:

    >
    

    命令:

    写入2个字节 ``12``
    

    响应:

    OK
    

    说明:

    • 如果 Bluetooth LE 服务端写服务特征值成功后,Bluetooth LE 客户端则会提示 +WRITE:0,1,6,1,2,12

  8. ESP32 Bluetooth LE 客户端 notify 服务特征值

    命令:

    AT+BLEGATTSNTFY=0,1,6,10
    

    响应:

    >
    

    命令:

    写入 ``1234567890`` 10个字节
    

    响应:

    OK
    

    说明:

    • 如果 ESP32 Bluetooth LE 客户端 notify 服务特征值给服务端成功,Bluetooth LE 服务端则会提示 +NOTIFY:0,3,6,10,1234567890

Bluetooth LE 连接加密

以下示例同时使用两块 ESP32 开发板,其中一块作为 Bluetooth LE 服务端(只作为 Bluetooth LE 服务端角色),另一块作为 Bluetooth LE 客户端(只作为 Bluetooth LE 客户端角色)。这个例子展示了怎样加密 Bluetooth LE 连接。

重要

  • 在以下步骤中以 ESP32 Bluetooth LE 服务端 开头的操作只需要在 ESP32 Bluetooth LE 服务端执行即可,以 ESP32 Bluetooth LE 客户端 开头的操作只需要在 ESP32 Bluetooth LE 客户端执行即可。

  • 加密绑定 是两个不同的概念。绑定 只是加密成功后在本地存储了一个长期的密钥。

  • ESP-AT 最多允许绑定 10 个设备。

  1. 初始化 Bluetooth LE 功能。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEINIT=2
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLEINIT=1
    

    响应:

    OK
    
  2. ESP32 Bluetooth LE 服务端获取 Bluetooth LE 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:d6:e4:46"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  3. ESP32 Bluetooth LE 服务端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  4. ESP32 Bluetooth LE 服务端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  5. ESP32 Bluetooth LE 服务端发现服务特征。

    命令:

    AT+BLEGATTSCHAR?
    

    响应:

    +BLEGATTSCHAR:"char",1,1,0xC300,0x02
    +BLEGATTSCHAR:"desc",1,1,1,0x2901
    +BLEGATTSCHAR:"char",1,2,0xC301,0x02
    +BLEGATTSCHAR:"desc",1,2,1,0x2901
    +BLEGATTSCHAR:"char",1,3,0xC302,0x08
    +BLEGATTSCHAR:"desc",1,3,1,0x2901
    +BLEGATTSCHAR:"char",1,4,0xC303,0x04
    +BLEGATTSCHAR:"desc",1,4,1,0x2901
    +BLEGATTSCHAR:"char",1,5,0xC304,0x08
    +BLEGATTSCHAR:"char",1,6,0xC305,0x10
    +BLEGATTSCHAR:"desc",1,6,1,0x2902
    +BLEGATTSCHAR:"char",1,7,0xC306,0x20
    +BLEGATTSCHAR:"desc",1,7,1,0x2902
    +BLEGATTSCHAR:"char",1,8,0xC307,0x02
    +BLEGATTSCHAR:"desc",1,8,1,0x2901
    +BLEGATTSCHAR:"char",2,1,0xC400,0x02
    +BLEGATTSCHAR:"desc",2,1,1,0x2901
    +BLEGATTSCHAR:"char",2,2,0xC401,0x02
    +BLEGATTSCHAR:"desc",2,2,1,0x2901
    
    OK
    
  6. ESP32 Bluetooth LE 服务端开始广播,之后 ESP32 Bluetooth LE 客户端开始扫描并且持续 3 秒钟。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEADVSTART
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLESCAN=1,3
    

    响应:

    OK
    +BLESCAN:"5b:3b:6c:51:90:49",-87,02011a020a0c0aff4c001005071c3024dc,,1
    +BLESCAN:"c4:5b:be:93:ec:66",-84,0201060303111809095647543147572d58020a03,,0
    +BLESCAN:"24:0a:c4:d6:e4:46",-29,,,0
    

    说明:

    • 您的扫描结果可能与上述响应中的不同。

  7. 建立 Bluetooth LE 连接。

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLECONN=0,"24:0a:c4:d6:e4:46"
    

    响应:

    +BLECONN:0,"24:0a:c4:d6:e4:46"
    
    OK
    

    说明:

    • 输入上述命令时,请使用您的 ESP Bluetooth LE 服务端地址。

    • 如果 Bluetooth LE 连接成功,则会提示 +BLECONN:0,"24:0a:c4:d6:e4:46

    • 如果 Bluetooth LE 连接失败,则会提示 +BLECONN:0,-1

  8. ESP32 Bluetooth LE 客户端发现服务。

    命令:

    AT+BLEGATTCPRIMSRV=0
    

    响应:

     +BLEGATTCPRIMSRV:0,1,0x1801,1
     +BLEGATTCPRIMSRV:0,2,0x1800,1
     +BLEGATTCPRIMSRV:0,3,0xA002,1
     +BLEGATTCPRIMSRV:0,4,0xA003,1
    
    OK
    

    说明:

    • ESP32 Bluetooth LE 客户端查询服务的结果,比 ESP32 Bluetooth LE 服户端查询服务的结果多两个默认服务(UUID: 0x1800 和 0x1801),这是正常现象。正因如此,对于同一服务,ESP32 Bluetooth LE 客户端查询的 <srv_index> 值等于 ESP32 Bluetooth LE 服户端查询的 <srv_index> 值 + 2。例如上述示例中的服务 0xA002,当前在 ESP32 Bluetooth LE 客户端查询到的 <srv_index> 为 3,如果在 ESP32 Bluetooth LE 服户端通过 AT+BLEGATTSSRV? 命令查询,则 <srv_index> 为 1。

  9. ESP32 Bluetooth LE 客户端发现特征值。

    命令:

    AT+BLEGATTCCHAR=0,3
    

    响应:

    +BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
    +BLEGATTCCHAR:"desc",0,3,1,1,0x2901
    +BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
    +BLEGATTCCHAR:"desc",0,3,2,1,0x2901
    +BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
    +BLEGATTCCHAR:"desc",0,3,3,1,0x2901
    +BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
    +BLEGATTCCHAR:"desc",0,3,4,1,0x2901
    +BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
    +BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
    +BLEGATTCCHAR:"desc",0,3,6,1,0x2902
    +BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
    +BLEGATTCCHAR:"desc",0,3,7,1,0x2902
    +BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
    +BLEGATTCCHAR:"desc",0,3,8,1,0x2901
    
    OK
    
  10. 设置加密参数。设置 auth_reqSC_MITM_BOND,服务端的 iocapKeyboardOnly,客户端的 iocapKeyboardDisplaykey_size16init_key3, rsp_key3

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLESECPARAM=13,2,16,3,3
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLESECPARAM=13,4,16,3,3
    

    响应:

    OK
    

    说明:

    • 在本例中,ESP32 Bluetooth LE 服务端输入配对码,ESP32 Bluetooth LE 客户端显示配对码。

    • ESP-AT 支持 Legacy PairingSecure Connections 两种加密方式,但后者有更高级别的优先级。如果对端也支持 Secure Connections,则会采用 Secure Connections 方式加密。

  11. ESP32 Bluetooth LE 客户端发起加密请求。

    命令:

    AT+BLEENC=0,3
    

    响应:

    OK
    

    说明:

    如果 ESP32 Bluetooth LE 服务端成功接收到加密请求,ESP32 Bluetooth LE 服务端则会提示 +BLESECREQ:0

  12. ESP32 Bluetooth LE 服务端响应配对请求。

    命令:

    AT+BLEENCRSP=0,1
    

    响应:

    OK
    

    说明:

    • 如果 ESP32 Bluetooth LE 客户端成功收到配对响应,则 ESP32 Bluetooth LE 客户端将会产生一个 6 位的配对码。

    • 在本例中,ESP32 Bluetooth LE 客户端则会提示 +BLESECNTFYKEY:0,793718。配对码为 793718

  13. ESP32 Bluetooth LE 客户端回复配对码。

    命令:

    AT+BLEKEYREPLY=0,793718
    

    响应:

    OK
    

    执行这个命令之后,在 ESP32 Bluetooth LE 服务端和 ESP32 Bluetooth LE 客户端会有一些对应信息提示。

    ESP32 Bluetooth LE 服务端:

    +BLESECKEYTYPE:0,16
    +BLESECKEYTYPE:0,1
    +BLESECKEYTYPE:0,32
    +BLESECKEYTYPE:0,2
    +BLEAUTHCMPL:0,0
    

    ESP32 Bluetooth LE 客户端:

    +BLESECNTFYKEY:0,793718
    +BLESECKEYTYPE:0,2
    +BLESECKEYTYPE:0,16
    +BLESECKEYTYPE:0,1
    +BLESECKEYTYPE:0,32
    +BLEAUTHCMPL:0,0
    

    您可以忽略以 +BLESECKEYTYPE 开头的信息。信息 +BLEAUTHCMPL:0,0 中的第二个参数为 0 表示加密成功,为 1 表示加密失败。

两个 ESP32 开发板之间建立 SPP 连接,以及在 UART-Bluetooth LE 透传模式下传输数据

以下示例同时使用两块 ESP32 开发板,其中一块作为 Bluetooth LE 服务端(只作为 Bluetooth LE 服务端角色),另一块作为 Bluetooth LE 客户端(只作为 Bluetooth LE 客户端角色)。这个例子展示了应如何建立 Bluetooth LE 连接,以及建立透传通信 Bluetooth LE SPP (Serial Port Profile, UART-Bluetooth LE 透传模式)。

重要

在以下步骤中以 ESP32 Bluetooth LE 服务端 开头的操作只需要在 ESP32 Bluetooth LE 服务端执行即可,以 ESP32 Bluetooth LE 客户端 开头的操作只需要在 ESP32 Bluetooth LE 客户端执行即可。

  1. 初始化 Bluetooth LE 功能。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEINIT=2
    

    响应:

    OK
    

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLEINIT=1
    

    响应:

    OK
    
  2. ESP32 Bluetooth LE 服务端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  3. ESP32 Bluetooth LE 服务端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  4. ESP32 蓝牙 LE 服务器获取其 MAC 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:d6:e4:46"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  5. 设置 Bluetooth LE 广播数据。

    命令:

    AT+BLEADVDATA="0201060A09457370726573736966030302A0"
    

    响应:

    OK
    
  6. ESP32 Bluetooth LE 服务端开始广播。

    命令:

    AT+BLEADVSTART
    

    响应:

    OK
    
  7. ESP32 Bluetooth LE 客户端开始扫描,持续 3 秒。

    命令:

    AT+BLESCAN=1,3
    

    响应:

    OK
    +BLESCAN:"24:0a:c4:d6:e4:46",-78,0201060a09457370726573736966030302a0,,0
    +BLESCAN:"45:03:cb:ac:aa:a0",-62,0201060aff4c001005441c61df7d,,1
    +BLESCAN:"24:0a:c4:d6:e4:46",-26,0201060a09457370726573736966030302a0,,0
    

    说明:

    • 您的扫描结果可能与上述响应中的不同。

  8. 建立 the Bluetooth LE 连接。

    ESP32 Bluetooth LE 客户端:

    命令:

    AT+BLECONN=0,"24:0a:c4:d6:e4:46"
    

    响应:

    +BLECONN:0,"24:0a:c4:d6:e4:46"
    
    OK
    

    说明:

    • 输入上述命令时,请使用您的 ESP Bluetooth LE 服务端地址。

    • 如果 Bluetooth LE 连接成功,则会提示 +BLECONN:0,"24:0a:c4:d6:e4:46

    • 如果 Bluetooth LE 连接失败,则会提示 +BLECONN:0,-1

  9. ESP32 Bluetooth LE 服务端查询服务。

    命令:

    AT+BLEGATTSSRV?
    

    响应:

    +BLEGATTSSRV:1,1,0xA002,1
    +BLEGATTSSRV:2,1,0xA003,1
    
    OK
    
  10. ESP32 Bluetooth LE 服务端发现特征。

    命令:

    AT+BLEGATTSCHAR?
    

    响应:

    +BLEGATTSCHAR:"char",1,1,0xC300,0x02
    +BLEGATTSCHAR:"desc",1,1,1,0x2901
    +BLEGATTSCHAR:"char",1,2,0xC301,0x02
    +BLEGATTSCHAR:"desc",1,2,1,0x2901
    +BLEGATTSCHAR:"char",1,3,0xC302,0x08
    +BLEGATTSCHAR:"desc",1,3,1,0x2901
    +BLEGATTSCHAR:"char",1,4,0xC303,0x04
    +BLEGATTSCHAR:"desc",1,4,1,0x2901
    +BLEGATTSCHAR:"char",1,5,0xC304,0x08
    +BLEGATTSCHAR:"char",1,6,0xC305,0x10
    +BLEGATTSCHAR:"desc",1,6,1,0x2902
    +BLEGATTSCHAR:"char",1,7,0xC306,0x20
    +BLEGATTSCHAR:"desc",1,7,1,0x2902
    +BLEGATTSCHAR:"char",1,8,0xC307,0x02
    +BLEGATTSCHAR:"desc",1,8,1,0x2901
    +BLEGATTSCHAR:"char",2,1,0xC400,0x02
    +BLEGATTSCHAR:"desc",2,1,1,0x2901
    +BLEGATTSCHAR:"char",2,2,0xC401,0x02
    +BLEGATTSCHAR:"desc",2,2,1,0x2901
    
    OK
    
  11. ESP32 Bluetooth LE 客户端发现服务。

    命令:

    AT+BLEGATTCPRIMSRV=0
    

    响应:

     +BLEGATTCPRIMSRV:0,1,0x1801,1
     +BLEGATTCPRIMSRV:0,2,0x1800,1
     +BLEGATTCPRIMSRV:0,3,0xA002,1
     +BLEGATTCPRIMSRV:0,4,0xA003,1
    
    OK
    

    说明:

    • ESP32 Bluetooth LE 客户端查询服务的结果,比 ESP32 Bluetooth LE 服户端查询服务的结果多两个默认服务(UUID: 0x1800 和 0x1801),这是正常现象。正因如此,对于同一服务,ESP32 Bluetooth LE 客户端查询的 <srv_index> 值等于 ESP32 Bluetooth LE 服户端查询的 <srv_index> 值 + 2。例如,上述示例中的服务 0xA002,当前在 ESP32 Bluetooth LE 客户端查询到的 <srv_index> 为 3,如果在 ESP32 Bluetooth LE 服户端通过 AT+BLEGATTSSRV? 命令查询,则 <srv_index> 为 1。

  12. ESP32 Bluetooth LE 客户端发现特征。

    命令:

    AT+BLEGATTCCHAR=0,3
    

    响应:

    +BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
    +BLEGATTCCHAR:"desc",0,3,1,1,0x2901
    +BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
    +BLEGATTCCHAR:"desc",0,3,2,1,0x2901
    +BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
    +BLEGATTCCHAR:"desc",0,3,3,1,0x2901
    +BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
    +BLEGATTCCHAR:"desc",0,3,4,1,0x2901
    +BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
    +BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
    +BLEGATTCCHAR:"desc",0,3,6,1,0x2902
    +BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
    +BLEGATTCCHAR:"desc",0,3,7,1,0x2902
    +BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
    +BLEGATTCCHAR:"desc",0,3,8,1,0x2901
    
    OK
    
  13. ESP32 Bluetooth LE 客户端配置 Bluetooth LE SPP。

    选择支持写操作的服务特征(characteristic)作为写通道发送数据,选择支持 notify 或者 indicate 的 characteristic 作为读通道接收数据。

    命令:

    AT+BLESPPCFG=1,3,5,3,7
    

    响应:

    OK
    
  14. ESP32 Bluetooth LE 客户端使能 Bluetooth LE SPP。

    命令:

    AT+BLESPP
    

    响应:

    OK
    
    >
    

    上述响应表示 AT 已经进入 Bluetooth LE SPP 模式,可以进行数据的发送和接收。

    说明:

    • ESP32 Bluetooth LE 客户端开启 Bluetooth LE SPP 透传模式后,串口收到的数据会通过 Bluetooth LE 传输到 ESP32 Bluetooth LE 服务端。

  15. ESP32 Bluetooth LE 服务端配置 Bluetooth LE SPP。

    选择支持 notify 或者 indicate 的 characteristic 作为写通道发送数据,选择支持写操作的 characteristic 作为读通道接收数据。

    命令:

    AT+BLESPPCFG=1,1,7,1,5
    

    响应:

    OK
    
  16. ESP32 Bluetooth LE 服务端使能 Bluetooth LE SPP。

    命令:

    AT+BLESPP
    

    响应:

    OK
    
    >
    

    上述响应表示 AT 已经进入 Bluetooth LE SPP 模式,可以进行数据的发送和接收。

    说明:

    • ESP32 Bluetooth LE 服户端开启 Bluetooth LE SPP 透传模式后,串口收到的数据会通过 Bluetooth LE 传输到 ESP32 Bluetooth LE 客户端。

    • 如果 ESP32 Bluetooth LE 客户端端没有先开启 Bluetooth LE SPP 透传,或者使用其他设备作为 Bluetooth LE 客户端,则 ESP32 Bluetooth LE 客户端需要先开启侦听 Notify 或者 Indicate。例如,ESP32 Bluetooth LE 客户端如果未开启透传,则应先调用 AT+BLEGATTCWR=0,3,7,1,1 开启侦听,ESP32 Bluetooth LE 服务端 才能成功实现透传。

    • 对于同一服务,ESP32 Bluetooth LE 客户端的 <srv_index> 值等于 ESP32 Bluetooth LE 服务端的 <srv_index> 值 + 2,这是正常现象。

ESP32 与手机建立 SPP 连接,以及在 UART-Bluetooth LE 透传模式下传输数据

该示例展示了如何在 ESP32 开发板(仅作为低功耗蓝牙服务器角色)和手机(仅作为低功耗蓝牙客户端角色)之间建立 SPP 连接,以及如何在 UART-Bluetooth LE 透传模式下传输数据。

重要

步骤中以 ESP32 Bluetooth LE 服务端 开头的操作只需要在 ESP32 Bluetooth LE 服务端执行即可,而以 Bluetooth LE 客户端 开头的操作只需要在手机的蓝牙调试助手中执行即可。

  1. 在手机端下载 Bluetooth LE 调试助手,例如 nRF Connect (Android) 和 LightBlue (iOS)。

  2. 初始化 Bluetooth LE 功能。

    ESP32 Bluetooth LE 服务端:

    命令:

    AT+BLEINIT=2
    

    响应:

    OK
    
  3. ESP32 Bluetooth LE 服务端创建服务。

    命令:

    AT+BLEGATTSSRVCRE
    

    响应:

    OK
    
  4. ESP32 Bluetooth LE 服务端开启服务。

    命令:

    AT+BLEGATTSSRVSTART
    

    响应:

    OK
    
  5. ESP32 蓝牙 LE 服务器获取其 MAC 地址。

    命令:

    AT+BLEADDR?
    

    响应:

    +BLEADDR:"24:0a:c4:d6:e4:46"
    OK
    

    说明:

    • 您查询到的地址可能与上述响应中的不同,请记住您的地址,下面的步骤中会用到。

  6. 设置 Bluetooth LE 广播数据。

    命令:

    AT+BLEADVDATA="0201060A09457370726573736966030302A0"
    

    响应:

    OK
    
  7. ESP32 Bluetooth LE 服务端开始广播。

    命令:

    AT+BLEADVSTART
    

    响应:

    OK
    
  8. 创建 Bluetooth LE 连接。

    手机打开 nRF 调试助手,并打开 SCAN 开始扫描,找到 ESP32 Bluetooth LE 服务端的 MAC 地址,点击 CONNECT 进行连接。此时 ESP32 端应该会打印类似于 +BLECONN:0,"60:51:42:fe:98:aa" 的 log,这表示已经建立了 Bluetooth LE 连接。

  9. ESP32 Bluetooth LE 服务端查询服务。

    命令:

    AT+BLEGATTSSRV?
    

    响应:

    +BLEGATTSSRV:1,1,0xA002,1
    +BLEGATTSSRV:2,1,0xA003,1
    
    OK
    
  10. ESP32 Bluetooth LE 服务端发现特征。

    命令:

    AT+BLEGATTSCHAR?
    

    响应:

    +BLEGATTSCHAR:"char",1,1,0xC300,0x02
    +BLEGATTSCHAR:"desc",1,1,1,0x2901
    +BLEGATTSCHAR:"char",1,2,0xC301,0x02
    +BLEGATTSCHAR:"desc",1,2,1,0x2901
    +BLEGATTSCHAR:"char",1,3,0xC302,0x08
    +BLEGATTSCHAR:"desc",1,3,1,0x2901
    +BLEGATTSCHAR:"char",1,4,0xC303,0x04
    +BLEGATTSCHAR:"desc",1,4,1,0x2901
    +BLEGATTSCHAR:"char",1,5,0xC304,0x08
    +BLEGATTSCHAR:"char",1,6,0xC305,0x10
    +BLEGATTSCHAR:"desc",1,6,1,0x2902
    +BLEGATTSCHAR:"char",1,7,0xC306,0x20
    +BLEGATTSCHAR:"desc",1,7,1,0x2902
    +BLEGATTSCHAR:"char",1,8,0xC307,0x02
    +BLEGATTSCHAR:"desc",1,8,1,0x2901
    +BLEGATTSCHAR:"char",2,1,0xC400,0x02
    +BLEGATTSCHAR:"desc",2,1,1,0x2901
    +BLEGATTSCHAR:"char",2,2,0xC401,0x02
    +BLEGATTSCHAR:"desc",2,2,1,0x2901
    
    OK
    
  11. Bluetooth LE 客户端发现服务。

    此时在手机 nRF 调试助手客户端点击 UUID:0xA002UnKnown Service

  12. 手机 nRF 调试助手客户端发现特征。

    此时在手机 nRF 调试助手客户端的 UUID:0xA002UnKnown Service 服务下一级选项中选择点击 Properties 为 NOTIFY 或者 INDICATE 的服务特征的右侧按钮(这里 ESP-AT 默认 Properties 为 NOTIFY 或者 INDICATE 的服务特征是 0xC305 和 0xC306),开始侦听 Properties 为 NOTIFY 或者 INDICATE 的服务特征。

  13. ESP32 Bluetooth LE 服务端配置 Bluetooth LE SPP。

    选择支持 notify 或者 indicate 的 characteristic 作为写通道发送数据,选择支持写操作的 characteristic 作为读通道接收数据。

    命令:

    AT+BLESPPCFG=1,1,7,1,5
    

    响应:

    OK
    
  14. ESP32 Bluetooth LE 服务端使能 Bluetooth LE SPP。

    命令:

    AT+BLESPP
    

    响应:

    OK
    
    >
    

    上述响应表示 AT 已经进入 Bluetooth LE SPP 模式,可以进行数据的发送和接收。

  15. Bluetooth LE 客户端发送数据。

    在 nRF 调试助手客户端选择 0xC304 服务特征值发送数据 test 给 ESP32 Bluetooth LE 服务端,此时 ESP32 Bluetooth LE 服务端可以收到 test

  16. ESP32 Bluetooth LE 服务端发送数据。

    在 ESP32 Bluetooth LE 服务端直接发送 test,此时 nRF 调试助手客户端可以收到 test