想象你管理着一座智慧社区,手下有位名叫“小ESP”的全能信使。他随身带着两件沟通工具:一件是能驶上城市高速网的“巡航车”——速度快、能接通千里之外的云端服务器,但启动时比较费油;另一件是贴身携带的“迷你对讲机”——几乎不耗电,但只能在社区小范围内呼叫邻居。真正的高手,不是只用一件工具,而是知道什么时候开车、什么时候按对讲机,还能让两件工具默契配合。这就是本篇文章要带你掌握的:小ESP的双重无线秘籍。我们会先看他如何用巡航车接入社区互联网、给云端递挂号信与做直播广播,又如何把巡航车变成临时服务站;接着学他对讲机的使用规范——怎么喊话、怎么建立通话、怎么制定服务菜单;最后,我们将看到他在智能家庭中如何同时操作两件工具,既高效又省电。学完这些,你就能亲手为物联网设备设计可靠的无线通信方案了。

岗位关联

WiFi负责“跑得快”,BLE负责“省得久”。掌握ESP32双协议栈开发,是通往智能家居、可穿戴设备与IoT产品岗位的核心技能,也是嵌入式工程师从“会点灯”进阶到“懂通信”的必修课。

目录
  1. 可视化演示
  2. WiFi连接管理:巡航车如何上高速
  3. TCP/UDP套接字:挂号信与大喇叭
  4. SoftAP热点:巡航车变身移动服务站
  5. BLE协议栈基础:对讲机的喊话规则
  6. GATT服务定制:制定服务菜单
  7. 双无线协同:左手巡航车右手对讲机
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示ESP32双无线协议栈架构:WiFi模式演示TCP/UDP套接字数据从应用层到物理层的逐层封装与SoftAP/STA双模连接;BLE模式演示GATT服务结构与广播-连接-数据交换流程;协同模式展示双无线并行工作策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

WiFi协议栈 TCP/UDP套接字逐层封装 App→LwIP→MAC→PHY 支持STA与SoftAP双模连接

WiFi连接管理:巡航车如何上高速

小ESP的第一课,是学会开巡航车驶入社区的高速网。巡航车要上高速,得先知道匝道入口在哪——WiFi路由器的热点名,也就是“SSID“;还得出示买路钱——连接密码。如果入口找错或密码输错,巡航车就只能停在收费站外干等。同样的道理,ESP32接入路由器时,”账号密码”一个都不能填错。

在ESP32的世界里,巡航车以“工作站”(STA)的身份加入路由器(AP)的网络。开发者先用esp_wifi_set_mode把芯片设为STA模式,再通过esp_wifi_set_config填好SSID和密码,最后调用esp_wifi_start点火启动。这一串配置做完,芯片就会自动寻找并接入指定的路由器,就像巡航车自动导航到高速入口一样。

连接过程是异步的,ESP-IDF用事件机制来汇报状态:WIFI_EVENT_STA_START表示点火成功,WIFI_EVENT_STA_CONNECTED表示已驶入高速路,IP_EVENT_STA_GOT_IP则代表拿到IP地址这张“通行证”。只有拿到IP,巡航车才算真正联网。如果信号不稳定导致掉线,还需要实现自动重连——关键在于重连失败时按指数退避,避免网络恢复瞬间所有设备一拥而上互相挤撞。

有了事件回调这排“仪表盘指示灯”,小ESP再也不用瞎猜巡航车开到哪了;有了指数退避的“错峰起步”策略,即使深夜断网,巡航车也会不慌不忙地一次次尝试,直到重新回到高速路上。

tn=t0×2n\displaystyle t_n = t_0 \times 2^{n}
t₀ 是初始等待时间,n 是连续失败次数,tₙ 是第 n 次重试前要等待的时间。每失败一次等待翻倍,让设备错峰接入。
  1. 初始等待 t₀第一次重连前等待的基础时间,通常设为 2 秒,好比高速故障后第一辆车先停几分钟观察路况。
    t0=2 st_0 = 2\,\mathrm{s}
  2. 退避倍数 2ⁿ每失败一次等待翻倍,n 是连续失败次数,让后续车辆错峰起步。
    2n=2×2×⋯×22^{n} = 2 \times 2 \times \cdots \times 2
  3. 第 n 次等待 tₙ最终等待时间随 n 指数增长,避免网络恢复瞬间所有设备同抢信道。
    tn=t0×2nt_n = t_0 \times 2^{n}

