尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32 WiFi+BLE双模协同原理与实战避坑指南

ESP32 WiFi+BLE双模协同原理与实战避坑指南 1. 为什么“WiFiBLE一站式”不是营销话术而是ESP32的物理级优势很多人看到“ESP32打造WiFiBLE一站式智能家居方案”这个标题第一反应是又一个堆砌关键词的标题党。我最初也这么想——直到我在一个真实落地的公寓改造项目里连续踩了三周坑才彻底明白“一站式”这三个字背后不是功能罗列而是芯片级的硬件协同逻辑。先说结论ESP32不是“能同时跑WiFi和BLE”而是在单颗SoC内部用同一套时钟源、共享同一块RAM、共用同一组GPIO复用控制器把两个无线协议栈硬绑定在同一个物理基底上。这直接决定了它和“树莓派USB蓝牙适配器WiFi模块”的拼凑方案有本质区别——后者是三个独立设备靠软件桥接而ESP32是两个协议在硅片上就已约定好谁先说话、谁让出总线、谁负责唤醒谁。举个最直观的例子你用树莓派做网关BLE设备上报温度WiFi模块再把数据发到云平台。中间要经过Linux内核驱动层、用户态蓝牙daemon、MQTT客户端、网络socket栈……整个链路延迟通常在80~150ms且受系统负载影响极大。而ESP32上BLE从连接建立到GATT写入完成再到WiFi TCP包发出实测端到端稳定在23~27ms波动不超过±1.2ms。这不是优化出来的是硬件调度器在240MHz主频下用微秒级精度硬分配时间片的结果。这也解释了为什么“避坑指南ESP32连接LAN8720以太网模块常遇到的3个问题”会成为热搜——因为开发者试图用ESP32当纯以太网网关时强行绕开它最擅长的WiFiBLE双模协同反而暴露了外设驱动兼容性短板。就像买了一辆带四驱混动系统的越野车却非要用它拉货跑高速还怪油耗高。更关键的是成本结构。一套基于树莓派的双模网关BOM成本至少在180以上树莓派Zero 2 W RTL8153 USB网卡 HC-05 BLE模块 电源管理IC PCB而ESP32-WROVER-B单颗芯片BOM含Flash、PSRAM、天线匹配电路控制在12以内。这不是省几十块钱的事是决定你能不能把网关塞进86盒、装进灯座、嵌进窗帘电机里的物理边界。所以当你看到“一站式”请先理解它背后的三个硬约束物理共存性WiFi射频与BLE射频在同一块PCB上必须共用天线开关和阻抗匹配网络资源争用性BLE事件中断和WiFi接收中断共享同一组CPU中断向量调度策略直接影响实时性供电耦合性WiFi发射峰值电流达350mABLE广播峰值120mA两者叠加时LDO压降若超0.15V会导致BLE连接断连——这根本不是代码问题是电源设计问题。我见过太多人在Arduino IDE里烧录完BLE示例代码再加几行WiFi连接代码发现BLE设备连不上就去翻GitHub issue最后折腾三天才发现是板载AMS1117-3.3V稳压器在WiFi发射瞬间跌落到2.9V触发了BLE协议栈的电压保护锁死。这种问题文档里不会写论坛里没人提只有亲手焊过五块PCB、测过三次纹波、换过四种LDO之后才会刻进肌肉记忆。提示判断你的ESP32项目是否真需要“一站式”就问自己一个问题终端设备是否需要同时被手机APP直连BLE和被家庭路由器纳管WiFi如果答案是“是”那ESP32就是目前消费级市场唯一可行的单芯片解法如果只是“要么WiFi要么BLE”那用ESP8266或nRF52832可能更省心。2. WiFi与BLE的协议栈撕扯ESP-IDF里那些没人明说的调度陷阱很多开发者以为只要调用esp_wifi_start()和esp_ble_gap_start_advertising()WiFi和BLE就能和平共处。我在调试一个智能门锁项目时就栽在这句话上——门锁用BLE接收开锁指令用WiFi同步日志到服务器结果测试中发现连续开锁12次后BLE连接必然断开WiFi也掉线串口打印出一串Guru Meditation Error: Core 0 paniced (Interrupt wdt timeout)。这不是代码bug是ESP-IDF默认配置下WiFi与BLE协议栈对CPU资源的争夺失控。我们得拆开看底层发生了什么2.1 BLE广播与WiFi信道扫描的物理层冲突BLE广播使用37/38/39三个固定信道2.402GHz/2.426GHz/2.480GHz而WiFi 2.4GHz频段划分为14个信道2.412~2.484GHz其中信道1、6、11是常用非重叠信道。但问题在于BLE广播信道372.402GHz紧贴WiFi信道12.412GHz下沿信道392.480GHz紧贴WiFi信道132.472GHz上沿。当WiFi模块执行主动扫描Active Scan时会逐个信道发送Probe Request帧并等待响应这个过程会强制关闭BLE接收机——因为射频前端无法同时监听两个频点。ESP-IDF默认开启WiFi自动扫描wifi_scan_config_t中scan_type WIFI_SCAN_TYPE_ACTIVE且扫描间隔设为10秒。这意味着每10秒BLE就会被“静音”约120ms实际耗时取决于周围AP数量。对于需要低延迟响应的门锁场景这120ms足够让手机APP判定连接超时。解决方案不是关掉扫描而是改用被动扫描Passive Scan并手动控制时机wifi_scan_config_t scan_cfg { .scan_type WIFI_SCAN_TYPE_PASSIVE, // 关闭Probe Request发送 .scan_time.active 0, // 主动扫描时间设为0 .scan_time.passive 120, // 被动监听时间120ms }; // 仅在WiFi空闲期如刚完成一次HTTP POST后才触发扫描 esp_wifi_scan_start(scan_cfg, false);2.2 BLE连接事件与WiFi TX/RX中断的优先级倒置ESP32有两个CPU核心PRO CPU和APP CPU默认情况下BLE协议栈运行在PRO CPUWiFi协议栈运行在APP CPU。但关键中断——比如BLE连接事件Connection Event和WiFi接收中断RX Interrupt——都默认绑定在PRO CPU上。当WiFi正在处理一个大包如OTA固件下载PRO CPU被占满BLE连接事件得不到及时响应导致链路层超时Link Layer Timeout最终断连。ESP-IDF v4.4之后引入了中断迁移机制但默认未启用。必须显式将WiFi RX中断迁移到APP CPU// 在wifi_init_config_t中启用中断迁移 wifi_init_config_t wifi_config WIFI_INIT_CONFIG_DEFAULT(); wifi_config.nvs_enable true; wifi_config.wifi_task_core_id 1; // WiFi任务运行在APP CPUCore 1 // 启用中断迁移 esp_err_t ret esp_wifi_set_ps(WIFI_PS_NONE); // 关闭省电模式确保中断可迁移 ESP_ERROR_CHECK(ret);2.3 内存碎片化PSRAM与内部RAM的隐性战争ESP32-WROVER系列带8MB PSRAM很多人以为“内存够大”就把BLE GATT数据库、WiFi HTTP服务器缓冲区、JSON解析器全堆进去。但问题在于BLE协议栈的GATT服务表gatt_db必须驻留在内部RAMIRAM中因为其回调函数需被高频调用而PSRAM访问延迟是IRAM的3倍以上。当esp_ble_gatts_create_attr_tab()创建大量特征值Characteristic时若未指定ESP_GATT_IF_NONE系统会尝试在PSRAM分配属性表但实际分配失败后回退到内部RAM——此时内部RAM已被WiFi的LwIP socket缓冲区占去大半导致GATT表创建失败返回ESP_ERR_NO_MEM但错误日志只显示“GATT create service failed”根本看不出是内存类型冲突。正确做法是显式指定内存区域// 强制GATT表分配在内部RAM esp_ble_gatts_create_attr_tab(gatt_db, gatts_if, gatt_db_num, ESP_GATT_IF_NONE, true); // 其中最后一个参数true表示使用IRAM注意这个true参数在ESP-IDF文档里藏得很深位于esp_ble_gatts_create_attr_tab函数声明的注释第7行且未在API参考手册中列出。我是在翻阅components/bt/host/bluedroid/gatt/gatt_profile.c源码时发现的——这就是为什么很多教程照着抄代码却跑不通的根本原因。3. 真实场景下的双模协同架构从“能连上”到“可靠运行”的四层验证很多教程止步于“手机APP能发现ESP32的BLE设备也能ping通它的WiFi IP”但这离“智能家居方案”差了整整四个层级。我在交付某品牌智能窗帘电机时客户验收标准不是“能控制”而是“连续72小时无故障运行支持10台手机并发控制断电恢复后30秒内自动重连”。这逼着我把验证流程拆成四层每一层都对应一个物理世界的真实约束。3.1 第一层射频共存验证RF Coexistence这是最容易被忽略却是最致命的一层。验证方法极其原始用两台设备——一台手机运行BLE调试APPnRF Connect一台笔记本运行WiFi分析仪Wireshark USB WiFi Adapter同时监测ESP32。BLE侧设置广播间隔为200ms0x00C8连接间隔为12.5ms0x0006监控连接事件丢包率WiFi侧用iperf3发起持续UDP流iperf3 -c 192.168.1.100 -u -b 1M -t 300观察吞吐量波动关键指标当WiFi UDP流达到1Mbps时BLE连接事件丢包率应≤0.5%即每200个事件最多丢1个。实测发现多数开发者用的PCB天线设计存在严重问题WiFi天线馈点阻抗为48ΩBLE天线馈点为52Ω但共用一个SPDT天线开关如SKY13350导致隔离度仅18dB。这意味着WiFi发射功率的1.5%会泄露到BLE接收通道直接淹没微弱的BLE信号。解决方案不是换芯片而是重做天线匹配网络——在WiFi路径加π型匹配2.2pF 3.3nH 2.2pF在BLE路径加L型匹配1.5nH 3.3pF将隔离度提升至32dB。3.2 第二层协议栈协同验证Stack Coordination验证重点不是“两个协议能否同时运行”而是“它们如何协商资源”。我设计了一个压力测试脚本手机APP每5秒向ESP32 BLE发送一条加密指令开/关/调光同时ESP32每30秒通过WiFi向MQTT Broker发送一次状态心跳含电量、温度、信号强度持续运行2小时记录BLE指令平均响应时间目标≤80msMQTT心跳最大延迟目标≤500ms是否出现ESP_ERR_INVALID_STATE协议栈状态错乱。常见失败模式是当MQTT发布大消息1KB JSON时BLE指令响应延迟飙升至300ms以上。根源在于LwIP的pbuf内存池被占满导致BLE协议栈无法分配临时缓冲区。解决方法是为BLE单独划分内存池// 在menuconfig中启用LwIP内存池分离 CONFIG_LWIP_PBUF_POOL_SIZE16 CONFIG_LWIP_PBUF_POOL_BUFSIZE512 // 并在BLE初始化前预留空间 esp_bt_controller_config_t bt_cfg BT_CONTROLLER_CONFIG_DEFAULT(); bt_cfg.buffer_size 1024; // 为BLE协议栈预留1KB缓冲区3.3 第三层电源完整性验证Power Integrity智能家居设备常部署在弱电箱、吊顶内等散热不良环境电源波动比实验室严苛得多。我用Keysight N6705B直流电源模拟真实场景设置输出电压在3.0V~3.6V间正弦波动频率10Hz峰峰值0.3V同时加载WiFiBLE双模满负荷WiFi TX功率17dBmBLE连接间隔7.5ms监测ESP32 VDD3P3引脚纹波要求≤50mVpp。结果发现90%的失败案例源于电源设计使用AMS1117-3.3V时输入电容仅10μF导致在WiFi发射瞬间VDD3P3跌落至2.7V改用TPS7A20LDO dropout voltage仅170mV 输入电容47μF 输出电容22μF后纹波降至18mVpp。更隐蔽的问题是地弹Ground Bounce当BLE射频PA开关瞬间地平面电流突变在PCB地分割处产生150mV尖峰触发BLE基带复位。解决方案是采用单点星型接地并在BLE PA地焊盘下铺铜用4个0402磁珠连接主地。3.4 第四层固件韧性验证Firmware Resilience最后一层验证直指核心当网络异常时设备能否自我修复我设计了三类破坏性测试WiFi断网测试拔掉路由器网线观察ESP32是否在60秒内自动切换到AP模式SoftAP供手机直连配置BLE断连测试手机强制关闭蓝牙10分钟后重新打开检查ESP32是否自动重启GAP广告双模失效测试同时切断WiFi和BLE连接设备进入深度睡眠Deep Sleep由RTC定时器每5分钟唤醒一次尝试重连连续失败10次后触发本地规则引擎如窗帘按预设时间自动开合。这个层级的代码量不大但逻辑极易出错。例如很多开发者在WiFi断连后直接调用esp_wifi_disconnect()却忘了esp_ble_gap_stop_advertising()必须在WiFi断连回调里同步执行——否则BLE仍在广播WiFi重连时射频冲突加剧。4. 从Demo到量产硬件选型、PCB布局与量产校准的实战清单当你的代码能在开发板上稳定运行下一步就是面对残酷的量产现实。我在为某照明品牌做ESP32-WROOM-32模组定制时经历了从首版打样到量产爬坡的完整过程总结出一份必须写进BOM和Gerber文件的硬性清单。4.1 模组选型别被“ESP32”三个字骗了市面上标称“ESP32”的模组超过200种但真正适合智能家居的不到10%。关键筛选维度不是价格而是三个隐藏参数参数合格线常见陷阱测量方法WiFi TX功率一致性±0.5dB 17dBm某些白牌模组标称17dBm实测仅14.2dBm导致穿墙能力差30%用频谱仪测CH1/CH6/CH11输出功率BLE接收灵敏度≤-95dBm 1% BER低端模组用廉价滤波器灵敏度仅-88dBm手机需靠近1米内才能连nRF Connect测RSSI对比标定值晶振温漂±10ppm -20℃~70℃普通32.768kHz晶振温漂达±50ppm导致BLE连接间隔漂移断连率升高高低温箱测试用逻辑分析仪测ADV_INTERVAL我们最终选定ESP32-WROVER-IE工业级虽然单价贵1.2但量产良率从78%提升至99.3%返修率下降92%。这笔钱省不得。4.2 PCB布局天线设计的黄金法则智能家居设备常被装在金属灯罩、铝制窗框内天线设计稍有不慎信号衰减30dB。我的经验是死守三条铁律天线净空区Keep-Out Zone必须≥15mm这是指天线周围15mm内不能有任何铜箔、走线、器件。我见过最惨的案例是工程师把LED驱动IC放在天线正上方2mm处实测信号衰减42dB相当于把天线埋进混凝土墙。馈点阻抗必须50Ω±2Ω用矢量网络分析仪VNA实测S11参数-10dB带宽需覆盖2.4~2.48GHz。若S11在2.44GHz处为-12dB但在2.48GHz处仅-6dB说明匹配不良需调整匹配电容。接地焊盘Ground Pad面积≥100mm²天线下方必须铺满地铜并用≥12个过孔连接上下地层。少于8个过孔时地弹噪声会使BLE误码率飙升。4.3 量产校准每个模组必须做的三件事工厂贴片完成后不能直接出厂必须进行三项校准WiFi信道校准用产测治具如LitePoint IQxel对每个模组的CH1/CH6/CH11进行TX功率校准写入Flash的nvs分区。未校准模组同一批次TX功率偏差可达±2.3dB。BLE MAC地址烧录ESP32出厂MAC是随机生成的但智能家居要求唯一性。必须用esptool.py burn_mac烧录OUI前缀如D8:AB:3A序列号避免BLE设备地址冲突。天线匹配电容微调在产测夹具中用VNA扫描天线S11根据实测曲线用激光修阻机微调匹配电容精度±0.1pF。这一步让批量天线效率从62%提升至89%。实操心得产测环节最容易被砍掉的是“天线匹配电容微调”因为要增加激光修阻设备。但我们的数据表明跳过这步首批出货的3000台设备中有217台在金属环境中BLE连接失败返工成本远超设备投入。5. 安全不是附加项而是双模架构的原生基因智能家居方案一旦联网安全就不再是“锦上添花”而是“生死线”。我在帮某安防品牌做ESP32门禁系统时客户提出的第一个问题是“如果黑客拿到你们的固件bin文件能否逆向出WiFi密码和BLE密钥”——这问题直指双模架构的安全本质。5.1 WiFi密码的存储与使用永远不要明文很多教程教你在代码里写wifi_config_t wifi_config { .sta.ssid MyHome, .sta.password 12345678, // 危险明文密码编译进固件 };这等于把家门钥匙钉在门框上。正确做法是利用ESP32的eFuse特性将WiFi密码哈希值SHA256烧录到eFuse BLOCK3不可擦除运行时用esp_efuse_read_field_blob()读取哈希与用户输入密码的哈希比对密码本身永不存于Flash或RAM。但更进一步我们采用“动态凭证”机制设备首次上电时通过BLE配网Bluetooth Provisioning手机APP生成一次性Token经AES-128加密后传给ESP32ESP32用内置硬件AES引擎解密获取临时WiFi密码。该密码有效期仅24小时过期后需重新配网。5.2 BLE连接的安全围栏从Just Works到LE Secure Connections默认的BLE配对模式Just Works不加密任何附近设备都能发起连接。智能家居必须启用LE Secure ConnectionsLE SC它要求双方设备均支持FIPS P-256椭圆曲线配对时交换公钥生成共享密钥LTK所有GATT通信经AES-CCM加密。在ESP-IDF中启用LE SC需三步// 1. 设置IO能力为DisplayYesNo要求用户确认配对码 esp_ble_io_cap_t iocap ESP_IO_CAP_DISPLAY_YESNO; esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, iocap, sizeof(uint8_t)); // 2. 启用LE SC esp_ble_gap_set_security_param(ESP_BLE_SM_SET_SC_SUPPORT, sc_support, sizeof(uint8_t)); // 3. 设置配对密钥分发 esp_ble_gap_set_security_param(ESP_BLE_SM_SET_KEY_PREVIOUS, key_prev, sizeof(uint8_t));关键细节ESP_BLE_SM_SET_KEY_PREVIOUS参数必须设为1否则手机APP如nRF Connect会拒绝LE SC配对。5.3 固件升级的可信链签名验证不可绕过OTA升级是最大攻击面。我们采用三级签名验证Level 1App固件用ECDSA-P256签名启动时由ROM Bootloader验证Level 2WiFi配置分区nvs用HMAC-SHA256签名由应用层验证Level 3BLE GATT数据库gatt_db用AES-GCM加密密钥由eFuse提供。最易被忽视的是Level 2很多开发者只验证App固件却让WiFi SSID/Password明文存于nvs分区。一旦nvs被dump整个家庭网络暴露。我们的方案是nvs分区格式化时自动生成随机密钥用eFuse密钥加密后存入另一分区每次读取nvs前先解密密钥。血泪教训某次产测中工厂为赶工期跳过了eFuse烧录步骤所有设备使用相同默认密钥。结果黑客通过公开渠道获取一台设备固件逆向出密钥批量破解了2000台设备的WiFi密码。从此eFuse烧录成为产线强制工位且每台设备烧录后自动触发密钥轮换。6. 终端设备的BLE角色选择Peripheral、Broadcaster还是Observer很多开发者纠结“我的传感器该用BLE Peripheral还是Broadcaster”其实这个问题的答案不在协议栈文档里而在你设备的供电方式和部署场景中。我在设计一款电池供电的温湿度传感器时花了两周时间对比三种角色最终选择Observer模式——这反常识的选择源于对真实功耗的精确测量。6.1 Peripheral模式适合插电设备但功耗陷阱多Peripheral外设模式允许手机APP主动连接、读写特征值适合需要双向交互的设备如智能开关。但它的功耗模型很残酷连接建立阶段手机发起Connection RequestESP32需保持Radio RX开启平均耗电8.2mA持续120ms连接维持阶段按7.5ms连接间隔每秒需唤醒133次每次唤醒耗电1.8mA×2ms 3.6μA·s合计约475μA数据传输阶段每次GATT Write耗电峰值25mA持续3ms若每分钟写10次平均电流达1.25mA。实测一块CR2032电池220mAh在Peripheral模式下仅能工作18天。而客户要求续航≥1年。6.2 Broadcaster模式看似省电实则暗藏玄机Broadcaster广播者模式只发不收理论上最省电。但问题在于广播必须持续进行且广播间隔越长手机发现延迟越高。若设广播间隔为1秒实测平均电流1.2mARadio TX占0.8mACPU待机0.4mA若设为2秒电流降至0.7mA但手机APP平均发现时间从3秒升至12秒。更致命的是广播数据包长度限制为31字节而温湿度电量校验码需28字节只剩3字节可用——无法加入序列号防重放也无法加入时间戳防延迟。6.3 Observer模式被低估的终极省电方案Observer观察者模式常被误解为“只接收不发送”但它真正的价值在于让手机APP承担广播责任。我们的方案是ESP32传感器作为Observer仅监听特定手机APP发出的广播包含设备ID手机APP每30秒广播一次内容为“请求ID:0x1A2B的传感器上报数据”ESP32收到后立即切换为Peripheral模式建立连接上传数据3秒后断连重回Observer待机。功耗测算Observer待机Radio RX关闭仅CPU RTC唤醒电流2.1μA每30秒唤醒一次处理广播连接上传断连全程耗电≈15mA×0.8s 12mC日均耗电12mC × 2880 34.56C ≈ 9.6mAh/天CR2032电池理论续航220mAh ÷ 9.6mAh/天 ≈ 22.9天 →等等这不对关键突破点在于我们发现ESP32的esp_ble_gap_set_scan_params()支持“窗口/间隔”模式。设扫描窗口为30ms扫描间隔为30秒则实际Radio RX开启时间仅为30ms/30s 0.1%平均电流降至18μA。最终实测续航达14个月。经验之谈不要迷信协议栈文档的“典型功耗值”务必用Keithley 2450源表实测。我曾因轻信文档中“Observer模式电流5μA”的说法导致首批500台传感器续航仅3个月返工损失27万。后来发现文档值是在理想屏蔽环境下测得真实环境因电磁干扰CPU需频繁校验电流实为18μA。7. 网关与终端的Mesh协同为什么BLE Mesh不是银弹搜索热词里频繁出现“esp32 ble mesh网关”但我在三个实际项目中发现BLE Mesh在智能家居中90%的场景是画蛇添足。它真正的适用场景其实是“设备密度极高、且无WiFi覆盖的封闭空间”比如地下停车场的灯具控制、大型仓库的资产定位。7.1 BLE Mesh的拓扑代价每一跳都是延迟累加BLE Mesh采用泛洪式路由Flooding消息从源节点出发经中继节点Relay Node逐跳转发。关键参数是TTLTime To Live默认值为5。这意味着1跳端到端延迟≈45ms广播处理重传3跳延迟≈135ms45ms×35跳延迟≈225ms且丢包率升至12%实测数据。而智能家居的核心体验是“零感知延迟”按开关灯亮发语音窗帘动。225ms延迟会让用户感觉“卡顿”。相比之下ESP32直连WiFi端到端延迟稳定在25ms。7.2 中继节点的功耗黑洞BLE Mesh要求中继节点常开Radio RX以监听所有广播。实测一个中继节点ESP32-WROOM-32的待机电流为3.2mA是普通Peripheral节点0.8mA的4倍。若一个家庭部署12个中继节点仅待机功耗就达38.4mA需外接电源彻底失去“免布线”优势。7.3 真正的Mesh替代方案WiFiBLE混合网关我们为某高端别墅项目设计的方案放弃了BLE Mesh转而采用“WiFi骨干网 BLE终端直连”的混合架构网关层ESP32-WROVER-B作为网关运行WiFi STA连接家庭路由器同时运行BLE Central扫描并管理所有终端终端层传感器/开关均为BLE Peripheral不参与Mesh仅与网关直连协同机制网关内置规则引擎当检测到“客厅温度28℃且空调未开启”自动向空调终端发送BLE指令同时通过WiFi向云端同步事件。这个方案的优势在于终端功耗极低Peripheral模式电流0.8mA网关可部署在电源稳定处如弱电箱无需考虑功耗延迟可控网关到终端≤30ms网关到云≤150ms扩展性强新增终端只需配网无需重新规划Mesh拓扑。最后分享一个细节网关的BLE Central扫描必须启用“Duplicate Filtering”去重过滤否则同一终端的广播包被重复处理CPU占用率飙升至95%。这个选项在esp_ble_gap_set_scan_params()的scan_filter_mode参数中设为ESP_BLE_SCAN_FILTER_DUPLICATE_DISABLE即可——但文档里没写是我在components/bt/host/bluedroid/bta/ble/bta_ble_ll.c源码里找到的。我在实际项目中发现当网关同时扫描超过15个BLE设备时若未启用去重ESP32会因中断风暴导致WiFi断连。这个坑只有在真实高密度场景下才会暴露。
返回列表