陈拓 2021/12/12-2021/12/13
1. 简介
- 官方文档
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/bluetooth/index.html
- 官方例程
https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/bluetooth/bluedroid/ble/gatt_client
ESP-IDF Gatt Client Example
此示例演示如何使用ESP API创建GATT客户端。
2. 开发环境
《Win10启用Linux子系统安装Ubuntu》
https://blog.csdn.net/chentuo2000/article/details/112131624
《用乐鑫国内Gitee镜像搭建ESP32开发环境》
https://blog.csdn.net/chentuo2000/article/details/113424934
3. 构建项目
- 复制官方例程
将官方例子项目复制到ESP-IDF开发工具之外,更名为esp32_gatt_client:
cp -r ~/esp/esp-idf/examples/bluetooth/bluedroid/ble/gatt_client ~/esp/esp32_gatt_client
- 项目树
cd ~/esp/esp32_gatt_client
- 刷新esp-idf环境
get_idf
- 配置项目
idf.py menuconfig
保持默认值,退出。
- 编译项目
idf.py build
- 烧写项目
连接设备时我PC将USB-SERIAL识别为COM3。
idf.py -p /dev/ttyS3 -b 115200 flash
4. 测试
- 模拟BLE设备
安装测试工具。在这里我们用nrf connect app。
在手机上安装这个工具软件,苹果安卓手机都可以。
安装好之后先设置一下。
1) 打开app,选择ADVERTISER
2) 按红色加号添加BLE设备
编辑广播包,点OK。
3) 启动广播
点击右边的灰色按钮。
4) 设置广播持续时间
5) 开始广播
右边的灰色按钮变成蓝色,开始广播。
可以添加多个蓝牙设备进行测试。
- 查看串口信息
按一下开发板上的RST按钮:
看串口数据:
5. 显示广播包数据和扫描响应数据
默认是不显示广播包数据和扫描响应数据的,这由位于main目录下的Kconfig.projbuild设置项控制:
menu "Example Configuration"
config EXAMPLE_DUMP_ADV_DATA_AND_SCAN_RESP
bool "Dump whole adv data and scan response data in example"
default n
endmenu
EXAMPLE_DUMP_ADV_DATA_AND_SCAN_RESP在程序中是数据输出的控制条件:
#if CONFIG_EXAMPLE_DUMP_ADV_DATA_AND_SCAN_RESP
if (scan_result->scan_rst.adv_data_len > 0) {
ESP_LOGI(GATTC_TAG, "adv data:");
esp_log_buffer_hex(GATTC_TAG, &scan_result->scan_rst.ble_adv[0], scan_result->scan_rst.adv_data_len);
}
if (scan_result->scan_rst.scan_rsp_len > 0) {
ESP_LOGI(GATTC_TAG, "scan resp:");
esp_log_buffer_hex(GATTC_TAG, &scan_result->scan_rst.ble_adv[scan_result->scan_rst.adv_data_len], scan_result->scan_rst.scan_rsp_len);
}
#endif
要输出广播包数据和扫描响应数据,用idf.py menuconfig命令设置:
保存,退出。
看结果:
我们已经可以看到adv数据了。
6. 实现gatt client永久扫描
默认情况下30秒以后扫描就停止了,如果要实现永久扫描请看《ESP32开发笔记 如何实现 demo gatt client永久扫描》
https://blog.csdn.net/weixin_42788872/article/details/106527986
一文中的方法。
找到代码中的:
uint32_t duration = 30;
改成:
uint32_t duration = 0;
当duration的值为0时,将会永久扫描⽽而不不产⽣生超时。