TCP/UDP套接字:挂号信与大喇叭

巡航车上了高速,小ESP还要学会两种送货方式。第一种是“挂号信专线”(TCP):每发出一包货,都要等对方回执“收到了”,顺序不能乱、丢了要重发,保证一封不差。第二种是“大喇叭广播”(UDP):对着窗外吼一嗓子“今晚八点开会”,听到的人自然听到,没听到的也不补发,但胜在嗓门大、反应快。

在代码层面,ESP-IDF移植了lwIP这个轻量级TCP/IP协议栈,为开发者提供标准的套接字(socket)编程接口。TCP要走完“三次握手”才能开始传数据:小ESP先喊“在吗”,对方回“在的”,小ESP再应一句“好嘞”,连接才算建立。UDP则省去这些客套,直接用sendto()把数据包丢向目标的IP和端口,贴完地址就走人。

怎么选?看任务性质。固件升级、设备配置、控制指令这类“一个字节都不能丢”的,用TCP,像寄挂号信一样放心;实时传感器读数、音视频流这类“丢几帧无所谓、但延迟要低”的,用UDP,像大喇叭广播一样干脆。值得注意的是,TCP的可靠性不是免费的午餐,它要用额外的确认和重传换取稳定,而“带宽时延积”决定了发送窗口和缓冲区该设多大才能跑满速度。

小ESP在记事本上写下心得:挂号信贵在稳妥,大喇叭贵在快捷。给云端传固件时选TCP,给大屏推实时温度时选UDP——两样都会,才算合格的社区信使。

BDP=BW×RTT\displaystyle \mathrm{BDP} = \mathrm{BW} \times \mathrm{RTT}
带宽时延积表示数据在链路上最多能同时存在多少,它像高速路上能同时行驶的车辆总数,缓冲区小于它就会堵车。
  1. 带宽 BW链路每秒能传输的比特数,相当于高速路每秒能通过多少辆车。
    BW=54 Mbps\mathrm{BW} = 54\,\mathrm{Mbps}
  2. 往返时延 RTT数据从发出到收到确认的总时间,相当于货车从出发到收到回执的时间。
    RTT=tack−tsend\mathrm{RTT} = t_{ack} - t_{send}
  3. 带宽时延积 BDP两者相乘得到链路容量,发送窗口和缓冲区要足够大才能跑满带宽。
    BDP=BW×RTT\mathrm{BDP} = \mathrm{BW} \times \mathrm{RTT}

SoftAP热点:巡航车变身移动服务站

有些任务不需要上高速。比如现场调试时,工程师要临时看看小ESP的状态;又比如家里断网了,手机想直接连上设备控制它。这时小ESP亮出了巡航车的新技能——把自己变成一个“移动服务站”(SoftAP):其他车辆不用再去高速,开到服务站门口就能办事。

实现很简单:esp_wifi_set_mode(WIFI_MODE_AP)把芯片从“普通车辆”切换成“收费站”,再通过esp_wifi_set_config配置热点名、信道、密码和最大接入数,esp_netif_create_default_wifi_ap()则为服务站竖起灯塔。配置完成后,手机或电脑就能像连普通路由器一样搜索到小ESP,进入他的局域网办理业务。

不过,开放的服务站也会有安全风险。实践中最重要的是开启WPA2/WPA3认证——相当于给服务站的每扇门都装上密码锁;其次可以设置最大连接数,防止陌生设备挤占接入名额;还可以利用MAC地址过滤,只让名单上的设备进场。另外,2.4GHz频段的信道选择也有讲究,选在邻居WiFi扎堆的拥堵信道上,彼此干扰会让收发速率大幅下降。

移动服务站让小ESP不再依赖外部网络:现场调试连他就行,局域网控制找他就行。当然门禁要看好——密码锁(WPA2)和准入名单(MAC过滤)双管齐下,服务站才安全又高效。

