1、广播丢包现象初探:什么是WiFi配网广播?为什么广播会丢包?

各位好,我是老周。做嵌入式WiFi开发十几年了,配网这个环节,我踩过的坑比走过的路还多。今天咱们就从最基础的开始聊——广播丢包。

你想想看,一个新买的智能灯泡,没有屏幕,没有键盘,你怎么告诉它你家路由器的密码?这就是配网要解决的问题。而广播,是其中最常用、也最让人头疼的手段之一。

1.1 什么是WiFi配网广播?

说白了,就是手机把WiFi名字和密码,塞进一个广播报文里,在局域网上大喊一声。设备端(比如那个灯泡)在监听模式下,抓到这包,解析出来,然后自己去连路由器。

我习惯把这种模式叫做“ shouting in the dark ”。手机不知道设备在哪,设备也不知道手机是谁。双方唯一的默契就是:都在听同一个广播信道。

常见的配网广播协议有几种:

协议名称 典型厂商 广播方式 我遇到过的坑
ESP-Touch 乐鑫 UDP 广播 + 长度编码 小米路由器经常丢包
SmartConfig TI 802.11 广播帧 信道切换慢导致超时
AirKiss 腾讯 UDP 广播 + 自定义头 Android 8.0 后权限收紧
零配 阿里 组播 + 广播混合 组播IGMP snooping干扰

这些协议的核心逻辑都一样:手机发广播包,设备抓广播包。但问题就出在这个“抓”字上。

1.2 为什么广播会丢包?

这个问题,我当年被折磨了整整两周。后来抓了上千个包才搞明白。原因其实不复杂,但很隐蔽。

核心结论:广播丢包,不是网络坏了,而是设备“没听见”。

具体来说,有三大元凶:

1.2.1 信道不匹配

这是最常见的原因。手机在WiFi信道6上发广播,设备却在信道1上监听。你想想看,这就像两个人一个在FM 103.7,一个在FM 101.1,怎么可能听到?

设备刚上电时,通常会在所有信道上扫一遍。但扫信道需要时间,每个信道停留几十到几百毫秒。如果手机刚好在设备离开信道6的那几毫秒发了包,这包就丢了。

我曾经遇到过一款路由器,它的Beacon间隔是100ms,但设备扫描间隔是120ms。结果就是,设备永远错过手机发的广播包。折腾了三天,最后发现是时序错位。

1.2.2 802.11 的广播机制本身不可靠

这个要重点说一下。WiFi的广播帧,没有ACK确认机制。

你发一个单播包,对方收到了会回一个ACK。没收到ACK,发送方会重传。但广播包不一样——发出去就完了,没人告诉你它到没到。

我画了一张图,你看一眼就明白了:

广播 vs 单播:确认机制对比 发送方(手机) 接收方(设备) ① 发送单播帧 ② 回复 ACK ✓ 有确认,可重传 发送方(手机) 接收方(设备) ① 发送广播帧 ② 无 ACK(静默) ✗ 无确认,发完即忘 广播丢包的本质:发送方无法感知丢包,接收方无法请求重传 解决方案:通过冗余发送(连续发多包)来对抗丢包 典型做法:手机在 2~3 秒内重复发送 20~50 次广播包

你看,单播有ACK兜底,广播就是“裸奔”。所以配网时手机要疯狂发几十遍同一个包,就是赌设备能在某一次抓到。

1.2.3 环境干扰与竞争

这个就更好理解了。2.4GHz频段,微波炉、蓝牙、隔壁老王的WiFi,全挤在一起。广播包又没有优先级,说被挤掉就被挤掉了。

我记得有一次在客户现场调试,配网成功率只有30%。后来发现,客户工厂里有一台老式微波炉,一开机就在信道6上产生巨大的噪声。广播包全被淹没了。

我的经验:遇到配网失败,先别急着改代码。拿个WiFi嗅探器(比如Wireshark + 抓包网卡)看看环境底噪。如果某个信道的噪声底数超过 -80dBm,赶紧换信道。

1.3 广播丢包的典型表现

你在实际开发中,如果遇到以下现象,基本就是广播丢包在作祟:

  • 配网成功率忽高忽低:今天90%,明天30%,玄学问题。
  • 特定路由器必失败:比如在TP-Link上好好的,换小米就跪了。
  • 手机靠近设备才成功:距离远了就丢包,因为信号弱了。
  • 配网时间不稳定:有时3秒,有时30秒,看运气。

注意:千万不要把广播丢包和“设备没收到”划等号。有时候设备收到了,但解析错了,或者缓冲区满了,也会表现为“丢包”。我见过一个案例,设备WiFi芯片的接收缓冲区只有4个包,手机发了10个广播,结果6个被硬件丢弃了。这不是网络丢包,是硬件瓶颈。

1.4 小结

广播丢包,说白了就是WiFi协议在设计时就没打算保证广播的可靠性。它是个“尽力而为”的服务。配网场景下,我们只能通过冗余发送、信道适配、环境优化来对抗这个天然缺陷。

嗯,这一章先聊到这儿。记住一句话:广播丢包不是bug,是feature。理解了这一点,后面咱们再聊怎么跟这个feature共存。