@ESP32 芯片平台的蓝牙 Demo 使用方法

ESP32 芯片是集成了 2.4 GHz Wi-Fi 和蓝牙双模的 SoC 方案。之前玩转 ESP8266 芯片的大都是 Wi-Fi 开发者,升级到 ESP32 芯片平台时对 Wi-Fi 部分还比较熟悉操作,但对新增加的蓝牙部分可能还不太了解,所以本文目的就是演示一下,指引想应用 ESP32 芯片蓝牙功能的开发者们该如何入手。

ESP32 芯片的 Wi-Fi 功能本文就略过不提了,直接谈蓝牙部分。ESP32 支持蓝牙 v4.2 的完整标准,包括传统蓝牙 (BR/EDR) 和低功耗蓝牙 (BLE)。
那么怎么来测试蓝牙功能呢?
在我们的 ESP-IDF 1.0 中已经包含了三个 BLE demo,分别是:05_ble_adv、14_gatt_server 和 15_gatt_client。

首先,我们来看第一个 demo:05_ble_adv

这是一个发送广播 (advertising) 的 demo。

进入 ESP-IDF 目录后(请在 github.com/espressif/esp-idf 下载),可以直接执行 make clean 再执行 make。弹出 make menuconfig 的图形用户界面 (GUI) 之后,可打开 BT 选项,如下图所示:

esp32蓝牙ota例程 esp32经典蓝牙例子_gatt


make flash 会编译源码,并且在编译好之后会烧录 BIN 文件。下图为烧录成功的打印信息:

esp32蓝牙ota例程 esp32经典蓝牙例子_gatt_02


连上串口工具,会有如下打印:

esp32蓝牙ota例程 esp32经典蓝牙例子_gatt_03


让我们来看看发生了什么?拿出安卓手机,打开 BLE 软件 BLEDeng (可以在应用商店下载),发现搜到了名为 ESP-BLE-HELLO 的设备,这个就是 05_ble_adv/main/app_bt.c demo 中设置的名字。

esp32蓝牙ota例程 esp32经典蓝牙例子_esp32蓝牙ota例程_04


esp32蓝牙ota例程 esp32经典蓝牙例子_gatt_05


用户通过 05_ble_adv 下的 readme.rst,可以发现这个 demo 只是一个通过主机控制接口 (HCI) 直接控制蓝牙控制器发送广播的小程序。

esp32蓝牙ota例程 esp32经典蓝牙例子_esp32蓝牙ota例程_06


其次,我们来看一下蓝牙主机的 demo,例如 GATT。

ESP-IDF 的 examples 目录下面还有 14_gatt_server 和 15_gatt_client,这就是 GATT 的 demo。我们以 14_gatt_server 的 demo 为例,来进行测试。

进入 14_gatt_server 的界面,同样可以直接编译,如果弹出 make menuconfig 的 GUI,同样检查一下 BT_ENABLE 的选项,并打开它。有了 05_ble_adv 的 demo 编译和烧录的经验,这个程序很快就能编译好,并且烧录成功。打开串口工具,发现了如下打印:

esp32蓝牙ota例程 esp32经典蓝牙例子_串口_07


这个串口的打印,比 05_ble_adv 的 demo 多了一些 CREATE_SERVICE、ADD_CHAR、ADD_DESCR 的字眼,这个很明显就是创建了 GATT 的服务,添加了特性和描述。

此时,我们打开 LightBlue 软件,可以看到搜索到了设备 ESP_GATTS_DEMO。

esp32蓝牙ota例程 esp32经典蓝牙例子_串口_08


再连接 GATT Server,发现已经可以连接成功了,显示出一个为 0xFF 的通用唯一识别码 (UUID),这个 UUID 很明显是 demo 自定义的啦。

esp32蓝牙ota例程 esp32经典蓝牙例子_esp32蓝牙ota例程_09


我们再点进去这个 Service 看一下,发现可以读写特性,小编的截图已经是多次读取过特性和写过特性的

esp32蓝牙ota例程 esp32经典蓝牙例子_串口_10


这里的 READ 操作返回的 0xDEEDBEEF 是在代码的哪里呢?打开 demo 的代码,会发现程序的 123 行收到了 GATTS_READ_EVT,这个表示的就是收到了 GATT 的读请求事件,收到事件后,程序固定发送 0xdeedbeef 的值的响应,正好与手机 app 里看到的是一致的。

esp32蓝牙ota例程 esp32经典蓝牙例子_串口_11


说完读操作,再来看看写操作吧。

当小编写入特性值 0x8899 的时候,在最下面的串口 log 也可以看到 ESP32 已经接收到了正确的值,测试成功。

esp32蓝牙ota例程 esp32经典蓝牙例子_gatt_12