fn=2407+5n(n=1,2,⋯ ,13)\displaystyle f_n = 2407 + 5n \quad (n=1,2,\cdots,13)
这是2.4GHz频段第 n 个信道的中心频率公式。信道1对应2412MHz,信道13对应2472MHz,相邻信道相隔5MHz。
  1. 基准频率 24072.4GHz频段的起始基准频率,单位MHz,对应0号信道的理论位置。
    2407 MHz2407\,\mathrm{MHz}
  2. 信道偏移 5n每个相邻信道间隔5MHz,n 是信道编号。
    5n(n=1,2,⋯ ,13)5n \quad (n=1,2,\cdots,13)
  3. 信道频率 fₙ第 n 个信道的中心频率,配置SoftAP时用来避免拥堵。
    f1=2407+5×1=2412 MHzf_1 = 2407 + 5 \times 1 = 2412\,\mathrm{MHz}

BLE协议栈基础:对讲机的喊话规则

入夜后,社区里的智能手环要上报一天步数,智能门锁要汇报开关记录。这点小消息如果也开巡航车去送,就像开飞机去买菜——大材小用还费油。这时小ESP掏出了贴身携带的迷你对讲机(BLE),准备用最省电的方式完成短距离通信。

BLE协议栈分成两大层。GAP(通用访问规范)负责“怎么认识对方”:广播者(通常是设备端)周期性地喊话“我在这,我能提供这些服务”,观察者(通常是手机)竖起耳朵扫描,听到感兴趣的广播就申请建立连接。GATT(通用属性规范)则负责“认识后聊什么”:规定数据以服务、特征值的结构化方式组织和交换,就像对讲机里有一本统一格式的联络手册。

BLE的设计哲学就是低功耗。一次广播只发很短的报文,接收窗口只有几毫秒,其余时间射频模块深度睡眠。广播间隔越大,喊话越稀疏,功耗越低,但被发现的速度也越慢。在ESP32上,BLE协议栈可选用Bluedroid或NimBLE两种实现,其中NimBLE更轻量、内存占用小,适合资源受限的可穿戴设备。

小ESP恍然大悟:对讲机的精髓不在嗓门大,而在“该喊才喊、喊完就睡”。用短暂的广播窗口加上足够长的沉默间隔,BLE用几毫安的电流换来了以年计的续航——这才是低功耗的真相。

Iavg=Ipeak×TonTinterval=Ipeak×D\displaystyle I_{avg} = I_{peak} \times \frac{T_{on}}{T_{interval}} = I_{peak} \times D
平均电流等于峰值电流乘以占空比。广播瞬间电流虽大,但每次只有短短几毫秒,占空比极小,所以平均功耗非常低。
  1. 峰值电流 I_peak广播或收包瞬间的瞬时电流,好比对讲机按下通话键那一瞬的耗电。
    Ipeak≈15 mAI_{peak} \approx 15\,\mathrm{mA}
  2. 占空比 D一次喊话时长与喊话间隔的比值,喊得越疏占空比越小。
    D=TonTintervalD = \frac{T_{on}}{T_{interval}}
  3. 平均电流 I_avg峰值电流乘以占空比,是估算续航时间的唯一基准。
    Iavg=Ipeak×DI_{avg} = I_{peak} \times D

GATT服务定制:制定服务菜单

对讲机连上了,可手环传来的一串十六进制数字“0x48 0x65“是什么意思?小ESP翻开GATT这本”服务菜单“就懂了。就像餐厅菜单把菜分成”凉菜”“热菜”“饮品”几个大类,每个大类下又有具体菜品,GATT把数据组织成“服务”(Service)与“特征值”(Characteristic)的层级结构。

一个Service相当于一个功能部门,比如“健康监测部”;部门底下的Characteristic才是具体数据项,比如“心率值”“步数”“测量部位”。每个特征值还有自己的属性:读(Read)表示别人可以来问,写(Write)表示允许别人来改,通知(Notify)表示数据变化时主动推送。UUID则是每道菜的编号——标准服务用官方短编号,自定义服务用128位UUID,相当于小ESP给私房菜编的独家菜谱号。

