Technology-[转]微信AirKiss技术原理

本文介绍微信利用Airkiss技术对wifi装备进行智能配置上网的场景,并分析其实现的原理。

这里再次说明,Airkiss只是用于配置上网,其跟微信硬件平台的通讯流程和接入协议规范完全没有关系。1个wifi装备其实不1定要通过Airkiss技术来配置上网,它也能够利用传统的方法来配置,也能够利用其它厂商的智能配置技术来完成配置。所有的wifi智能配置上网技术的原理基本上都是1致的,其开山鼻祖应当是TIsmartConfig。

目前几近所有的主流wifi厂商都提供了Airkiss的接口库,但并没有说明其原理和实现进程。网上也只见1份Airkiss技术实现方案文档,但需要对无线通讯和socket编程有1定基础的人材能理解。本文尽量深入浅出地分析这项技术,帮助大家理解。

、传统配置上网进程

例如我们买了1个路由器,路由器是没有按键和屏显示的。而我们都知道,路由器要配置好运营商的账号和密码才能接入互联网的。1般的做法都是路由器作为热门AP,其提供1个WebServer来设置路由的各项参数,默许IP是192.168.1.1(或其他IP,路由器说明书上会说明);我们通过电脑有线接入路由器,通过DHCP自动分配到1个192.168.1段的地址。然后通过阅读器来访问http://192.168.1.1,便可以进入路由器设置界面进行设置,包括运营商的账号和密码、本机的SSID和密码。然后我们的手机就能够开启wifi扫描到SSID,输入密码便可以访问互联网了。

再比如,我们家里已有了1个可以上网的路由器(SSIDx和pwdx)。我们购买了1个无线摄像头装在家里。它自然也要连到家里的路由,才能访问这个摄像头的厂商,这样我们才可以用手机的APP接收到厂商服务器传过来的数据进行显示。摄像头也没有显示屏和按键(reset键不算啦)。

传统的配置方法是:

1 摄像头恢复出厂设置后默许进入AP(热门)+Station(工作站)状态。AP热门的SSID和密码由摄像头的说明书说明,是厂商默许的。手机通过wifi连接到该AP,然后通过阅读器访问http://192.168.1.1(也是厂商默许的),在该界面设置家里的路由器的SSID和密码,便于其作为Station连入家里的路由器。

2 当摄像头连接路由器成功后,其即单独以Station的模式运行(不用再做AP可以省功耗),其会立即访问厂商的服务器(其内部程序代码会hardcode厂商服务的域名或IP),告知其已上线,并且要在1段周期内发送Beacon心跳包保持长连接。

3 手机断开摄像头的AP热门,连接家里的路由器。打开摄像头的APP,便可以通过厂商服务器查看家里的摄像头的效果。
所以传统的配置上网方法是wifi装备必须以AP的模式运行,配置好以后再转回Station模式运行。是否是比较费事?

、智能配置上网流程

智能配置上网最新走进人们视野好像是庆科在大张旗鼓地宣扬其智能插座的1键配置功能,其实最早是Ti推出的技术。它是怎样操作呢?

1 wifi装备以Station混杂模式运行。

2 手机灵能配置APP通过某种协议包发送家里路由器的SSID和密码。

3 wifi装备通过抓包获得到SSID和密码,然后连接家里的路由器。

全部进程是否是很简单?

、智能配置的基本原理

1 混杂模式

这里有无注意到,wifi装备刚开始一样是以Station的模式运行,但是还有1个混杂模式。是甚么意思?它是指正常的wifi装备都有1个MAC地址,其硬件电路会自动过滤目标MAC地址跟其MAC不同的数据包。开启混杂模式就是我们平常时说的抓包,就是空中符合802.11格式的数据包都接收进来,不管MAC是不是1样。

很明显,手机灵能配置APP其实不知道该wifi装备的MAC地址,所以手机wifi发送出的数据包,通过家里的路由器转发出去时,wifi装备必须要在混杂模式下才能接收到这些数据包。

2 信道切换

802.11有多个信道,某个时刻wifi装备和路由器都是处于某个信道。路由器1般都是默许在第6个信道。所以如果想家里的wifi信号更好1点,可以尝试将路由器的信道改到1个其他值,这样就不会跟邻居家的wifi信道堆叠了。无线信号混在同1个频道就会干扰的。

同理,我们也不能假定wifi装备是处于哪一个信道,但我们可以在APP中肯定手机wifi的发送信道,这样可以要求wifi装备在1定的时刻内切换信道,以便于接收数据包。当wifi装备检测到有效的数据包后,要锁定在该信道进行后续通讯。

