最近打算做一款自己的无线传输模块用来实现光伏电站的数据接入,希望可以尽量简化接入流程,其中wifi密码的配置就是一个比较麻烦的事情,想到最近使用萤石摄像头时,wifi密码配置似乎很简单,他们是怎么做到的,下面这篇文章很好的解答了这个问题:

http://www.ayiii.com/712.html

自从物联网问世以来,如何使得物能够联网有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面。
物联网:智能硬件+APP+云
APP 需要配置wifi用户名 密码进入智能硬件,目前各个WIFI芯片厂家基本采用以下几种方式
1)AP模式: APP 配置 手机连接到 智能硬件(WIFI芯片 的AP),构建成一个局域网,当然该局域网是不能上网的,但是局域网内的各个设备的通信是OK
此时 该局域网内一般有三个设备(WIFI芯片工作在AP模式 或者是AP+STATION模式) 手机 智能硬件STATION模式---智能硬件的AP

2)TI 的smartconfig
smartconfig 也就是所谓的一键配置,速度比AP模式快,为什么呢?请看下面分解。
所谓的smartconfig就是
手机APP端发送包含WIFI 用户名 WIFI密码的 UDP 广播包或者组播包,
智能终端的WIFI芯片可以接收到该UDP包,只要知道UDP的组织形式,就可以通过接收到的UDP包解密 出WIFI 用户名 密码,
然后智能硬件 配置受到的WIFI 用户名 密码到指定的WIFI AP 上。
AP模式比较不好的就是配置时间比smartconfig要长,手机连接的WIFI接入点会变化,如果配置不成功,手机就无法上网,需要在手动配置WIFI,手机才能上网。
典型的萤石云就是用的这种模式 ,只需要在APP上输入wifi密码,在没有任何连接网络的情况下的摄像头都可以直接连接wifi了。

smartconfig 技术详解:
一.简介:

简单来说, 这是一种让你可以在没有和其他设备(支持SmartConfig技术)建立任何性质的通讯链路的情况下, 配置该设备接入wifi网络
虚构一个实际场景的话, 会是这样:
你购买了一个带有wifi的摄像头, 不过这个摄像头没有usb, 没有以太网, 没有蓝牙, 没有nfc, gsm就更不可能了, 只有wifi, 那么问题来了:
你如何配置这个摄像头接入你家的wifi?

乍一想, 没有数据链路, 如何进行数据交换?

对的, SmartConfig就是用在这种场景下的, 如果这个摄像头的wifi支持SmartConfig技术, 那么你只需这样几个步骤
1.摄像头插上电源
2.安装制造商提供的手机app(应用无需任何特殊权限, 只需要手机当前是接入wifi的)
3.在摄像头附近打开app, 输入你家wifi的密码, 点击确认, 稍等片刻, 不出意外的话, 摄像头已经接入你家wifi了

这项技术由德州仪器提出, 并且应用在自己的CC3000系列芯片上. 不过, 从原理上来说, 支持混杂模式的wifi芯片都可以应用该技术

二.猜想

首先, 你可能会联想到是不是这个app控制了手机, 让手机主动接入摄像头的wifi网络, 然后交换数据. 这确实是一个行得通的办法, 但是却不实用, 控制操作系统更换当前的网络连接是敏感操作, 普通的app没这个权限, 那么就需要用户参与其中, 对于一般的用户而言, 这样的流程就显得复杂且难以理解了

这样看来, 摄像头并没有和你控制的任何一个设备建立任何性质的连接
一般来说, 我们潜意识里会默认通讯都是双向的, 以这个习惯来看待SmartConfig似乎觉得匪夷所思
其实, 在这种场景下, 我们只需要能够把wifi的名称和密码告诉摄像头就行了, 摄像头有没有回馈并不重要
顺着这个思路, 我们发现可以这么做, 手机app上生成一个包含wifi名称和密码的二维码, 然后放置在摄像头前, 摄像头只要识别了二维码自然就可以接入wifi
但是, 扫二维码的方式依赖视频信号输入, 并不是通用的手段(因为现实场景中的设备并不都是摄像头), 而且场景里也没有采用这种做法

这么分析下来, 传播wifi信息的渠道只可能是wifi本身了
摄像头尚未接入wifi, 况且wifi也是加密的, app并没有能力控制wifi的底层通讯, app又是如何将信息成功外泄给摄像头的?

三.共识

理解SmartConfig原理前需要说两个共识
1. 无线数据的传播形式必定是广播
至少目前是这样, 因为我所知道的能做到点对点的无线传输只有量子隐形传输, 可惜还在实验室中
既然是广播, 那么必然可以被监听, 就像一个酒吧里有两个中国人和两个俄罗斯人, 中国人和中国人说话, 俄罗斯人听得到, 只不过听不懂, 反之亦然

