蓝牙

[English]


移植例程 gatt_server 出现头文件不存在的错误?

移植例程 gatt_server 出现错误提示 fatal error: esp_gap_ble_api.h: No such file or directory,但头文件已经包含此文件。

  • 检查 sdkconfig,是否未从例程中移植 sdkconfig.defaults。通常 SDK 中蓝牙默认关闭不编译,需要配置开启。

  • 如果使用 cmake 需要将例程中 CMakeLists.txt 文件内的链接配置一同复制。


ESP32 可以支持 Bluetooth® LE 5.0 吗?

ESP32 硬件不支持 Bluetooth LE 5.0,支持 Bluetooth LE 4.2。

ESP32 目前通过了 Bluetooth LE 5.0 的认证,但 Bluetooth LE 5.0 的新功能 ESP32 不支持(未来会有其它芯片支持 Bluetooth LE 5.0 全部新功能)。


为什么 Bluetooth® LE 开始广播后,有些手机扫描不到?

  • 需确认手机是否支持 Bluetooth LE 功能:有的手机在“设置” -> “蓝牙”中只显示默认的经典蓝牙,Bluetooth LE 广播会被手机过滤掉。

  • 建议使用专用的 Bluetooth LE App 来调试 Bluetooth LE 功能。例如,苹果手机可以使用 LightBlue App。

  • 需确认广播包的格式符合规范,手机一般会对不符合格式的广播包进行过滤,只有格式正确的才能被显示出来。


ESP32 能否使用蓝牙进行 OTA?

可以使用蓝牙进行 OTA。如果是用 Bluetooth®,可以基于 bt_spp_acceptorbt_spp_initiator 修改。

如果是用 Bluetooth LE,可以基于 ble_spp_serverble_spp_client 修改。


ESP32 的蓝牙双模如何共存及使用?

ESP32 支持的双模蓝牙并没有特殊的地方,不需要做复杂的配置或调用即可使用。从开发者的⻆度来看,Bluetooth® LE 调用 Bluetooth LE 的 API,经典蓝牙调用经典蓝牙的 API。

经典蓝牙与 Bluetooth LE 共存说明可参考文档 ESP32 Bluetooth & Bluetooth LE 双模蓝牙共存说明


ESP32 的 Bluetooth® LE 吞吐量是多少?

  • ESP32 的 Bluetooth LE 吞吐率取决于各种因素,例如环境干扰、连接间隔、MTU 大小以及对端设备性能等等。

  • ESP32 板子之间的 Bluetooth LE 通信最大吞吐量可达 700 Kbps,约 90 KB/s,具体可以参考 ESP-IDF 中的 ble_throughput example。


ESP32 是否支持 BT4.2 DLE (Data Length Extension)?

支持。ESP-IDF 所有版本都支持 Bluetooth® 4.2 DLE,暂无对应的 sample code,可直接调相关接口实现,参见:esp_ble_gap_set_pkt_data_len


ESP32 的蓝⽛和 Wi-Fi 如何共存?

menuconfig 中,有个特殊选项 Software controls WiFi/Bluetooth coexistence,⽤于通过软件来控制 ESP32 的蓝⽛和 Wi-Fi 共存,可以平衡 Wi-Fi、蓝⽛控制 RF 的共存需求。

  • 如果使能 Software controls WiFi/Bluetooth coexistence 选项,Bluetooth® LE scan 间隔不应超过 0x100 slots (约 160 ms)。若只是 Bluetooth LE 与 Wi-Fi 共存,则开启这个选项和不开启均可正常使⽤。但不开启的时候需要注意 Bluetooth LE scan window 应大于 150 ms,并且 Bluetooth LE scan interval 尽量⼩于 500 ms。

  • 若经典蓝⽛与 Wi-Fi 共存,则建议开启这个选项。


ESP32 蓝牙的兼容性测试报告如何获取?

请联系 sales@espressif.com 获得兼容性测试报告。


ESP32 蓝牙的发射功率是多少?

ESP32 蓝牙的发射功率有 8 档,对应功率 -12 ~ 9 dBm,间隔 3 dBm 一档。控制器软件对发射功率进行限制,根据产品声明的对应功率等级选取档位。


