Wi-Fi快速配网介绍

一类让不具备人机交互功能的Wi-Fi设备实现配网的技术方案,也称为一键配网、智能配网、无感配网、零配配网、Wi-Fi快连等。

快速配网的目的是让待配网设备获得无线路由器的SSID、密码、加密方式这三项内容,除此外,不同厂商还会根据需要传递一些比如注册token、设备ID、设备类型之类的数据,以便于设备连网成功后向云端发起注册,或是便于在局域网内发现当前设备。

目前市面上存在着众多的快速配网方案,这些方案实现原理大体一致,都是让待配网的Wi-Fi设备处在监听模式(也称为混杂模式),通过监听无线信道中特定的网络包,来实现获取配网信息的目的,含有配网信息的网络包一般由已连接路由器的APP发出,或是由路由器本身发出,或是局域网内其他已配网的同类设备发出。

由于无线路由器的工作信道是固定的,而待配网的设备并不知道路由器的工作信道,所以设备一般需要逐个扫描所有的信道,通过检测当前信道是否存在的一些事先约定的具有明显特征的网络包,来锁定真正用于配网的信道。配网信息发送方除了要发送配网包,还要发送一些具有明显特征的包,以便于设备锁定信道。锁信道策略的好坏,将直接影响快速配网的速度

除了信道锁定,快速配网还要具有纠错和抗丢包能力,因为无线信道是共用的,设备有可能收到其他设备发出的具有配网包特征、但并非配网包的数据包,这就要求算法具有纠错能力,不能返回错误的配网信息。同时,无线信道也是复杂的,设备在接收配网包时有可能丢包,这就要求算法要有抗丢包能力,考虑一轮接收不到全部配网包的情况下,要能够通过多轮接收来获得全部配网包。

信道扫描+锁信道方式的快速配网一般用于2.4G Wi-Fi,5G频段由于信道数量多且信道绑定复杂,信道扫描并不合适,这时可以使用二维码配网,或使用管理帧配网,比如向路由器发起Probe请求时携带一些定制字段,路由器收到带有定制字段的Probe请求时在Probe响应中嵌入配网信息字段,但这种方式缺点也显而易见,那就是路由器端的程序也要定制,普通的路由器不支持。


以下是一些Wi-Fi快速配网的方案示例:

方案名称厂家配网技术备注
HiLink华为

FastConfig雄迈广播+组播配网只支持2.4G频段,需要扫描信道,方案通用,任何路由器都可以实施。
BeaconConfig雄迈beacon包配网

路由器将配网信息写在beacon包中,设备扫描beacon包获取配网信息。

缺点:私有协议,路由器和设备端程序都要定制。

Pegasus配网涂鸦管理帧配网

采用802.11协议中Beacon/Probe Request/Probe Response帧实现待配网设备无感配网,支持2.4G/5G频段,无需扫描信道,缺点是路由器需要定制,比如路由器要能够在Probe Response中嵌入配网信息。

缺点:私有协议,路由器和设备端程序都要定制,且设备端对Wi-Fi协议栈的操作性要求较高。

参考:无感配网路由SDK参考-TuyaOS-涂鸦开发者

AirKiss配网腾讯广播+组播配网参考:物联网开发平台 AirKiss配网开发-设备端开发指南-文档中心-腾讯云
零配配网阿里云通过局域网内已配网的设备对未配网的设备进行配网参考:Wi-Fi设备配网方案介绍-零配配网
ESP-TOUCH乐鑫广播+组播配网参考:ESP-TOUCH编码规则及解码
SmartConfigTM德州仪器广播+组播配网


除了上述方案,还有以下方案也可以实现设备配网:

配网方案说明
二维码配网摄像头类产品使用,扫描含有配网信息的二维码实现配网。
AP配网待配网设备先切换到AP模式,手机连接设备AP热点后输入路由器SSID和密码,设备收到后再切换回STA模式并连接指定路由器。
声波配网参考链接:给摄像机远程配网,原理是手机将配网信息编码到音频声波中,待配网设备通过识别音频信号来获取配网信息。
蓝牙辅助配网通过蓝牙发送配网信息,受限于设备wifi模块能力,需同时支持蓝牙功能。
WPS配网这是WPA标准支持的配网方式,有按键和pin码两种模式,按键模式下,设备进WPS配网状态后,路由器上按下WPS按键即可完成配网,pin码模式下,设备进WPS配网状态后,输入路由器上指定的pin码可以完成配网。
路由器私有协议配网以小米快连为例,路由器内置私有的配网协议,可实现小米生态链设备零配置配网,并且路由器修改密码后设备可自动同步密码。这为方案的本质其实也是管理帧配网或广播+组播配网。
NFC触碰配网路由器内置NFC芯片并写入配网信息,设备扫描NFC后获取配网信息。

随着IOT Wi-Fi方案迭代更新,新款的Wi-Fi模块都已经支持蓝牙功能了,比如SV32WB01L,Hi3853V100,AiW6262L等,使用蓝牙配网无论是速度还是体验都好于快速配网,是首先应该考虑的配网方式,而且蓝牙配网可以跨2.4G和5Gwifi进行配网,也就是即使手机连接的是5G频段的热点,也可以通过蓝牙把SSID和密码发给设备,这样设备就可以连接同名的2.4G热点,由于大部分双频路由器都将2.4G和5Gwifi设置成同名的,所以这并不是问题,反而可以大幅提升体验。


参考链接:

广播+组播快速配网原理

配网原理

已连接无线路由器的APP重复向局域网发送广播和组播配网信息包,待配网设备切到监听模式并逐个扫描所有Wi-Fi信道,通过配网特征包定位到路由器所在的Wi-Fi信道,再接收配网包,待所有的配网包都收齐后,解析其中的SSID、密码、加密方式并连网。

由于使用广播+组播的方式,所以在编程实现上只能使用UDP,而不能使用TCP,也就是将配网信息编码到广播或组播的UDP报文中,再发送出去。

为什么不使用单播?

这点保留疑问,理论上单播应该也是可行的,因为Wi-Fi通信是大喇叭模式,单播的Wi-Fi报文从天线上发出来后,附近所有设备都可以收到。

可以解释的地方是,Wi-Fi单播需要明确指定对端的MAC地址,这个MAC地址对于待配网设备来说是未知的,不能用于锁定配网包,另一方面局域网内可能并不存在其他设备,无法发起有效的单播,而随便向一个不存在的地址发起单播,则数据有可能被路由器丢弃,导致配网成功率降低。

广播和组播则没有上面的问题,广播是APP发出后,无线路由器会向局域网内的所有设备都转发报文,组播是无线路由器会向局域网内特定的某些设备转发报文,不管局域网内有没有其他设备,无线路由器都会转发报文,这就可以大大提高配网成功率。

配网信息怎么在配网包中表示?

最直接的想法是将配网所需的SSID、密码、加密方式写入到Wi-Fi帧的数据部分,设备收到数据帧后,再从帧数据中取出SSID、密码和加密方式,然而这种方式是行不通的,除非是开放网络,否则所有Wi-Fi报文的数据都是加密过的,不可能从中解析出配网信息。这点和以太网通信不一样,在以太网中,用wireshark抓包得到的报文,其数据部分是未加密的明文。

既然不能通过Wi-Fi帧数据来传递配网信息,那就只能通过其他的内容来传递了。参考前面的Wi-Fi帧结构,除去帧数据,一个Wi-Fi报文中可变的部分就只有几个地址字段了,所以我们可以将配网信息嵌入到地址字段中。除此外,整个Wi-Fi报文的长度也是可变的,也可以用来传递信息,即将配网信息嵌入到报文的长度中。

理论上,使用快速配网这种配网方式,并不需要传递加密方式,只传递SSID和密码即可,设备收到SSID和密码后,可在局域网扫描该热点,通过扫描结果来获取加密方式。如果扫描不到,说明这个热点是隐藏的,那就可以从常用的加密方式开始逐个尝试所有的加密方式,直至连上。