2. 任何可控的模式都可以被用于编码, 用于数据交换

当前wifi应用的几种主流加密方式都存在一个特点, 明文的长度和加密后的密文长度之间是线性关系

即: 密文长度 = 明文长度 + 算法相关的常量C, 也就是说, 只要明文长度可控, 密文的长度即是可控的

这个特点是SmartConfig的核心原理

四.原理

如果了解802.11的帧格式, 你就知道, 链路层载荷数据(即网络层头部及网络层数)在数据帧中是清晰可辨的, 只要接收到802.11帧就可以立刻提取出载荷数据, 计算载荷数据的长度自不用说, 而这里的载荷数据, 通常就是密文

常见的两种数据帧格式:
Station to AP

AP to Station

密文长度有了, 接下来我们看一下明文的结构
普通权限的应用程序是没有能力完全控制和定义传输层及下层所有协议数据的, 唯一可以完全控制的就是应用层数据, 那就继续分析一下TCP/IP协议栈中的网络层和传输层的数据结构
常用的网络层协议非IPv4莫属, IPv4的头部绝大多数情况下都是定长的20字节, 长度几乎完全可控
传输层协议我们选择UDP, 因为UDP协议头部为定长的8字节, 完全可控(当然, 选择UDP还有别的原因)
这么看来, 我们有能力完全控制明文的长度

明文长度 = 20 + 8 + 应用层数据长度
密文长度也脱口而出
密文长度 = 20 + 8 + 应用层数据长度 + 算法相关的常量C
如果我需要你发出一个密文长度为1000字节的802.11帧, 那么你只需要在UDP中塞满任意(1000 – 20 – 8 – C)个字节即可
接下来, 只要我们利用可控的密文长度定义一张编码表即可将数据告诉任何知道这张编码表的设备了
原理说完了, 按照这个原理, 几乎可以实现任意数据的传播, 至于SmartConfig采用何种编码, 没必要关心

五.流程示例

我们定义一张编码表, 简单示意一下整个过程:

密文长度 => 映射释义
1234 => 起始符; 连续的3个起始符, 用于表示数据传输开始
1324 => 结束符; 连续的3个结束符, 用于表示数据传输结束
110 => 间隔符; 连续的2个间隔符, 用于表示数据符之间的间隔
1000 => 数据符; 表示 ASCII 0x00
1001 => 数据符; 表示 ASCII 0x01

1127 => 数据符; 表示 ASCII 0x7F

假设我们要把字符串”CJey”(密码)告诉摄像头, 整个流程大致如下: (假设常量C为16)

手机app部分:
打开手机app, 在输入框中填入要发送的字符串”CJey”, 点击发送
app连续发送三个UDP广播包, 填充数据为1190个0x00字节(1234 – 16 – 20 – 8 = 1190), 表示传输开始
app发送一个UDP广播包, 填充数据为1023个0x00字节(1067 – 16 -20 – 8 = 1023), 传输字符C
app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 – 16 – 20 – 8 = 66), 表示数据间隔
app发送一个UDP广播包, 填充数据为1030个0x00字节(1074 – 16 -20 – 8 = 1030), 传输字符J
app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 – 16 – 20 – 8 = 66), 表示数据间隔
app发送一个UDP广播包, 填充数据为1057个0x00字节(1101 – 16 -20 – 8 = 1057), 传输字符e
app连续发送两个UDP广播包, 填充数据为66个0x00字节(110 – 16 – 20 – 8 = 66), 表示数据间隔
app发送一个UDP广播包, 填充数据为1077个0x00字节(1121 – 16 -20 – 8 = 1077), 传输字符y
app连续发送三个UDP广播包, 填充数据为1280个0x00字节(1324- 16 – 20 – 8 = 1280), 表示传输结束
从1开始循环多次, 直到超时或者摄像头成功接入wifi, 向app汇报成功

摄像头部分:

摄像头通电, 没有可用的wifi, 进入混杂模式, 开始监听信号覆盖范围内的所有wifi数据帧

捕获数据帧, 如果连续收到3个密文长度为1234, 且来自于同一个发射源X的数据帧, 则进入下一步, 否则重复2

捕获发射源X的数据帧, 持续捕获密文长度为110或者1000-1127之间的数据帧, 直到捕获到连续3个密文长度为1324的数据帧

将上述数据帧按照编码表进行映射, 由于手机app并非是独占网络, 所以捕获到的数据可能有噪音, 比如解码出来的结果可能是(/表示分隔符): ACX/J/o@e/ymmm

