公布这份代码的目的是但愿有人来改进这项技术,由于目前所知wifi组播配网在部分路由器上仍有问题。可是,无论怎样,这项技术能为咱们在将来的物联网生活中带来便利,对于咱们使用的大部分路由是兼容的,我选择公布它,但愿更多的人能够了解这项技术、使用这项技术、并完善它。git
1、组播。算法
组播,英文名Multicast,这里有必要同时提下Broadcast和Unicast,翻译成中文分别是广播和单播,顾名思义,广播就是单台主机向网络中全部主机发送消息,单播是两台主机之间进行对话,而组播则是单台主机向特定的一组主机发送消息。在以太网数据帧头中会须要指定发送以及接受设备的MAC地址,以肯定该数据包的来源与去向,广播时接收方的MAC地址为0xFFFFFFFFFFFF,单播时接收方的MAC地址为对端MAC地址,而组播时,接收方的MAC地址则与组地址之间有一个映射关系,而WiFi组播配网正是利用了这个组地址与MAC地址的映射。安全
用过网络抓包工具的确定知道,抓包时会发现电脑常常与一些奇怪的ip地址进行UDP通信,例如224.0.0.251,224.0.0.1,224.0.0.22,这些地址表明了一组特定的主机,路由器会将这些UDP包发送到加入该组的主机。关于组播技术的具体细节能够查阅相关文档了解,本文将再也不赘述。ieee将224.0.0.0 ~ 239.255.255.255划定为组播保留地址,在以太网中,目的IP地址为组播保留地址的数据包,目的MAC地址须要作一个映射。具体作法是,MAC地址的3个高字节固定为01:00:5E,后三个字节依次为组地址的从高字节起的第二字节取低7位、组地址的第三字节和第四字节,例如组地址225.215.145.230对应的MAC地址为01:00:5E:57:91:E6,这里须要了解的是,虽然咱们看到的组播MAC地址大多都为01:00:5E开头,但并非只有以01:00:5E开头的MAC地址才是组播MAC地址,MAC地址的前24bit叫作organization unique identifier(OUI),01:00:5E是ieee的OUI,习惯性的被大多数厂商和文献使用,判断一个MAC是否为组播MAC的依据是MAC地址的第一个字节的bit0是否为1。网络
2、WiFi数据帧头结构ide
在介绍WiFi帧头结构以前,咱们先了解下WiFi通讯的一些基本原理。WiFi工做于2.4GHz与5.8GHz两个频段,为简单起见,5.8GHz频段暂时忽略。WiFi在2.4G频段共有14个信道,分别是1-14信道,其中14信道只有日本在使用,这些信道的中心频率依次是2.412GHz /2.417GHZ /2.422GHz /2.427GHz /2.432GHz /2.437GHz /2.442GHz /2.447GHz /2.452GHz /2.457GHz /2.462 GHz / 2.467GHz /2.472 GHz /2.484 GHz,第14信道与第13信道中心频率相差12MHz, 其余各相邻信道的中心频率相差5MHz。使用时,路由器工做在一个固定信道,wifi网卡会循环在1-13信道扫描wifi热点,最终用户选择的热点在哪一个信道wifi网卡就会跳到该信道去链接这个热点。工具
下面是一个常见的802.11MAC帧,在802.11的MAC帧会标明目的MAC地址/源MAC地址/BSSID分别表示这个wifi数据帧发给哪一个设备,来自哪一个设备,从哪一个路由器发出来的,wifi网卡须要根据目的MAC地址来区分哪些数据包是发给本身的应对处理,哪些数据包不是发给本身的须要丢弃。编码
802.11 MAC帧加密
2 bytespa |
2 byte翻译 |
6 byte |
6 byte |
6 byte |
2 byte |
6 byte |
0-2312 byte |
6 byte |
Frame Control |
Duration /ID |
Addr1 |
Addr2 |
Addr3 |
Seq-ctrl |
Addr4 |
Frame body |
FCS |
3、WiFi组播配网
wifi组播配网正是利用了以前所说的组地址与组播MAC地址之间的映射及wifi数据帧头中的MAC地址信息来传输配网信息。
在发送端,将须要传输的数据以2个字节为单位经过组播传输出去,为保证数据前后顺序的正确性,须要为这些数据编上号,为了便于接收端区分wifi组播数据帧是配网,双方约定使用一个同步头来做为前导,此外为保证传输的有效性还须要将校验值、数据长度、协议和版本号告诉接受端,若是消息超出了一次分包消息的长度,须要将数据分红多个数据包来传输,为了确保数据的安全性,采用AES加密算法将ssid/passphrase/pmk加密,为了确保不会出现0结尾的组地址,采用base64编码算法对密文进行编码。
监听端,使wifi网卡循环在1-13信道监听组播wifi数据帧,以约定的组播MAC地址为同步头,当监听到同步头以后,进入接收模式,只接收来自该MAC地址的组播wifi数据帧,在接收完包头信息及数据以后进行解析,依次将base64编码还原成aes密文,再使用以前约定的密钥解密,获得ssid/passphrase/pmk,完成配网。
代码托管在开源中国码云,连接:https://gitee.com/shoowing/wifiZuBoPeiWang。