ESP32 蓝牙AT指令实战:构建BLE透传与安全配对应用 1. ESP32蓝牙AT指令基础入门第一次接触ESP32的蓝牙AT指令时我完全被各种专业术语搞晕了。BLE、GATT、UUID这些概念听起来高大上其实用起来比想象中简单得多。ESP32的蓝牙功能分为经典蓝牙和低功耗蓝牙(BLE)两种模式我们今天重点讨论BLE模式下的AT指令操作。AT指令是什么简单说就是通过串口发送的文本命令比如ATBLEINIT2这样的字符串。ESP32收到后会执行对应操作并返回结果。这种交互方式特别适合在资源受限的嵌入式系统中使用不需要复杂的协议栈一个USB转TTL模块就能搞定。准备工具清单安信可ESP32-S模组/开发板USB转TTL调试工具CH340/CP2102都行串口调试助手推荐使用Putty或SecureCRTBLE调试APPnRF Connect或LightBlue注意使用前请确保固件版本支持BLE AT指令建议下载最新AT固件。我在早期版本上遇到过不少坑升级后问题都解决了。2. 快速搭建BLE服务器2.1 设备初始化与广播设置先来点干货5分钟让你的ESP32被手机发现ATBLEINIT2 # 初始化BLE服务端模式 ATBLENAMEMyESP32 # 设置设备名称 ATBLEADVDATA0201060A094D794553503332 # 设置广播数据 ATBLEADVSTART # 开始广播这段代码中广播数据0201060A094D794553503332需要解释下02 01 06表示BLE Only模式0A 09后面跟着10字节的完整设备名4D794553503332MyESP32的十六进制ASCII码我在实际测试中发现广播间隔对连接成功率影响很大。默认参数下有些手机可能扫描不到设备这时可以调整广播间隔ATBLEADVINT100,200 # 设置最小100ms最大200ms的广播间隔2.2 服务与特征值创建BLE通信的核心是GATT协议它定义了服务(Service)和特征值(Characteristic)的层级关系。就像一家餐厅有多个服务部门(服务)每个部门提供不同的菜品(特征值)。创建基础服务的完整流程ATBLEGATTSSRVCRE # 创建GATT服务 ATBLEGATTSSRVSTART # 启动服务创建特征值时需要特别注意属性配置。比如要实现透传功能需要发送特征支持Notify或Indicate属性接收特征支持Write属性3. 实现稳定BLE透传3.1 透传参数配置透传模式就像在两个设备间架设了一条数据管道一端输入的数据会原样从另一端输出。配置命令如下ATBLESPPCFG1,1,6,1,5 # 启用透传使用1号服务的6号特征发送5号特征接收参数选择有讲究先用ATBLEGATTSCHAR?查询特征列表发送特征要选支持Notify/Indicate的接收特征要选支持Write的3.2 数据收发实战开启透传模式后数据交换变得异常简单ATBLESPP # 进入透传模式 Hello World # 发送数据 BLERECV:0,1,5,11,48656C6C6F20576F726C64 # 接收到的数据(十六进制)实测中发现MTU大小会影响传输效率。默认23字节的MTU对于大文件传输太慢了可以这样优化ATBLECFGMTU0,200 # 设置MTU为200字节4. 安全配对与加密通信4.1 静态密钥配对方案默认的动态配对码每次都要重新输入用户体验很差。静态密钥方案可以解决这个问题ATBLESECPARAM1,0,16,3,3 # 设置安全参数 ATBLESETKEY123456 # 设置静态配对码 ATBLEENC0,3 # 请求加密连接这个方案我在智能门锁项目中使用过实测小米/华为手机都能稳定连接。注意密钥长度最好6位以上太简单会被系统拒绝。4.2 连接参数优化蓝牙连接不稳定可能是参数没调好。关键参数有三个连接间隔(Connection Interval)7.5ms-4s从机延迟(Slave Latency)0-499监控超时(Supervision Timeout)100ms-32s推荐这样设置ATBLECONNPARAM0,16,32,0,600 # 间隔20-40ms超时6s5. 常见问题排查指南5.1 连接失败排查步骤遇到连接问题时可以按照这个checklist排查确认设备处于可发现状态LED闪烁检查手机蓝牙是否开启查看AT指令返回错误码尝试重置蓝牙模块ATRESTORE5.2 性能优化技巧提升BLE传输速度的三个关键点增大MTU最高可设517字节缩短连接间隔平衡功耗与速度使用数据长度扩展ATBLEDATALEN0,2516. 项目实战环境监测节点去年我做了一个温湿度监测项目ESP32通过BLE每5分钟上报数据到手机。核心代码如下# 初始化 ATBLEINIT2 ATBLENAMEEnvMonitor ATBLEADVDATA0201060A09456E764D6F6E69746F72 # 创建自定义服务 ATBLEGATTSSRVCRE ATBLEGATTSCHAR1,1,0x2A6E,0x12 # 温度特征 ATBLEGATTSCHAR1,2,0x2A6F,0x12 # 湿度特征 # 上报数据 ATBLEGATTSNTFY0,1,1,2,2265 # 22.65℃ ATBLEGATTSNTFY0,1,2,2,4865 # 48.65%RH这个项目跑了半年多稳定性非常好。关键是要处理好低功耗设计我使用了ESP32的深度睡眠模式两节AA电池能用3个月。