加密方式与报文长度的关系

加密方式1字节UDP报文对应的Wi-Fi报文长度(含校验,这里的长度有两个,前一个长度是STA→AP的报文长度,后一个是AP转发的报文长度)备注
无加密67字节→65字节3861的混杂模式报文回调函数返回的长度是61,猜测是没把最后的4字节FCS校验算上,另外,用抓包网卡可以完整地抓到设备发给路由器和包和路由器转发的包,但在3861上只能抓到路由器转发的包。发送1字节的UDP报文,设备发给路由器的包长度是67字节(含校验),路由器转发的包长度是65字节,这两者的区别是设备发给路由器的包会多两字节的QoS字段。
WPA_PSK+TKIP87字节→85字节3861混杂模式报文回调函数返回了81和83两种长度,说明STA->AP和AP->STA的包都抓到了。
WPA_PSK+AES83字节→81字节3861上两种包都可以抓到。
WPA2_PSK+AES83字节→81字节3861上只能抓到AP转发的报文,WPA2_PSK只支持AES加密。
WEP+开放认证
无法测试
WEP+共享密钥认证
无法测试
WPA3_PSK+AES
无法测试

广播配网原理

通过广播包的长度来携带配网信息。注意一点,Wi-Fi报文的最大长度是2346字节,其长度表示对应的最大二进制是2的11次方,也就是一个广播配网包,通过其长度可传递11个bit位的信息。

组播配网原理

通过组播包的地址来携带配网信息。这里需要了解UDP组播编程的知识,以及组播IP地址和MAC地址的转换关系。在整个IP地址段,范围从224.0.0.0到239.255.255.255的地址段是专门用于组播的地址,发送方往这些组播IP地址发送数据就可以实现组播,接收方只需要提前加入对应IP的多播组就可以收到消息。

UDP的多播IP地址范围是D类地址,即224.0.0.0至239.255.255.255之间的IP地址。D类地址又被划分为局部连接多播地址、预留多播地址和管理权限多播地址三类。具体如下:

局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

在网络层,TCP/IP协议会将组播IP地址映射成组播MAC地址,这个MAC地址就是Wi-Fi报文首度的MAC地址。UDP组播IP地址和MAC地址的映射方式如下图所示,组播MAC地址的范围是01-00-5E-00-00-00到01-00-5E-7F-FF-FF:


使用组播地址的方式每次可传递3个字节的有效信息,且和报文长度无关,实际使用中只需要发送1字节的数据即可。

广播+组播快速配网实现

广播配网

配网信息按以下顺序保存:

总长度flagSSID长度密码长度SSID内容密码内容m_ipaddrCRC_LCRC_H
11111n1n211

将配网信息按以上方式组织后,再将其视作比特流,每次取3bit,然后将这3bit的数据和对应的下标位置组合到一起,得到的数字就是配网包的长度,将这个长度发出去,接收方再以同样的方式解码就可以了:

	// 往下是将有效数据和索引嵌入到广播包的长度中
    bs_t *b = bs_new(realdata, total_len);

    // 每轮广播的前3个包的长度固定是1300,用于同步
    j = 0;
    pktlen[j++] = SYNC_FRAME_LEN;
    pktlen[j++] = SYNC_FRAME_LEN;
    pktlen[j++] = SYNC_FRAME_LEN;

    // 每次读取3bit有效数据,将其嵌入到配网包的长度中
    // 每个包的长度用2个字节表示,其中的最低3bit是有效数据,中间的8bit是索引,最高的5bit未使用
    // 包长一共用到11bit,也就是一个包最长也就是2048字节,不会超过wifi帧长最大2346的限制
    uint16_t index = 0;
    while(!bs_eof(b)) {
        uint8_t data_3bits = bs_read_u(b, 3);
        pktlen[j++] = data_3bits | ((index + 16) << 3); // 这里索引值要加上16,设备端解析时会减去16,猜测是为了兼容老的代码
        index++;

        // 每隔32个包发3个长度为1301的同步包,增加设备收到同步包进而锁定信道的概率
        if(j % 32 == 0) {
            pktlen[j++] = SYNC_FRAME_LEN + 1;
            pktlen[j++] = SYNC_FRAME_LEN + 1;
            pktlen[j++] = SYNC_FRAME_LEN + 1;
        }
    }

    bs_free(b);