在ESP32上用NimBLE开发时,核心是注册GATT回调函数。手机发起读请求,芯片触发ESP_GATTS_READ_EVT事件,把当前值装进ATT响应返回;手机写数据,芯片在ESP_GATTS_WRITE_EVT里解析并处理。通知机制更妙:手环心率一变,主动把新值推送给已订阅的手机,不用手机反复来问。要传大块数据,还得把MTU从默认的23字节协商到更大值。

有了菜单(Service)、菜品(Characteristic)、编号(UUID)和上菜方式(读/写/通知),小ESP的对讲机从“能通话”升级成了“能办业务”。再复杂的数据,在GATT的目录里都井井有条。

Payload=MTU−3\displaystyle \mathrm{Payload} = \mathrm{MTU} - 3
ATT协议中,用户数据长度等于MTU减去3字节头部。默认MTU=23时只能携带20字节数据,协商到MTU=247时则能携带244字节。
  1. MTU 最大传输单元单个ATT数据包的最大总长度,默认23字节,可协商增大到247字节。
    MTU=23∼247\mathrm{MTU} = 23 \sim 247
  2. 协议头 3 字节由1字节操作码加2字节属性句柄组成,好比快递面单占的体积。
    HATT=1+2=3H_{ATT} = 1 + 2 = 3
  3. 有效载荷 Payload真正能承载业务数据的字节数,设计单包数据时要留出头部余量。
    Payload=MTU−3\mathrm{Payload} = \mathrm{MTU} - 3

双无线协同:左手巡航车右手对讲机

真正的信使高手,从不只依赖一件工具。小ESP的最后一课,是让巡航车与对讲机同时在线、各司其职:清晨,巡航车把前一晚录制的监控视频上传到云端AI平台做分析;深夜,对讲机保持低功耗值守,时刻准备响应门锁、手环发来的唤醒请求。

在ESP32内部,WiFi与BLE共用同一根天线,硬件共存机制(Coexistence)像一个交通协管员,仲裁射频资源,避免两个无线模块的空中信号互相打架;软件上,ESP-IDF基于FreeRTOS让WiFi任务、BLE任务和业务任务并行运转,开发者需要合理分配任务优先级与内存,防止高优先级无线任务把业务逻辑饿死。

智能家居最经典的协同套路是“BLE配网 + WiFi通信”:设备初始状态没有任何网络凭证,手机通过BLE广播发现设备,把WiFi的SSID和密码递过去;设备拿到凭证后关闭BLE,改用WiFi接入路由器并连上云端。之后大流量走WiFi,轻交互留给BLE,两者各取所长。

出师那天,小ESP站在社区门口:一辆巡航车随时待命上高速,一部对讲机低声细语守小区。哪件工具干什么活,他早已心中有数。这就是ESP32双无线协同的精髓——让对的工具干对的活,把高效与省电同时握在手里。

Tbattery=CbatteryIavg\displaystyle T_{battery} = \frac{C_{battery}}{I_{avg}}
电池续航时间等于电池容量除以平均电流。降低平均电流,续航就按比例延长,这是所有低功耗设计的终点。
  1. 电池容量 C_battery电池能储存的电量,单位mAh,好比油箱容积。
    Cbattery=500 mAhC_{battery} = 500\,\mathrm{mAh}
  2. 平均电流 I_avgWiFi与BLE按工作时间加权后的平均电流,单位mA。
    Iavg=Iwifi×Dw+Ible×DbI_{avg} = I_{wifi} \times D_w + I_{ble} \times D_b
  3. 续航时间 T_battery两者相除得到理论续航小时数,双模协同的目标就是压低这个分母。
    Tbattery=CbatteryIavgT_{battery} = \frac{C_{battery}}{I_{avg}}

AI 应用场景

智能家居设备一键配网

阶段:端侧数据接入与设备上云阶段

解决的问题:传统智能设备配网需要用户在手机App里手动输入WiFi密码,步骤繁琐且容易输错。利用BLE广播与GATT服务,手机靠近设备即可安全发现并下发网络凭证,设备再切换到WiFi接入云端,配网成功率大幅提升。这正对应正文中“BLE发现配对、WiFi连接通信”的双无线协同策略。