ESP32 可以实现 Wi-Fi 和 Bluetooth® LE 桥接的功能吗?

可以实现,这个属于应⽤层开发:可以通过 Bluetooth LE 获取数据,由 Wi-Fi 转出去。可参考 Wi-Fi 和蓝⽛共存的 demo,修改为⾃⼰的应⽤即可。


ESP32 的 Bluetooth® LE 工作电流是多少?

电流

最大值 (mA)

最小值 (mA)

平均值

Advertising: Adv Interval = 40 ms

142.1

32

42.67

Scanning: Scan Interval = 160 ms,Window = 20 ms

142.1

32

44.4

Connection(Slave): Connection Interval = 20 ms, Iatency = 0

142.1

32

42.75

Connection(Slave): Connection Interval = 80 ms, Iatency = 0

142.1

32

35.33


ESP32 支持哪些 Bluetooth® LE Profile?

目前支持完整的 GATT/SMP 等基础模块,支持自定义配置;已经实现的配置有 Bluetooth LE HID(设备端)、电池、DIS、BluFi(蓝牙配网)等。


如何使用 ESP32 蓝牙连接手机播放音乐?

用手机通过蓝牙播放音乐,ESP32 用作 A2DP Sink。A2DP Sink Demo 只是通过手机获取 SBC 编码的数据流,若要播放出声音,需要做编解码转换,通常需要编解码器、数/模转换器、扬声器等模块。


ESP32 的 SPP 性能如何?

使用两块 ESP32 开发板对跑 SPP,单向吞吐量量可达 1900 Kbps,约 235 KB/s,已接近规范里的理论值。


ESP32 的 Bluetooth® LE 传输速率最大为多少?

屏蔽箱测试 Bluetooth LE 传输速率可以达到 700 Kbps。


ESP32 Bluetooth® LE 如何进入 Light-sleep 模式呢?

硬件上需要外加 32 kHz 的外部晶振,否则 Light-sleep 模式不会生效。

软件上(SDK4.0 以及以上版本才会支持)在 menuconfig 中需要使能以下配置:

  • Power Management:| menuconfig > Component config > Power management > [*] Support for power management

  • Tickless Idle:| menuconfig > Component config > FreeRTOS > [*] Tickless idle support (3) Minimum number of ticks to enter sleep mode for (NEW)

注解

需使能 “Tickless idle” 功能使 ESP32 自动进入 Light-sleep 模式。如果在 3 个节拍(默认)内无任务运行,则 FreeRTOS 将进入 Light-sleep 模式,即 100 Hz 节拍率下为 30 ms。若您希望缩短 Light-sleep 模式的持续时间,可通过将 FreeRTOS 节拍率调高来实现,如:menuconfig > Component config > FreeRTOS > (1000) Tick rate (Hz)

  • Configure external 32.768 kHz crystal as RTC clock source :| menuconfig > Component config > ESP32-specific > RTC clock source (External 32 kHz crystal)[*] Additional current for external 32 kHz crystal

注解

“additional current” 选项为解决 ESP32 晶振失败的替代方案。请在您使用外部 32 kHz 晶体时使能该选项。该硬件问题将在下一个 ECO 芯片中解决。

  • Enable Bluetooth modem sleep with external 32.768 kHz crystal as low power clock :| menuconfig > Component config > Bluetooth > Bluetooth controller > MODEM SLEEP Options > [*] Bluetooth modem sleep

选择 ESP32 芯片实现蓝牙配网的方式,是否有文档可以提供参考?

蓝牙配网说明可参考 ESP32 Blufi。蓝牙配网示例可以参考 Blufi


ESP32 经典蓝牙 SPP 的传输速率能达到多少?

在开放环境下,双向同时收发,实测可达到 1400+ Kbps 到 1590 Kbps(此数据仅作为参考,实际情况建议客户根据应用环境实测)。


ESP32 的蓝牙是否兼容 Bluetooth® ver2.1 + EDR 协议?

兼容。ESP32 的蓝牙是向下兼容的,您可以使用官方的 蓝牙示例 进行测试。


