博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
airkiss技术原理
阅读量:5035 次
发布时间:2019-06-12

本文共 5630 字,大约阅读时间需要 18 分钟。

AirKiss原理分析

一、 AirKiss概述
AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。
AirKiss 技术示意图如下图所示,智能插座与外界没有建立任何一种实质性连接, 可以称之为信息孤岛。通过 Air Kiss 技术,微信客户端 可以将环境中的 Wifi 的ssid 与密码便捷的隔空传递给智能插座,从而使得智能插座能够快速的接入 Wifi。

二、传统配置上网过程
例如我们买了一个路由器,路由器是没有按键和屏显示的。而我们都知道,路由器要配置好运营商的账号和密码才能接入互联网的。一般的做法都是路由器作为热点AP,其提供一个WebServer来设置路由的各项参数,默认IP是192.168.1.1(或者其他IP,路由器说明书上会说明);我们通过电脑有线接入路由器,通过DHCP自动分配到一个192.168.1段的地址。然后通过浏览器来访问http://192.168.1.1,即可以进入路由器设置界面进行设置,包括运营商的账号和密码、本机的SSID和密码。然后我们的手机就可以开启wifi扫描到SSID,输入密码即可以访问互联网了。
再比如,我们家里已经有了一个可以上网的路由器(SSIDx和pwdx)。我们购买了一个无线摄像头装在家里。它自然也要连到家里的路由,才能访问这个摄像头的厂商,这样我们才可以用手机的APP接收到厂商服务器传过来的数据进行显示。摄像头也没有显示屏和按键(reset键不算啦)。传统的配置方法是:
1)摄像头恢复出厂设置后默认进入AP(热点)+Station(工作站)状态。AP热点的SSID和密码由摄像头的说明书说明,是厂商默认的。手机通过wifi连接到该AP,然后通过浏览器访问http://192.168.1.1(也是厂商默认的),在该界面设置家里的路由器的SSID和密码,便于其作为Station连入家里的路由器。
2)当摄像头连接路由器成功后,其即单独以Station的模式运行(不用再做AP可以省功耗),其会立即访问厂商的服务器(其内部程序代码会hardcode厂商服务的域名或者IP),告知其已经上线,并且要在一段周期内发送Beacon心跳包维持长连接。
3)手机断开摄像头的AP热点,连接家里的路由器。打开摄像头的APP,即可以通过厂商服务器查看家里的摄像头的效果。
所以传统的配置上网方法是wifi设备必须以AP的模式运行,配置好以后再转回Station模式运行。是不是比较费事?
三 、 Airkiss配网基本流程
1. wifi智能设备以station混杂模式运行
2. 手机微信客户端通过Airkiss发送家里的路由器ssid和密码
3. wifi设备通过抓包获取到ssid和密码,然后连接到家里的路由器
四、智能配置的基本原理
1.混杂模式
wifi设备刚开始同样是以Station的模式运行,但是还有一个混杂模式。是什么意思?它是指正常的wifi设备都有一个MAC地址,其硬件电路会自动过滤目标MAC地址跟其MAC不同的数据包。开启混杂模式就是我们平常时说的抓包,就是空中符合802.11格式的数据包都接收进来,不管MAC是否一样。
很明显,手机智能配置APP并不知道该wifi设备的MAC地址,所以手机wifi发送出的数据包,通过家里的路由器转发出去时,wifi设备必须要在混杂模式下才能接收到这些数据包。
2. 信道切换
802.11有多个信道,某一个时候wifi设备和路由器都处于某一个信道。路由器一般都是默认在第六信道,所以要想家里的网信号好一点,可以尝试将路由器的信道改到一个其他道,这样就不会和邻居家的wifi信道重叠了。wifi信号混在同一个频道就会互相干扰
同理,我们也不能假定wifi设备是处于哪个信道,但是我们可以在app中确定手机wifi的发送信道,这样要求wifi设备在一定的时刻切换信道,以便与接收到数据包。当wifi设备检测到有效的数据包,药锁定在该信道进行后续的通信
3. 利用数据帧的长度来承载有效信息
我们先来看一看802.2 SNAP(802.11的物理层协议)的数据帧格式

