揭开智能配置上⽹(Airkiss)的神秘⾯纱
本⽂介绍利⽤Airkiss技术对wifi设备进⾏智能配置上⽹的场景,并分析其实现的原理。这⾥再次说明,Airkiss只是⽤于配置上⽹,其跟硬件平台的通信流程和接⼊协议规范完全没有关系。⼀个wifi设备并不⼀定要通过Airkiss技术来配置上⽹,它也可以利⽤传统的⽅法来配置,也可以利⽤其它⼚商的智能配置技术来完成配置。所有的wifi智能配置上⽹技术的原理基本上都是⼀致的,其开⼭⿐祖应该是TIsmartConfig。
⽬前⼏乎所有的主流wifi⼚商都提供了Airkiss的接⼝库,但并没有说明其原理和实现过程。⽹上也只见⼀份Airkiss技术实现⽅案⽂档,但需要对⽆线通信和socket编程有⼀定基础的⼈才能理解。本⽂尽可能深⼊浅出地分析这项技术,帮助⼤家理解。
⼀、传统配置上⽹过程连不上网
例如我们买了⼀个路由器,路由器是没有按键和屏显⽰的。⽽我们都知道,路由器要配置好运营商的账号和密码才能接⼊互联⽹的。⼀般的做法都是路由器作为热点AP,其提供⼀个WebServer来设置路由的各项参数,默认IP是192.168.1.1(或者其他IP,路由器说明书上会说明);我们通过电脑有线接⼊路由器,通过DHCP⾃动分配到⼀个192.168.1段的地址。然后通过浏览器来访问,即可以进⼊路由器设置界⾯进⾏设置,包括运营商的账号和密码、本机的SSID和密码。然后我们的⼿机就可以开启wifi扫描到SSI
D,输⼊密码即可以访问互联⽹了。
再⽐如,我们家⾥已经有了⼀个可以上⽹的路由器(SSIDx和pwdx)。我们购买了⼀个⽆线摄像头装在家⾥。它⾃然也要连到家⾥的路由,才能访问这个摄像头的⼚商,这样我们才可以⽤⼿机的APP接收到⼚商服务器传过来的数据进⾏显⽰。摄像头也没有显⽰屏和按键(reset键不算啦)。传统的配置⽅法是:
1)摄像头恢复出⼚设置后默认进⼊AP(热点)+Station(⼯作站)状态。AP热点的SSID和密码由摄像头的说明书说明,是⼚商默认的。⼿机通过wifi连接到该AP,然后通过浏览器访问(也是⼚商默认的),在该界⾯设置家⾥的路由器的SSID和密码,便于其作为Station连⼊家⾥的路由器。
2)当摄像头连接路由器成功后,其即单独以Station的模式运⾏(不⽤再做AP可以省功耗),其会⽴即访问⼚商的服务器(其内部程序代码会hardcode⼚商服务的域名或者IP),告知其已经上线,并且要在⼀段周期内发送Beacon⼼跳包维持长连接。
3)⼿机断开摄像头的AP热点,连接家⾥的路由器。打开摄像头的APP,即可以通过⼚商服务器查看家⾥的摄像头的效果。
所以传统的配置上⽹⽅法是wifi设备必须以AP的模式运⾏,配置好以后再转回Station模式运⾏。是不是⽐较费事?
⼆、智能配置上⽹流程
智能配置上⽹最新⾛进⼈们视野好像是庆科在⼤张旗⿎地宣传其智能插座的⼀键配置功能,其实最早是Ti推出的技术。它是怎样操作呢?
1)wifi设备以Station混杂模式运⾏。
2)⼿机智能配置APP通过某种协议包发送家⾥路由器的SSID和密码。
3)wifi设备通过抓包获取到SSID和密码,然后连接家⾥的路由器。
整个过程是不是很简单?
三、智能配置的基本原理
1.混杂模式
这⾥有没有注意到,wifi设备刚开始同样是以Station的模式运⾏,但是还有⼀个混杂模式。是什么意思?它是指正常的wifi设备都有⼀个MAC地址,其硬件电路会⾃动过滤⽬标MAC地址跟其MAC不同的数据包。开启混杂模式就是我们平常时说的抓包,就是空中符合802.11格式的数据包都接收进来,不管MAC是否⼀样。
很明显,⼿机智能配置APP并不知道该wifi设备的MAC地址,所以⼿机wifi发送出的数据包,通过家⾥的路由器转发出去时,wifi设备必须要在混杂模式下才能接收到这些数据包。
2.信道切换
802.11有多个信道,某个时刻wifi设备和路由器都是处于某个信道。路由器⼀般都是默认在第6个信道。所以如果想家⾥的wifi信号更好⼀点,可以尝试将路由器的信道改到⼀个其他值,这样就不会跟邻居家的wifi信道重叠了。⽆线信号混在同⼀个频道就会⼲扰的。
同理,我们也不能假定wifi设备是处于哪个信道,但我们可以在APP中确定⼿机wifi的发送信道,这样可以要求wifi设备在⼀定的时刻内切换信道,以便于接收数据包。当wifi设备检测到有效的数据包后,要锁定在该信道进⾏后续通信。
3.利⽤数据帧的长度来承载有效信息
我们先来看看802.2 SNAP(802.11物理层协议)的数据帧格式:
我们不去深⼊研究各个字段的含义,只需要知道DAT是加密的,如路由器都会通过WAP2、WEP等⽅式加密数据等。⽽DA(⽬标MAC)、SA(源MAC)、LLC(逻辑控制)、SNA(⼚商代码和协议标识)、FCS(校验码),这五个字段虽然是没有加密的,但是APP层的应⽤编程难以改变这些字段,需要操作系统才有权限修改,所以最终能够利⽤的字段就是Length,其没有被加密,⽽且能够被应⽤层编程所控制。
由于Length是两个字节,但是⼀帧最长是1492个有效数据,所以也不能完全利⽤16个⽐特。以最简单的⽅法来使⽤Length就是使⽤其中的⼀个字节,这样如果我们要发送数据0x12345678,那就连续发8个数据帧,第⼀次的长度是1,第⼆次的长度是2,以此类推。
四、Airkiss
Airkiss顾名思义是飞吻的意思,即⼿机发送的SSID和密码经过路由转发出去,被⽬前wifi设备所检测并截获到。⽆线⽹络协议⼀般场景都规定station只能和AP通信,⽽不能station和station通信(这种场景叫做AD-Hoc点对点)。接下来我们分析SSID和pwd怎么利⽤Length进⾏编码的过程。
1.  物理层
发送4个字节的前导码序列,{1,2,3,4}。即发送4个数据帧,帧长度分别是1,2,3,4.其要解决两个问题:
1)空中充满⽆线信号,通过前导码来识别出符合airkiss协议的数据包的开始。
2)数据包的数据是经过加密的,发送⽅的数据帧的有效数据的长度是1,经过编码后的长度会发送变化。假设加密后的长度为N,那接收⽅接收到的数据长度是N。以后所有的数据帧接收的长度是M时,那发送⽅真正的数据长度是M-N+1。
Airkiss规定数据的长度使⽤9个bit进⾏编码。
2.数据链路层
数据链路层的包括控制字段和数据字段。
1)Magic为4个数据帧,两个帧的两个9bit记录将要发送的数据(PWD+Ramdon+SSID)的长度;两个帧的两个9bit记录SSID的CRC校验值。路由器的SSID是会被路由器⼴播出来的,例如我们⼿机wifi扫描到路由器的名称就是SSID。因此wifi设备也能得到路由器的SSID,其只要计算⽬前所能获取到的SSID的CRC值跟MAGIC的SSID CRC值⼀样,那之后的SSID数据就不⽤接收了,这样能够提⾼配置上⽹速度。Magic很重要,因此发送5遍。
2)PrefixCode为4个数据帧,两个帧的两个9bit记录PWD的数据长度,另外两个帧的两个9bit记录PWD长度的CRC校验值。Magic中发送的长度是所有数据的长度,包括密码PWD、随机数(wifi配置成功后要回复该随机数作为回复)和SSID。⽽这⾥是PWD的长度,⽤于对接收到的数据进⾏分段。
3)⼀个序列包括⼀个序列索引和⼀个序列数据。协议规定将有效数据以4个字节进⾏划分,不够补0。如我家路由的PWD是
8313huang,那其会分为3个序列,分别是“8313”、“huan”“g\0\0\0”进⾏发送。Sequence header包括索引值和CRC值,⽽Data field就是4个数据帧,包含要发送的数据,如“8313”等。
4)如何区分Magic、Prefix、Sequence和Data,是由9bit的最⾼⼏个bit来区分的。例如最⾼bit为1时表⽰是Data,其他是控制字段。
3.应⽤层
应⽤层即是⼿机配置上⽹APP要发送的数据,包括三部分的数据。分别是:
1)PWD。其先被发送是因为其是最重要的,⽽SSID已经在MAGIC字段中所确认。
2)1个字节的随机数。wifi配置成功后要发送以该随机数为内容的UDP⼴播包作为回复,APP收到后即认为wifi设备已经成功联⽹。
3)SSID。
五、ESP8266 Airkiss
硬件开放⽂档有《airkiss_developer_manual.pdf》介绍在ESP8266平台上利⽤Airkiss接⼝库进⾏开发实现Airkiss协议的过程。⽽ESP8266的⼚商提供的DEMO则更加直接地⽤⼀个接⼝就实现了Airkiss。
六、Airkiss
Airkiss在正式产品中是需要通过硬件JSAPI进⾏调⽤来调出发送SSID和PWD的界⾯,⽽硬件JSA
PI需要经过验证的服务号才能申请获得权限。没有权限时可以使⽤AirkissDebugger这个APP进⾏调试。