Airkiss 文章一

    本文介绍微信的airkiss技术对wifi设备进行智能配置上网的场景,并分析其实现原理。这里再次说明,airkiss只是用于上网配置,其跟微信硬件平台的通信流程和介入协议规范完全没有关系,一个wifi设备并不一定要通过airkiss技术配置上网,它也可以利用传统方法来配置,也可以利用其他厂商的智能配置技术来完成配置。所有的wifi智能配置上网技术的原理基本上是一致的,其开山鼻祖应该是TLsmartConfig。

目前几乎所有的主流wifi厂商都提供了airkiss的接口库,但是并没有说明其实现原理和实现过程。网上也只有一份airkiss的实现技术方案。但需要对无线通信和socket编程器有一定基础的的人才能理解。

一  传统的上网配置过程

例如我们买了一个路由器,路由器没有按键和显示屏,但是我们都知道,路由器要配置好运营商的账号和密码才能接入互联网。一般的做法是路由器作为热点ap,并提供一个webservice来设置路由的各项参数。默认的ip是192.168.1.1   我们通过电脑有限介入路由器,通过DHCP自动分配到一个192.168.1段的地址,然后通过浏览器来访问192.168.1.1 ,就可以进入到路由器设置接,包括运营商的账号和密码,本机的ssid和密码。然后我们的手机通过开启wifi扫描到ssid,输入密码就可以访问到互联网

再比如 ,我们家里已经有一个可以上网的路由器。我们购买了一个无线摄像头放在家里。他自然也要连接家里的路由,才能访问这个摄像头的厂商,这样我们才可以用手机app接收到厂商服务器传过来的数据并进行显示,摄像头也没有显示屏和按键。传统的配置方法是:

1. 摄像头恢复出厂设置后进入ap热点+ station状态。ap热点的ssid和密码是摄像头的说明书说明,是厂商默认的。手机通过wifi连接到这个ap,然后通过浏览器访问192.168.1.1(也是厂商默认),在这个界面设置家里的路由器的ssid和密码,便于其作为station联入家里的路由器

2. 当摄像头连接路由器成功后,其便以单独的station的模式运行,其会立即访问厂商的服务器(其内部程序代码会hardcode厂商服务的域名和ip),告知其已经上线,并且要在一段时间周期里面发送beacon心跳包维持长连接

3 手机断开摄像头的ap热点,连接家里的路由器,打开摄像头厂家提供的app,就可以通过厂商服务器查看家里的摄像头的效果

所以传统的配置上网的方法是wifi设备必须要以ap的模式运行,配置好以后在转回station的模式运行。比较费事

二  智能配置上网的流程

智能设备上网的最早进入人们的视野好像是庆科在大张旗鼓的宣传其为智能插座的一件配置功能,其实最早是Ti提出的技术,具体的操作

1. wifi设备以station混杂模式运行

2. 手机智能配置App通过某种协议发送家里的路由器ssid和密码

3. wifi设备通过抓包获取到ssid和密码,然后连接到家里的路由器

三 智能配置的基本原理

1. 混杂模式

这里有没有注意到,wifi设备刚开始同样是station的模式运行。但是还有一个混杂模式,是指,正常的Wi-Fi设备都会有一个mac地址,其硬件电路会自动过滤目标的mac地址跟其他mac不同的数据包。开启混杂模式就是我们平常说的抓包,就是空中符合802.11格式的数据包都接收进来,不管mac是否一样

很明显,手机智能配置app不知道该Wi-Fi设备的mac地址,所以手机wifi发送出的数据包,通过家里的路由转发出去时,wifi设备必须要在混杂模式下才能接收到这些数据包。

2 信道切换

802.11有多个信道,某一个时候wifi设备和路由器都处于某一个信道。路由器一般都是默认在第六信道,所以要想家里的网信号好一点,可以尝试将路由器的信道改到一个其他道,这样就不会和邻居家的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是2个字节,但是一祯最长有1492个有效数据,所以也不能完全的利用16个比特。以最简单的饭食来使用Length就是使用其中的一个字节,这样如果我们要发送数据Ox12345678,那就连续发8个数据帧,第一次的长度是1,第二次的长度是2,以此类推

四  airkiss

顾名思义就是飞吻的意思,即手机发送的ssid和密码经过路由转发出去,被目前的wifi设备所检测并截获到。无线网络协议一般场景都规定station只能和ap通信,而不能station和station通信(这种场景叫做AD-Hoc点对点)。接下来我们分析ssid和pwd怎么利用Length进行编码的过程


1. 物理层

发送4个字节的前导码序列【1,2,3,4】。即发送4个数据帧,帧长分别为1,2,3,4,其药解决2个问题

1. 空气中充满无线信号,通过前导码来识别出符合airkiss协议的数据包的开始

2. 数据包的数据是经过加密的,发送方的数据帧的有效数据的长度是1,经过编码后的长度会发送变化。假设加密后的长度为N,那接收方接收到的数据长度是N。以后所有的数据帧接收的长度是M时,那发送方真正的数据长度是M-N+1。

Airkiss规定数据的长度使用9个bit进行编码

2 数据链路层


Airkiss 文章一_第1张图片

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

(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的界面,而硬件JSAPI需要经过验证的服务号才能申请获得权限。没有权限时可以使用AirkissDebugger这个APP进行调试。


参考文献http://blog.csdn.net/yueqian_scut/article/details/49313727?utm_source=tuicool&utm_medium=referral

你可能感兴趣的:(Airkiss 文章一)