DA字段表示目标mac地址,SA字段表示源mac地址,Length字段表示后面数据的长度,LLC字段表示LLC头,SNAP字段包括3bytes的厂商代码和2bytes的协议类型标识,DATA字段为负载,对于加密信道来说是密文的,FCS字段表示帧检验序列。
从无线信号监听方的角度来说,不管无线信道有没有加密DA、SA、Length、LLC、SNAP、FCS字段总是暴露的,因此信号监听方便有了从这6个字段获取信息的可能。但从发送方的角度来说,由于操作系统的限制(比如ISO或者Android),DA、SA、LLC、SNAP、FCS五个字段的控制需要很高的控制权限,发送方一般是很难拿到的。因此只剩下Length这一字段,发送方可以通过改变其所需要发送数据包的长度进行很方便的控制。所以,只要制定出一套利用长度编码的通信协议,就可利用802.2 SNAP 数据包中的Length字段进行信息传递
在实际应用中,我们采用UDP广播包作为信息的载体。信息发送方向空间中发送一系列的UDP广播包,其中每一包的长度(即Length字段)都按照AirKiss通信协议进行编码,信息接收方利用混杂模式监听空间中的无线信号,并从数据链路层截取802.2 SNAP格式数据包,便可得到已编码的Length字段,随后接收方便可根据Air Kiss通信协议解析出需要的信息。

五、Airkiss通信协议

5.1 物理层协议
在信号载体方面,采用 wifi 无线信号进行信息传递,1-14 全信道支持。 在信号编码方面,802.2 SNAP 数据包中的 Length 字段为数据发送方唯一可 AP 转发 UDP 广 播包 发 送 长 度 经 过 编码的 UDP 广 播包 监听无线广播包,从数据链 路层截取数据包,得到已编 码的 Length 字段 ,再 根据 Air Kiss 通信协议解析出需要 的信息 控字段,因此 Air Kiss 通信协议利用发送数据包的长度进行编码。由于受到 MTU 的限制,Length 字段最大可编码位数为 10bit。但实际测试过程中发现, UDP 包长度与丢包率、乱序率成正比。因此本协议中,我们把 Length 字段编码位 数限制在 9bit,即 UDP 广播包的发送长度不大于 512 字节
我们身处的无线网络环境有可能及其复杂,很有可能在同一个空间中存在 多个 AP,而这些 AP 又分布在相同或者不同的信道上,这样接收者一开始是 不知道发送方在 1-14 哪个信道上发送信息,而且同一个信道上也可能会有很 多设备在发送 UDP 广播包。在这种情况下,接收方监听到的数据包是海量的。 必须从海量的数据信息中定位出发送方所在的信道和发送方的 mac 地址。另外, 由于在 UDP 广播包发送过程中,一个 UDP 层的数据包,要经过 IP 层、数据链 路层的封装,并且通过加密(加密方式包括 WPA2、WPA、WEP 三种)后才会被发 送出去,所以发送方发送 UDP 广播包的长度与接收方监听 SNAP 包中的 Length 字段值存在差异,这就需要进行转义。然而,由于底层加密方式的不确 定性,使得这个差异值也具有不确定性。 为解决这两个问题,在发送链路层数据(见下节)之前,需要先发送 400ms 的前导域(400ms = 8*50ms,即如果设备端以 50ms 的频率切换信道, 则可以覆盖 8 个信道,因为一般用户环境不用监听 14 个信道,所以覆盖 8 个 信道足已)。前导域由 4 个字节组成,其值固定为{1,2,3,4}。接收方在接收到这 些前导域数据包后,利用 SNAP 包中的 Length 字段与之相减,从而获取到这 个差异值。 举个例子,接受方通过监听,在链路层截获 802.2 SNAP 格式的前导数据 包,其 Length 字段的值分别为 53,54,55,56,那差异值就能确定为 53- 1=52。之后接收方接收到数据之后都用 SNAP 包的 Length 字段值减去 52,即能 得到实际的信息数据。
5.2 链路层协议
5.2.1链路层数据结构如下图所示:
链路层数据结构可分为两类,control 字段与 data 字段,magic code、prefix code、sequence header field 属于 control 字段,data field 属于 data 字段。control 字 段与 data 字段以第 8bit 位(最高位)加以区别,该位为 1 表示 data field 字段, 为 0 表示 control 字段。在 control 字段中,magic code 字段与 prefix code 字段完 全相同,magic code 字段与 sequence header 字段通过第 7bit 位加以区分,该位 为 1 表示 sequence header 字段,为 0 表示 magic code 字段。
以下分别对各个字段进行详细介绍。

5.2.2 magic code 字段的数据结构如下图所示:

1
Magic为4个数据帧,前两个帧的两个9bit记录将要发送的数据(PWD+Ramdon+SSID)的长度。每个bit的高 5 位为 magic code 字段,低 4 位为 information 字段。前两个 9bits 的 information 字段分别装载要发送数据长度 的高 4 位和低 4 位,
后两个帧的两个9bit记录SSID的CRC校验值。两个 9bits 的 information 字段分别装载要发送 ssid 的 crc8 值的高 4 位和低 4 位。路由器的SSID是会被路由器广播出来的,例如我们手机wifi扫描到路由器的名称就是SSID。因此wifi设备也能得到路由器的SSID,其只要计算目前所能获取到的SSID的CRC值跟MAGIC的SSID CRC值一样,那之后的SSID数据就不用接收了,这样能够提高配置上网速度。Magic很重要,因此发送5遍。
5.2.3 prefix code 字段的数据结构如下图所示:

PrefixCode为4个数据帧,前两个帧的两个9bit记录PWD的数据长度,
前两个帧的 information 字段分别装载PWD的长度的高4位和低4位。
后两个帧的两个9bit记录PWD长度的CRC校验值。这两个帧的 information 字段分别装载发送密码长度 的 crc8 值的高 4 位和低 4 位。
PrefixCode有两个作用,首先是表示数据序列的正式开始,其次告诉接收 端发送密码的长度,以便接收方在接收完数据后,对数据进行分割解密。
Magic中发送的长度是所有数据的长度,包括密码PWD、随机数(wifi配置成功后要回复该随机数作为回复)和SSID。而这里是PWD的长度,用于对接收到的数据进行分段。
5.2.3 Sequence序列包括一个sequence header序列索引和一个data field序列
我们把待发送的数据以 4字节进行划分,每 4 个数据组成一个 sequence, 以 sequence 为单位进行数据的发送。每个sequence 都由sequence header字段和data 字段组成。最后一个sequence 如果不够 4 个数据,不用补全。如我家路由的PWD是8313huang,那其会分为3个序列,分别是“8313”、“huan”“g”进行发送。Sequence header包括索引值和CRC值,而Data field就是4个数据帧,包含要发送的数据,如“8313”等。
5.2.3.1 sequence header 字段的数据结构如下图所示:
sequence header 字段由两个 9bits 组成,第一个的低 7位装载的是从本 sequence index 开始到本 sequence 结束发送的所有数据的 crc8 的低 7 位值(计算 过程中不计入字段标识位,因此 sequence index 最高位需补 0),在接收完一个 sequence 的数据之后,需进行 crc8 值的效验,如果不相同,证明该 sequence 的 数据接收出错,应该丢弃。
5.2.3.2 data 字段的数据结构如下图所示:
data 字段由 4 个 9bits 组成,每个 9bits 的第 8 位为控制位,固定为 1,其余 的 8 位装载需要传输的数据。
六、应用层协议
发送方所要发送的数据由三部分组成:密码、随机数、ssid。其中随机数的作用 是,当数据接收方连上 AP 之后,立即发送以该随机数为内容的 UDP 广播包, 当发送方收到该广播包后就能确认接收方已经准确接收到所有数据。密码和 ssid 都’\0’结尾,并且分别用 AES 进行加密,再发送。这三部分数据的发送顺序为先 发送密码,再发送随机数,最后发送 ssid,如下图所示:

---------------------
作者:terry--tt
来源:CSDN
原文:https://blog.csdn.net/lb5761311/article/details/77945848
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/smallqing/p/10028011.html

你可能感兴趣的文章
限制input text输入的类型(数字,字母,小数点)
查看>>
protected访问修饰符
查看>>
Routing 为 Magento 2 一个重要的部分,本文介绍基本应用
查看>>
什么是logger?
查看>>
基于FPGA与DSP协同处理PAL制_CameraLink_SDI高清视频图像传输卡
查看>>
一个Java程序员应该掌握的10项技能
查看>>
c#英文大小写快捷键
查看>>
tpframe免费开源框架又一重大更新
查看>>
一.go语言 struct json相互转换
查看>>
什么是架构设计
查看>>
程序员学习能力提升三要素
查看>>
PHP 微信错误状态返回码说明
查看>>
【4.1】Python中的序列分类
查看>>
html5 新属性
查看>>
ubuntu 移动文件
查看>>
BZOJ 4590: [Shoi2015]自动刷题机
查看>>
实现viewpager下的圆点滑动
查看>>
Linux CentOS6.5下编译安装MySQL 5.6.16【给力详细教程】
查看>>
58同城高性能移动Push推送平台架构演进之路
查看>>
如何回答面试中问到的Hibernate和MyBatis的区别
查看>>