具体案例:某智能插座出厂时处于无网络状态,手机App扫描到插座的BLE广播后建立GATT连接,向“WiFi配置服务”中的特征值写入SSID和密码,插座校验后重启并切换STA模式连上路由器,随后上报云端成功上线。整个配网过程从3分钟缩短到20秒,用户无需手动输入任何密码。

可穿戴健康监测手环

阶段:端侧数据采集与低功耗上行阶段

解决的问题:手环电池仅几百毫安时,若用WiFi持续上报心率数据,一两天就会耗尽。BLE的低功耗广播与Notify通知机制让手环在采集间隙深度睡眠,仅在数据变化时推送,使续航延长到数周。正文中的占空比公式正是这种功耗设计的理论基石。

具体案例:某健康监测手环每30秒采样一次心率,通过BLE的Notify特征值实时推送到手机,手机App再经WiFi或4G转发给云端AI心电分析平台。当检测到异常心律时,平台及时向家属发送告警,手环单次充电可连续工作约120小时。

智慧工厂设备数据采集

阶段:工业数据汇聚与预测性维护阶段

解决的问题:工厂车间设备密集,WiFi连接数多、同频干扰大;纯BLE又难以支撑大带宽的数据上行。采用WiFi与BLE双无线协同:低温低压的状态参数用BLE低功耗采集,产线升级包和振动波形等大流量数据用WiFi传输,兼顾覆盖、带宽与功耗。

具体案例:某电子厂在注塑机上加装ESP32采集模块,BLE定时读取温度与振动传感器数值,异常时立即唤醒WiFi上传完整波形数据到边缘服务器。云端AI模型据此预测模具剩余寿命,非计划停机减少30%,维护成本显著下降。

Python 演示

python60 行
# -*- coding: utf-8 -*-"""模拟ESP32双无线节点: WiFi指数退避重连 + BLE广播功耗估算"""import random  class DualRadioNode:    """社区信使小ESP的模拟器: 同时携带巡航车(WiFi)与对讲机(BLE)"""     def __init__(self):        self.wifi_connected = False        self.retry_count = 0        self.base_delay = 2.0          # 初始重连延迟(秒)        self.ble_peak_ma = 15.0        # BLE广播峰值电流(mA)        self.ble_on_ms = 2.0           # 每次广播时长(毫秒)        self.ble_interval_ms = 100.0   # 广播间隔(毫秒)     def wifi_connect(self):        """模拟WiFi接入, 失败时按指数退避递增等待"""        while not self.wifi_connected:            if random.random() < 0.4:                self.wifi_connected = True                print("WiFi接入成功, 重试次数=%d" % self.retry_count)            else:                delay = self.base_delay * (2 ** self.retry_count)                self.retry_count += 1                print("WiFi接入失败, %.1f秒后重试" % delay)     def ble_duty_cycle(self):        """由广播时长与间隔计算占空比"""        return self.ble_on_ms / self.ble_interval_ms     def ble_avg_current(self):        """平均电流 = 峰值电流 x 占空比"""        return self.ble_peak_ma * self.ble_duty_cycle()     def send_udp(self, payload):        """UDP: 无连接, 直接广播"""        print("UDP大喇叭: %s... 长度=%d" % (payload[:8], len(payload)))     def send_tcp(self, payload):        """TCP: 模拟三次握手后可靠发送"""        print("TCP三次握手: SYN -> SYN/ACK -> ACK")        print("TCP挂号信: %s... 长度=%d" % (payload[:8], len(payload)))     def run(self):        """整体运行: 先WiFi接入, 再估算BLE功耗, 最后两种方式发数据"""        print("=== 小ESP双无线节点启动 ===")        self.wifi_connect()        avg = self.ble_avg_current()        print("BLE占空比=%.2f%%, 平均电流=%.2fmA" % (            self.ble_duty_cycle() * 100, avg))        self.send_udp("传感器温度24.5")        self.send_tcp("固件升级包v2.1")        battery_mah = 500.0        print("仅BLE广播时预计续航: %.1f小时" % (battery_mah / avg))  if __name__ == "__main__":    random.seed(42)    DualRadioNode().run()
目的:用Python模拟正文中的ESP32双无线节点行为——WiFi接入失败时按指数退避重试、BLE广播占空比与平均功耗估算、TCP与UDP两种发送方式对比。
  1. delay = self.base_delay * (2 ** self.retry_count)指数退避公式,失败次数越多等待越久
  2. return self.ble_on_ms / self.ble_interval_ms占空比:广播时长除以广播间隔
  3. return self.ble_peak_ma * self.ble_duty_cycle()平均电流等于峰值电流乘以占空比
  4. print("TCP三次握手: SYN -> SYN/ACK -> ACK")模拟TCP建立连接前的确认过程
  5. random.seed(42)固定随机种子,让每次运行结果可复现
  6. if __name__ == "__main__":只有直接运行时才执行主流程