ESP32 支持多少蓝牙客户端连接?

Bluetooth® LE Server 最大支持 9 个客户端连接,应用中需查看配置参数 ble_max_conn。测试稳定连接为 3 个客户端。


ESP32 如何获取蓝牙设备的 MAC 地址?

可调用 esp_bt_dev_get_address(void); API 来获取蓝牙配置的 MAC 地址。也可以调用 esp_err_t esp_read_mac(uint8_t* mac,esp_mac_type_ttype); API 获取系统预设的分类 MAC 地址。


ESP32 SDK 中默认的蓝牙的发射功率是多少?

  • ESP32 SDK 中默认情况下使用功率级别 5,相应的发射功率为 +3 dBm。

  • ESP32 蓝牙的发射功率从 0 到 7,共有 8 个功率级别,发射功率范围从 –12 dBm 到 9 dBm。功率电平每增加 1 时,发射功率增加 3 dBm。


ESP32 Wi-Fi Smartconfig 配网和 Bluetooth® LE Mesh 可以同时使用吗?

不推荐同时打开。

  • Smartconfig 需要一直收配网数据,所以会一直占用天线,如果和 Bluetooth LE Mesh 共同使用,会导致失败率非常高。

  • Bluetooth LE Mesh 可以和 BluFi 同时使用,所以推荐配网方式选择 BluFi 配网。


ESP32 的经典蓝牙工作电流是多少?

A2DP (Single core CPU 160 Mhz,DFS = false,commit a7a90f)

电流

最大值 (mA)

最小值 (mA)

平均值

Scanning

106.4

30.8

37.8

Sniff

107.6

31.1

32.2

Play Music

123

90.1

100.4


ESP32 如何修改蓝牙的发射功率?

蓝牙发射功率可通过 esp_ble_tx_power_set(); 函数进行设置,可参见 esp_bt.h


ESP32 的 Bluetooth® LE 蓝牙配网兼容性如何?是否开源?

  • ESP32 的蓝牙配网,简称 BluFi 配网,兼容性与 Bluetooth LE 兼容性一致,测试过苹果、华为、小米、OPPO、魅族、一加、中兴等主流品手机,兼容性良好。

  • 目前 BluFi 协议及手机应用部分的代码都已经开源。


ESP32 运行 bt_spp_acceptor 例程时, IOS 设备无法扫描到 ESP32 设备是什么原因?

  • 苹果开放的蓝牙有:A2DP、HID 的 keyboard、avrcp 以及 SPP(需要 MFI)和高端的 Bluetooth® LE 外加给予 Bluetooth LE 的 ANCS。

  • 如果 IOS 设备想要和对端设备通过 SPP 通信,那么对端设备的 SPP 需要通过 MFI 认证。目前 ESP32 SPP 没有通过 MFI 认证,因此 IOS 设备无法扫描到 ESP32。


ESP32 Bluetooth® LE/Bluetooth® Secure Simple Pairing (SSP) 与 legacy pairing 安全性对比?

  • Secure Simple Pairing (SSP) 比 legacy pairing 更加安全。

  • legacy pairing 使用对称加密算法, Secure Simple Pairing (SSP) 使用的是非对称加密算法。


ESP32 Bluetooth® LE MTU 大小如何确定?

  • ESP32 端蓝牙 Bluetooth LE 默认的 MTU 为 23 字节,最大可以设置为 517 字节。

  • 手机端的 MTU 由手机端自行定义,最终通信的 MTU 选择两端 MTU 较小的那一个。


ESP32 Bluetooth® LE 模式下广播数据时遇到 “W (17370) BT_BTM: data exceed max adv packet length” 如何解决?

  • 出现该警告的原因是广播的数据长度超出最大广播数据包长度限制。

  • 广播有效载荷数据长度最大为 31 字节。如果超过 31 字节,那么蓝牙协议栈会丢弃一些数据,并且给出警告。

  • 如果需要广播的数据长度超出最大限制,超出的数据可以放在扫描响应数据包 (scan response data) 中。


ESP32 Bluetooth® LE 能否同时支持主从模式,作 gatt server 的同时,也可作为 gatt client 接收其他设备的广播数据?