如果没有噪音, 记为候选数据RC, 重复捕获X, 进行二次验证, 通过则表示接收完成, 没通过也重复捕获X, 将这次所得结果同上一次做交集, 循环如此直到得出唯一结果, 即RC, 之后再重复5

由于捕获的数据帧头部信息中已经包含了wifi的bssid信息, 使用”CJey”作为密码去尝试连接相应的wifi, 成功则向app报告, 失败则继续重复2

六.参考

SmartConfig的TI官方wiki

SmartConfig的TI官方介绍

CC3000 Smart Config – transmitting SSID and keyphrase

How does TI CC3000 wifi smart config work?

物联网(莹石云)WIFI一键配置原理分析(zz)的更多相关文章

  1. 物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004

    自从物联网 问世以来,如何使得物  能够联网 有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面,也对于有需要的盆友 也希望有抛砖引玉之效果. 物联网:  智能硬件+APP+云 APP ...

  2. 跑PIN码破解无线网络WIFI密码的原理分析(转)

    你们家用的无线路由器安全吗?有人蹭网吗?无线路由器的漏洞在哪里?这么避免蹭网? 想要了解这些,必须要了解加密以及破解原理. 工具/原料 电脑 足够多足够好的wifi信号源 usb无线网卡(非必需) 一 ...

  3. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  4. 爱伪装(AWZ)/爱立思(ALS)改机改串一键新机原理分析

    简介 爱伪装(AWZ)/爱立思(ALS)是一款iOS越狱系统上的改机工具,可以修改多种系统参数达到伪装设备型号及各种软硬件属性的目的,同时提供了防越狱检测机制,常用于iOS上的推广刷量,配合代理/VP ...

  5. Android手机一键Root原理分析

    图/文 非虫 一直以来,刷机与Root是Android手机爱好者最热衷的事情.即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲.就在前天晚上,一年一度的Google I/O大会拉开了帷 ...

  6. springboot创建,自动装配原理分析,run方法启动

    使用IDEA快速创建一个springboot项目 创建Spring Initializr,然后一直下一步下一步直至完成 选择web,表示创建web项目 运行原理分析 我们先来看看pom.xml文件 核 ...

  7. 【转载】wifi一键配网smartconfig原理及应用

    物联网给我们又提供了一种窃取WiFi密码的好方式:让智能设备主动断线. 同时也提供一种让智能设备连接到恶意WiFi的方式:设备一键配置功能时疯狂广播恶意WiFi的信息. 转自:http://blog. ...

  8. Azure WAF防火墙工作原理分析和配置向导

    Azure WAF工作原理分析和配置向导 本文博客地址为:http://www.cnblogs.com/taosha/p/6716434.html ,转载请保留出处,多谢! 本地数据中心往云端迁移的的 ...

  9. 一键配置树莓派wifi、静态ip等

    系统老是被我玩坏,重新烧录系统后配置又太麻烦,用shell脚本一键配置一下wifi和静态IP #!/bin/bash touch /media/fanghaoyu/boot/ssh echo &quo ...

随机推荐

  1. kafka-0.10.0官网翻译(一)入门指南

    1.1 IntroductionKafka is a distributed streaming platform. What exactly does that mean?kafka是一个分布式的流 ...

  2. 利用伪类:before&&:after实现图标库图标

    一.实现如下效果 二.代码实现思路 图案一源码 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  3. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

  4. html5+Canvas实现酷炫的小游戏

    最近除了做业务,也在尝试学习h5和移动端,在这个过程中,学到了很多,利用h5和canvas做了一个爱心鱼的小游戏.点这里去玩一下 PS: 貌似有点闪屏,亲测多刷新两下就好了==.代码在本地跑都不会闪, ...

  5. 如何合理优化WEB前端 高效提升WEB前端性能

    对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前 ...

  6. php每天一题:strlen()与mb_strlen()的作用分别是什么

    strlen()与mb_strlen()都是用于获取字符串长度的,那么它们两个有什么不同? strlen()与mb_strlen()的不同之处在于mb_strlen()第二个参数可以用于指定字符编码. ...

  7. 那些过目不忘的H5页面

    原文链接:http://isux.tencent.com/great-mobile-h5-pages.html 从引爆朋友圈的H5小游戏<围住神经猫>,到颠覆传统广告的大众点评H5专题页& ...

  8. 【转载】ReactiveX 的理念和特点

    原作者地址:http://www.open-open.com/lib/view/open1440166491833.html ReactiveX是Reactive Extensions的缩写,一般简写 ...

  9. 深入浅出React Native 2: 我的第一个应用

    这是深入浅出React Native教程的第二篇文章. 1. 环境配置 React Native环境配好之后,就可以开始创建我们的第一个App啦. 打开控制台,输入 react-native init ...

  10. Native与H5交互的一些解决方法

    一. 原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webVi ...