常见误区

误区TCP有确认和重传,数据可靠不丢失,所以所有通信都应该用TCP,用UDP就是不专业。

正解TCP的可靠性是用握手、确认、重传的额外开销换来的。实时音视频、高频传感器数据用UDP更合适,丢一两帧不影响整体体验。就像小ESP送挂号信虽然稳妥但慢,大喇叭广播虽然可能漏但快——选哪种要看任务对“可靠性”和“实时性”哪个更敏感。

为何常见:初学网络时教材反复强调TCP可靠,容易让人忽略UDP在实时场景中的不可替代价值。

误区ESP32开启了SoftAP热点,连上这个热点的手机就能访问互联网了。

正解SoftAP只是让设备接入ESP32组建的局域网,ESP32本身并没有连接互联网。要让手机上网,ESP32必须同时以STA模式连接外部路由器,并开启NAT转发,也就是“STA+AP共存模式”。移动服务站本身物资有限,你得给它接上补给线才能对外供货。

为何常见:把手机热点(手机同时具备蜂窝网络和WiFi)的经验直接套到ESP32上,忽略了芯片需要同时担任两个角色。

误区BLE连上后和串口一样,可以持续不断地传数据,不需要关心广播间隔和连接间隔。

正解BLE低功耗的精髓是尽量缩短每次射频窗口、延长收发间隔。持续大流量传输会让射频长时间工作,平均电流飙升,续航从数月跌到几天。正确做法是合理设计广播间隔、连接间隔和MTU,让收发窗口短而高效——占空比D越小,平均电流越低,续航越长。

为何常见:传统单片机串口通信养成的“持续收发”思维,与BLE“短促唤醒”的设计哲学相冲突。

误区为了功能丰富,把每一个数据项都定义成独立的Service,显得很专业。

正解一个Service应代表一个完整功能模块,内部用多个Characteristic表达不同属性。乱建Service会让UUID管理混乱、扫描耗时变长、内存占用升高。就像餐厅菜单如果每个菜都单独立一个大类,顾客点菜反而更费劲——按功能模块归类才是GATT设计的初衷。

为何常见:不理解GATT“服务包含特征值”的层级设计意图,把扁平化思维带入了分层协议。

面试题

Q1. ESP32以STA模式接入路由器时,必须正确配置哪两项参数?

单选题 · easy

  • A.SSID与接入密码← 正确答案
  • B.GATT服务与UUID
  • C.广播间隔与信道
  • D.MTU与ATT载荷

答案:A。STA接入路由器必须知道热点名(SSID)和口令,就像开车上高速要知道入口和缴费密码。GATT/UUID、MTU/ATT是BLE相关参数;广播间隔与信道虽然可配置,但不是入网认证的必需参数。

Q2. TCP连接建立前,通信双方需要完成的是?

单选题 · easy

  • A.两次握手
  • B.三次握手← 正确答案
  • C.四次挥手
  • D.广播扫描

答案:B。TCP用三次握手(SYN→SYN/ACK→ACK)建立可靠连接,像小ESP先喊话、对方应声、再确认。四次挥手是断开连接的操作,两次握手无法保证双方收发能力都正常,广播扫描则是BLE的流程。

Q3. 关于UDP协议,下列说法正确的是?