ESP32 的 Bluetooth® LE 连接数 6 个以上会有哪些风险?

  • 通常要根据具体的应用决定,在常规场景下,ESP32 Bluetooth LE 连接 3 个设备可以稳定通信。

  • Bluetooth LE 的最大连接数未有一个准确的值,在多个 Bluetooth LE 设备同时连接的的时候,RF 是分时复用的,需要设计者保证每一个设备不会长时间占用导致其他设备超时断开。

  • 连接参数里面有 connection interval、connection window、latency、timeout, 可以在 latency 以内的不应答,但是若超过 timeout 的时间,将会导致连接断开。

  • 假设配置参数中 interval 是 100,window 是 5,Wi-Fi 关闭时,将会连接较多设备。如果用了 Wi-Fi,或者 interval 设置的太小,将只能连接较少设备。

  • 当 Bluetooth LE 支持多个设备并发连接时,RF 的 solt 管理出错概率会增加,所以 Bluetooth LE 设备连接较多时,需要针对具体场景调试。


使用 ESP32 设备作为 Bluetooth® LE 主机,最大支持多少台从机设备进行连接?

  • ESP32 的 Bluetooth LE 最大支持 9 台从机设备进行连接,建议连接数量不超过 3 个。

  • 可通过 menuconfig > Component config > Bluetooth > Bluetooth controller > BLE MAX Connections 进行配置。


ESP32 如何通过 Bluetooth® BR/EDR 传文件?

  • 可参考链接 classic bt 下的 bt_spp_acceptor 或者 bt_spp_initiator 例程。


ESP32 下载 ESP_SPP_SERVER 例程,如何修改蓝牙设备名称?

  • 蓝牙设备名称可以通过修改 adv 参数实现:

static const uint8_t spp_adv_data[23] = {
  0x02,0x01,0x06,
  0x03,0x03,0xF0,0xAB,
  0x0F,0x09,0x45,0x53,0x50,0x5f,0x53,0x50,0x50,0x5f,0x53,0x45,0x52,0x56,0x45,0x52};
  • 第三行 0x0F 表示后续数据长度为 15,0x09 表示数据类型(固定不变),0x45 开始后续数据代表设备名称对应的 ASCII 码(默认为:BLE_SPP_SERVER)。


ESP32 下载 BluFi 例程进行配网,若使用 EspBluFi APP 在配网过程配置了一个错误的 Wi-Fi 从而无法连接,此时从 APP 端向设备端发送“扫描”命令后就会导致设备重启,是什么原因?

  • BluFi 例程规定在 Wi-Fi 连接时不可以发送 Wi-Fi 扫描命令。

  • 但可在 blufi_example_main.c 文件下的 case ESP_BLUFI_EVENT_GET_WIFI_LIST:{}; 函数的首行增加 ESP_ERROR_CHECK(esp_wifi_disconnect()); 函数来解决此问题。


使用 ESP32,如何指定 BLE 连接/发送在 core 0 上运行?

  • ESP32 的 BLE 连接/发送目前仅支持指定在 core 1 上运行。可通过使能 menuconfigComponent configFreeRTOS > Run FreeRTOS only on first core 进行设置。

  • 根据此应用需求,可使用 xTaskCreatePinnedToCore() 或 xTaskCreateStaticPinnedToCore() API 来创建任务核分配。具体说明参见 core assignment


ESP32 设置中文蓝牙设备名称会异常显示乱码,原因是什么?

  • 这是因为此时编辑器的中文编码格式不是 UTF-8,需要把编辑器的编码格式改成 UTF-8。


使用 ESP32 在蓝牙通道上传分包时,一包最大传输数据长度为 253(MTU 设置为 263),导致在传输大量数据包进行多包读取时传输较慢。请问是否有 BluFi 扩展协议,可支持一包传输较大长度的数据,或者有其他解决方案可提高传输速率吗?

  • 在蓝牙通道上传输大量数据包进行多包读取时传输较慢,可通过调整蓝牙连接参数来改善传输速度。

  • BLE 包长度设置取决于 ESP_GATT_MAX_MTU_SIZE 设置,可参见 说明

  • 设置的 MTU Size 大小会影响数据传输率,有效的 MTU 长度需要通过 MTU 交换方式来改变默认的 MTU 的大小。最终进行 MTU 交换使用的 MTU Size 才是作为两者通信时的 MTU Size。可查看 MTU 交换后的值是多大,例如这样的值:

case ESP_GATTS_MTU_EVT:
        ESP_LOGI(GATTS_TAG, "ESP_GATTS_MTU_EVT, MTU %d", param->mtu.mtu);

ESP32 经典蓝牙支持哪些 Profile?

  • 目前支持 A2DP、AVRCP、SPP、HFP、HID。


ESP32-C3 Bluetooth® LE (BLE) 稳定连接的数目可以达到多少个?

  • 建议 4 个以内。


BLE 中如何修改广播的时间间隔?

  • 通过修改广播结构体中的 adv_int_minadv_int_max 两个参数来设置。这两个分别对应了广播时间间隔的最小值和最大值。

  • 广播时间间隔参数的取值范围为 0x0020 to 0x4000,默认值为 0x0800。对应的广播时间为参数值 * 0.625 ms,即广播时间间隔为 20 ms 到 10.24 s。

  • adv_int_minadv_int_max 不同时,广播的时间间隔在两者区间内产生,当最小值和最大值设置成同一个值时,时间间隔固定为该值。


ESP32 经典蓝牙配对时如何使手机端输入 PIN 码?

可以通过禁用 Secure Simple Pairing,从而仅支持 Legacy Pairing

  • v3.3 到 v4.0(不包含 v4.0):Component config > Bluetooth > Bluedroid Enable > [*] Classic Bluetooth > [ ]Secure Simple Pairing

  • v4.0 及以上:Component config > Bluetooth > Bluedroid Options > [ ] Secure Simple Pairing


ESP32 蓝牙占用多少内存?

  • 控制器:

    • BLE 单模:40 KB

    • BR/EDR 单模:65 KB

    • 双模:120 KB

  • 主设备:

    • BLE GATT Client(Gatt Client 演示):24 KB (.bss+.data) + 23 KB (heap) = 47 KB

    • BLE GATT Server(GATT Server 演示):23 KB (.bss+.data) + 23 KB (heap) = 46 KB

    • BLE GATT Client & GATT Server: 24 KB (.bss+.data) + 24 KB (heap) = 48 KB

    • SMP: 5 KB

    • 经典蓝牙(经典蓝牙 A2DP_SINK 演示,包含 SMP/SDP/A2DP/AVRCP):48 KB (.bss+.data) + 24 KB (heap) = 72 KB(示例运行时额外增加 13 KB)

注解

以上堆 (Heap) 均包含任务栈 (Task Stack),因为任务栈是从堆里分配出来的,算为堆。

  • 优化 PSRAM 版本:

在 ESP-IDF V3.0 及以后,打开 menuconfig 里蓝牙菜单的 PSRAM 相关选项,将 Bluedroid(Host) 的部分 .bss/.data 段及堆放入 PSRAM,可额外省出近 50 KB。


ESP32 使用 gattc_gatts_coex.c 例程测试 BLE 多连接,在 menuconfi 中将 BLE Max connection 配置选项设置为 “5” ,但实际只能连 4 个设备,连接第 5 个设备的时候会报错,是什么原因?

  • 请在 menuconfig 中将 BT/BLE MAX ACL CONNECTIONS 配置选项设置为 “5”。


ESP32-C3 BLE 同时支持主从模式吗?主、从模式连接数分别是多少?

IDF: release/v4.3, master

  • ESP32-C3 同时支持主从模式,共用 8 个连接。例如,ESP32-C3 连接了 4 个 slave 设备,那么可被 8 - 4 = 4 个 master 设备连接。

  • 另外,ESP32-C3 用作 slave 时,可被 8 个 master 设备连接;用作 master 时,可连接 8 个 slave 设备。