以SSID为APTEST,密码12345678为例,其每轮广播配网依次发出的数据包长度如下:

1300
1300
1300
133
138
148
152
164
172
177
184
192
201
212
216
228
232
244
250
260
266
277
282
292
302
308
314
324
330
341
344
355
1301
1301
1301
364
372
377
387
398
400
410
419
426
437
441
454
462
468
475
483
488
502
505
512
520
532
540
549
559
560
568

组播配网

将配网信息编码到组播地址中,然后APP循环往这些组播地址发送数据长度1为的报文,设备端抓取报文并从报文的地址字段中解析出配网信息。每次发送组播包可以发送3字节的有效信息,对应组播MAC地址的低三位,这三位的编码规则如下:

第一字节第二字节第三字节描述
高4位低4位


00 | 1 | 2bssidbssid路由器bssid,未使用
20psk_lenpsk_len密码长度,后两个字节内容必须一样
4密码下标,偶数xy密码内容,一次可发送两字节,不够时最后一位补0
60 | 1psk_crc_H8psk_crc_L8密码校验,共4字节,分两次发送
10ssid_lenssid_lenSSID长度,后两个字节内容必须一样
3SSID下标,偶数xySSID内容,一次可发送两字节,不够时最后一位补0
50 | 1ssid_crc_H8ssid_crc_L8SSID校验,共4字节,分两次发送
70

移动端IP地址最后一字节,实际未使用,随便写个值都可以

以SSID为APTEST,密码12345678为例,其每轮组播配网依次发出的数据包组播地址如下:

226.32.8.8
226.64.99.97
226.65.103.97
226.66.99.97
226.67.111.97
226.96.157.166
226.97.67.103
226.16.6.6
226.48.80.65
226.49.69.84
226.50.84.83
226.80.251.5
226.81.130.123
226.112.1.1

可以看到组播配网无论是发包数还是每个配网包的长度都要小很多,这也是组播配网效率比广播配网高得多的原因,但组播配网失败概率也高,因为有的路由器不转发组播包,作为对比,广播配网虽然效率低,但基本都可以配网成功。

由于组播配网一般比较快,但容易受路由器不转发组播包的限制,所以在实际使用时,可以先以广播+组播的方式配网一段时间,如果未配网成功,则关闭组播配网,只使用广播配网,以减少网络流量。

广播+组播快速配网方案注意点

  1. 为什么配网信息不包含加密方式?
    1. 设备端通过报文长度就可以猜测到当前的加密方式,但可能不准。
  2. 为会配网会失败?
    1. 配网失败的原因多种多样,有的是无线路由器不转发组播包,有的是路由器开启了HT40模式,导致在两个信道上收发数据,有的是路由器支持多天线MIMO,导致数据包并不总在一个信道上发送。
  3. 配网什么时候结束?APP怎么判断设备已经配网好了?
    1. 设备在成功拿到配网信息并连接路由器成功后,会在当前局域网广播自己的序列号、设备类型等信息,APP通过接收广播信息,拿到设备的序列号,再到服务器上添加设备,就可以判断设备已经配网成功。
  4. 其他:
    1. 机密性,配网包很容易截获,要对算法进行保密,以防泄漏造成安全隐患。
    2. 兼容性,不同的路由器,不同的加密方式,都要能够适配,考虑WPA3能否跑通快速配网,WPA3PSK肯定使用的也是AES加密,和WPA2PSK长度理论上应该是一样的,这两者会不会无法区分,还有WPA3 SAE认证和OWE认证等等。

参考链接:



  • 无标签