单选题 · mid

  • A.传输前必须建立连接
  • B.数据丢失后自动重传
  • C.无连接且不保证到达← 正确答案
  • D.数据到达顺序保证

答案:C。UDP是无连接协议,像大喇叭广播一样喊出去就不管了,不保证到达也不重传,顺序也无法保证。正因少了确认流程,UDP通常比TCP更快,适合实时音视频和高频传感器数据场景。

Q4. 下列哪些属于ESP32 SoftAP模式的特点?

多选题 · mid

  • A.芯片自身作为热点← 正确答案
  • B.其他设备以STA接入← 正确答案
  • C.必须依赖外部路由器
  • D.可配置WPA2密码锁← 正确答案

答案:ABD。SoftAP让ESP32自己当热点(A),手机电脑以STA身份接入(B),并且可以配置WPA2/WPA3认证(D)。C错误:SoftAP本身就是迷你AP,不需要外部路由器;只有做STA+AP共存转发时,才需要额外连接外部路由。

Q5. BLE广播间隔从100ms增大到400ms,占空比将如何变化?

单选题 · mid

  • A.变为原来的四倍
  • B.变为原来的四分之一← 正确答案
  • C.保持原来的数值
  • D.变为原来的两倍

答案:B。占空比D等于广播时长除以广播间隔。间隔增大到4倍,分母变大4倍,占空比变为原来的1/4。喊话时长不变但喊得更疏,耗电占比自然下降——这正是BLE省电的秘诀。

Q6. 在BLE GATT层级结构中,Service与Characteristic的关系是?

单选题 · mid

  • A.多个服务包含一个特征
  • B.一个服务包含多个特征← 正确答案
  • C.服务与特征互相独立
  • D.一个特征包含多个服务

答案:B。GATT的层级是Service下挂Characteristic,一个服务通常包含多个特征值。Service像餐厅的“热菜”类目,Characteristic是具体菜品“宫保鸡丁”。反向包含或互相独立都不符合GATT规范。

Q7. 下列哪些做法能有效降低BLE平均功耗?

多选题 · hard

  • A.增大广播间隔← 正确答案
  • B.持续大流量传输
  • C.缩短射频收发窗口← 正确答案
  • D.提高广播发射功率

答案:AC。增大广播间隔(A)和缩短射频窗口(C)都直接降低占空比,从而降低平均电流。B持续大流量会使射频长时间工作,打破低功耗优势;D提高发射功率反而增加瞬时功耗,不是低功耗策略。

Q8. BLE连接协商MTU=247后,单个ATT数据包最多携带多少用户数据字节?

单选题 · hard

  • A.最多20字节
  • B.最多244字节← 正确答案
  • C.最多247字节
  • D.最多240字节

答案:B。MTU是整个ATT包的长度,其中3字节是协议头(1字节操作码+2字节句柄),所以用户数据最多为247-3=244字节。默认MTU=23时用户数据是20字节,容易误以为247就是数据上限,实际要减去头部。

Q9. 在WiFi+BLE双无线协同方案中,下列哪些是合理的分工?

多选题 · hard

  • A.BLE负责设备发现与配网← 正确答案
  • B.WiFi负责大数据云端传输← 正确答案
  • C.BLE负责高功耗视频流
  • D.WiFi负责低频微小数据

答案:AB。BLE功耗低,适合做设备发现和近场配网(A);WiFi带宽大,适合云端上传和固件升级(B)。C让高功耗视频流走BLE违背其低功耗定位,D把低频小数据交给WiFi是“大炮打蚊子”,两者都不合理。

Q10. ESP32事件IP_EVENT_STA_GOT_IP触发,说明设备进入了什么状态?

单选题 · easy

  • A.已连接路由器并拿到IP← 正确答案
  • B.已开启热点等待接入
  • C.已完成蓝牙配对流程
  • D.已发送UDP广播数据

答案:A。GOT_IP事件是WiFi联网成功的标志——巡航车不仅上了高速,还拿到了通行证。开启热点是SoftAP事务,蓝牙配对是BLE流程,UDP广播是应用层行为,都与“拿到IP”没有直接关系。