ESP32 经典蓝牙的 MTU Size 最大可设多大呢?

  • ESP32 经典蓝牙有两种协议,分别为 A2DP 和 SPP 协议。BT A2DP 的 MTU Size 最大设置(默认)为 1008 字节,其中包头占 12 字节,应用层实际传输的数据量即为 1008 - 12 = 996(字节);BT SPP 的 MTU Size 最大(默认)设置为 990 字节。


Wi-Fi 和 蓝牙共存时,频繁通信出现 ELxXX error(比如 ELx200)如何解决?

CHIP: ESP32

  • 该问题目前已在 commit 386a8e37f19fecc9ef62e72441e6e1272fa985b9 修补,请切换至对应的 commit 进行测试。


BLE 如何抓包?

  • 市面上有很多工具可供选择,比如:

    • TI Packet sniffer

    • NRF Packet sniffer


使用 ESP32 开发板,测试好几个版本的 ESP-IDF 下的 BluFi 例程进行配网,点击配网之后都会打印如下报错,是什么原因?

E (117198) BT_L2CAP: l2ble_update_att_acl_pkt_num not found p_tcb
W (117198) BT_BTC: btc_blufi_send_encap wait to send blufi custom data
  • 当出现此报错,请在 components/bt/host/bluedroid/btc/profile/esp/blufi/blufi_prf.c 文件下,把 esp_ble_get_cur_sendable_packets_num(blufi_env.conn_id) 换成 esp_ble_get_sendable_packets_num()

  • 此问题已经在所有分支上面进行修复,可以更新 ESP-IDF 为最新 Release 版本。


使用 ESP32,请问蓝牙能否使用 light-sleep 模式,并在 light-sleep 模式下保持蓝牙连接?


如何修改 ESP32 的蓝牙广播名称?

  • 要修改的结构体如下:

static uint8_t raw_adv_data[] = {

        /* flags*/

        0x02, 0x01, 0x06,

        /* tx power*/

        0x02, 0x0a, 0xeb,

        /* service uuid*/

        0x03, 0x03, 0xFF, 0x00,

        /* device name*/

        0x0f, 0x09, 'E', 'S', 'P', '_', 'G', 'A', 'T', 'T', 'S', '_', 'D','E', 'M', 'O'

};
  • 上述 /* device name*/ 为修改项。其中 0x0f 为此字段类型加具体内容的总长度,0x09 表示此类型代指设备名。后续的 ‘E’, ‘S’, ‘P’, ‘_’, ‘G’, ‘A’, ‘T’, ‘T’, ‘S’, ‘_’, ‘D’,’E’, ‘M’, ‘O’ 为广播设备名的 ASCII 码表达。


BLE 5.0 广播设置为 legacy 模式时支持最大广播长度为多少?

  • 最大支持到 31-byte。


BLE 广播包如何设置为不可连接包?

CHIP: ESP32

  • 可参考 gatt_server demo, 将广播包类型 adv_type 变量修改为 ADV_TYPE_NONCONN_IND。

    static esp_ble_adv_params_t adv_params = {
      .adv_int_min        = 0x20,
      .adv_int_max        = 0x40,
      .adv_type           = ADV_TYPE_NONCONN_IND,
      .own_addr_type      = BLE_ADDR_TYPE_PUBLIC,
      //.peer_addr            =
      //.peer_addr_type       =
      .channel_map        = ADV_CHNL_ALL,
      .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
      }
    

怎样通过串口给 ESP32-WROOM-32D 模块直接发送蓝牙 HCI 命令?

  • 请参考例程 controller_hci_uart_esp32

  • ESP32 用作 controller,其他设备作为 host,可通过 UART 给 ESP32 发送 HCI 指令。


ESP32 是否支持 A2DP 发送音频?

ESP32 支持 A2DP 发送音频,可参考例程 a2dp_source


ESP32 Bluetooth LE 白名单最多支持多少个设备?

  • 最多支持 12 个。


ESP32 低功耗蓝牙可以使用 PSRAM 吗?

请前往 Component config > Bluetooth > Bluedroid Options 开启 BT/BLE will first malloc the memory from the PSRAM 配置,即可让低功耗蓝牙使用 PSRAM。


没找到答案?
请前往 ESP 论坛ESP GitHub 发现更多信息吧!

对本文档有建议?提交文档反馈