3 利用数据帧的长度来承载有效信息

我们先来看看802.2 SNAP(802.11物理层协议)的数据帧格式:

我们不去深入研究各个字段的含义,只需要知道DAT是加密的,如路由器都会通过WAP2、WEP等方式加密数据等。而DA(目标MAC)、SA(源MAC)、LLC(逻辑控制)、SNA(厂商朝码和协议标识)、FCS(校验码),这5个字段虽然是没有加密的,但是APP层的利用编程难以改变这些字段,需要操作系统才有权限修改,所以终究能够利用的字段就是Length,其没有被加密,而且能够被利用层编程所控制。

由于Length是两个字节,但是1帧最长是1492个有效数据,所以也不能完全利用16个比特。以最简单的方法来使用Length就是使用其中的1个字节,这样如果我们要发送数据0x12345678,那就连续发8个数据帧,第1次的长度是1,第2次的长度是2,以此类推。

4 微信Airkiss

Airkiss顾名思义是飞吻的意思,即手机发送的SSID和密码经过路由转发出去,被目前wifi装备所检测并截获到。无线网络协议1般场景都规定station只能和AP通讯,而不能station和station通讯(这类场景叫做AD-Hoc点对点)。

接下来我们分析SSID和pwd怎样利用Length进行编码的进程。

(1) 物理层

发送4个字节的前导码序列,{1,2,3,4}。即发送4个数据帧,帧长度分别是1,2,3,4.其要解决两个问题:

(a) 空中充满无线信号,通过前导码来辨认出符合airkiss协议的数据包的开始。

(b) 数据包的数据是经过加密的,发送方的数据帧的有效数据的长度是1,经过编码后的长度会发送变化。假定加密后的长度为N,那接收方接收到的数据长度是N。以后所有的数据帧接收的长度是M时,那发送方真实的数据长度是M-N+1。
Airkiss规定数据的长度使用9个bit进行编码。

(2) 数据链路层

数据链路层的包括控制字段和数据字段。

(a) Magic为4个数据帧,两个帧的两个9bit记录将要发送的数据(PWD+Ramdon+SSID)的长度;两个帧的两个9bit记录SSID的CRC校验值。路由器的SSID是会被路由器广播出来的,例如我们手机wifi扫描到路由器的名称就是SSID。因此wifi装备也能得到路由器的SSID,其只要计算目前所能获得到的SSID的CRC值跟MAGIC的SSID CRC值1样,那以后的SSID数据就不用接收了,这样能够提高配置上网速度。Magic很重要,因此发送5遍。

(b) PrefixCode为4个数据帧,两个帧的两个9bit记录PWD的数据长度,另外两个帧的两个9bit记录PWD长度的CRC校验值。Magic中发送的长度是所有数据的长度,包括密码PWD、随机数(wifi配置成功后要回复该随机数作为回复)和SSID。而这里是PWD的长度,用于对接收到的数据进行分段。

(c) 1个序列包括1个序列索引和1个序列数据。协议规定将有效数据以4个字节进行划分,不够补0。如我家路由的PWD是8313huang,那其会分为3个序列,分别是“8313”、“huan”“g000”进行发送。Sequence header包括索引值和CRC值,而Data field就是4个数据帧,包括要发送的数据,如“8313”等。

(d) 如何辨别Magic、Prefix、Sequence和Data,是由9bit的最高几个bit来辨别的。例如最高bit为1时表示是Data,其他是控制字段。

(3) 利用层

利用层即是手机配置上网APP要发送的数据,包括3部份的数据。分别是:

(a) PWD。其先被发送是由于其是最重要的,而SSID已在MAGIC字段中所确认。

(b) 1个字节的随机数。wifi配置成功后要发送以该随机数为内容的UDP广播包作为回复,APP收到后即认为wifi装备已成功联网。

(c) SSID。

5 ESP8266 Airkiss

微信硬件开放文档《airkiss_developer_manual.pdf》介绍在ESP8266平台上利用Airkiss接口库进行开发实现Airkiss协议的进程。而ESP8266的厂商提供的DEMO则更加直接地用1个接口就实现了Airkiss。

6 微信Airkiss

微信Airkiss在正式产品中是需要通过硬件JSAPI进行调用来调动身送SSID和PWD的界面,而硬件JSAPI需要经过验证的服务号才能申请取得权限。没有权限时可使用AirkissDebugger这个APP进行调试。