物联网爱上Android

Wifi SmartConfig 一键配置

2018-04-26  本文已影响5795人  struggle3g

引言

概念

SmartConfig又名快连

虚构连接一个实际场景

B在没有任何链接的情况下,A是如何告知B设备S的信息,这便是SmartConfig

虚构一个SmartConfig技术实现快连的场景

准备一个支持Smartconfig技术的设备
1.启动这个设备
2.安装制造商提供的手机app
3.在设备附近打开App,输入需要接入的WIFI信息,确认,不出意外的话就会链接上这个设备

SmartConfig的实现厂商

编号 厂商 芯片厂商 技术名称 发包方式
1 TI CC3200 SmartConfig 往某一个固定IP发UDP包
2 高通 QCA4004/QCA4002 SmartConnection -
3 联发科MTK MTK7681 SmartConnection 组播地址编码
4 MARVELL MC200+8801/MW300 EasyConnect 组播地址编码
5 Reltek AMEBA SimpleConfig 组播地址编码
6 乐鑫 ESP8266 SmartConfig 组播,通过长度编码
7 新案线 NL6621 SmartConfig 组播地址编码
8 微信 - AirKiss 全网广播,通过长度编码

SmartCongfig的实际操作

上述厂商,是我能查到的应用到市场上面的几个厂商,如有补充请下面评论区,给哥么提醒一下。
哥么看到上面这么多的厂商,怎么搞?怎么开发?

实现过程

首先需求公司要做一个灯泡、插座、一件配置的一款App,

  1. 需要硬件支持
  2. App
  3. 成功率 10 6这种层次
    经过一段时间的筛选,我们最终决定了用乐鑫,
    原因: 1. 有现成的开发板
    2. 文档工具都有
    3. 国内厂商也好沟通
    4. 满足我们的需求
    然后开始整合资料,整合资源
    ESP8266完全教程资源包

乐鑫、ESP8266芯片

源代码
两种配置模式:
1.Ap模式:

AP 是 (Wireless) AccessPoint 的缩写,即 (无线) 访问接入点。简单来讲就像是无线路由器一样,设备打开后进入 AP 模式,在手机的网络列表里面,可以搜索到类似 TPLINK_XXX 的名字(SSID)

2.SmartConfig模式
采用UDP广播模式(UDP接收IP地址是255.255.255.255)

esp8266进入混杂、SmartConfig esp8266先scan下AP ,得到AP的相关信息,如工作的channel,然后配置wifi芯片工作在刚才scan到的channel上去接收UDP包,如果没有接收到,继续配置ESP8266工作在另外的channel上,如此循环,直到收到UDP包为止

为什么要提前进行SCAN 下WIFI AP?

为了提高配置效率。假设当前网络中只有两个AP,一个AP工作在CHANEL1,另外个 ap工作在channel13,我们现在需要配置智能硬件连接到AP2 ,就是channel13上,如果不提前scan就需要从1--13扫描浪费时间 就是需要从channel1-chane2---...channnel13一直扫描了,如果扫描了AP,芯片马上从AP CHANNNEL1 到channel13加快获取到UDP包;

扩展

通过Yeelink提供的数据接口,用户可以把自己的传感器通过互联网接入Yeelink物联网云平台,从而实现随时随地获取传感器数据,为一些智能家居设备接入互联网提供了物联网云平台支持。

调试过程:

这个在谷歌找到的关于ti的Smartconfig的工作原理
CC3000 Smart Config - transmitting SSID and keyphrase
How does TI CC3000 wifi smart config work?
这两篇写的很详细,下面开始是一篇文章的翻译,水准别看了就看个大概吧。

注意:TI Android library和Java applet库生成了如上所述的值,奇怪的是,TI iOS库产生了稍微不同的排序(这显然不会影响CC3000解码数据的能力)。这种差异可以在后面的示例数据长度转储中看到。

请注意,需要支持的包长度范围在网络的最大传输单元(MTU)上有一个下界。目前,智能配置客户端应用程序期望MTU达到1500或更高(这是任何正常网络的合理期望)。

注意:根据IEEE标准802.11i-2004,附件H.4.1,用户可以将键作为64个十六进制数字的字符串(或者作为可打印ASCII字符的口令)输入。大概WEP和WPA规定了类似的限制。SSID必须是1到32字节之间的序列,没有指定的字符集(在这个StackOverflow答案中有更多的细节),以及如何将SSID显示给最终用户应用程序(但是许多路由器显然只接受SSID的可打印ASCII字符)。

注意,包含i的高nibble的值是在包含i的低nibble之前生成的,并注意到caret,即。这里使用“^”,意味着XOR,而不是权力。

对于每4位nibble,我们生成一个值,它的下4位由nibble本身组成,其较高的4位包含了当前序列号和之前使用的nibble值的值。然后我们加上上面提到的常数C,即593,以这种方式生成的每个值,这就变成了编码这样一个值的包的长度。

注意,4位约束意味着我们只使用当前序号的下4位,即如果序号S在15以上,那么我们使用S % 16。


注意:在一个使用AP的网络中,所有的流量都通过AP,所以即使一个人选择了一个机器的地址,而不是AP,流量仍然会被AP接收并通过AP重新传输到目标机器。如果您尝试使用CC3000,这不会引起问题,但它确实意味着毫无意义地复制了流量。
智能配置库的详细信息。
上面的部分覆盖的核心智能配置是如何工作的,下面介绍了TI的智能配置Java applet库的详细资料,不要立即似乎有关——他们可能会遗留下来的开发过程,或者他们可能刚刚没有清理掉与非默认的功能,可以使用如果某个CC3000设备配置在一个特定的方式。

注:上面提到的港口数字15000没有被TI注册,实际上属于一个名为hydap的合法服务,该服务已由HYPACK Inc.与IANA注册。这对任何人来说都不是问题。

1381084544.032552000 1399 <----- SSID tag
1381084544.033572000 35 <----- SSID length + 28
1381084544.033589000 3 <--+-- separator
1381084544.033594000 23 <--'
1381084544.033667000 597 <----- 'M' hi-nibble
1381084544.033675000 3 <--+-- separator
1381084544.033723000 23 <--'
1381084544.034369000 686 <----- 'M' lo-nibble
1381084544.035385000 3 <--+-- separator
1381084544.036271000 23 <--'
1381084544.036448000 840 <----- 'y' hi-nibble
1381084544.036467000 3 <--+-- separator
1381084544.036481000 23 <--'
1381084544.036541000 666 <----- 'y' lo-nibble
1381084544.037262000 3 <--+-- separator
1381084544.037271000 23 <--'
1381084544.037496000 806 <----- 'P' hi-nibble
1381084544.038019000 3 <--+-- separator
1381084544.038032000 23 <--'
1381084544.038097000 593 <----- 'P' lo-nibble
1381084544.043096000 3 <--+-- separator
1381084544.044209000 23 <--'
1381084544.044785000 695 <----- 'l' hi-nibble
1381084544.045422000 3 <--+-- separator
1381084544.045855000 23 <--'
1381084544.048359000 621 <----- 'l' lo-nibble
1381084544.049327000 3 <--+-- separator
1381084544.049347000 23 <--'
1381084544.049406000 663 <----- 'a' hi-nibble
1381084544.049412000 3 <--+-- separator
1381084544.049416000 23 <--'
1381084544.049568000 834 <----- 'a' lo-nibble
1381084544.050052000 3 <--+-- separator
1381084544.050067000 23 <--'
1381084544.050808000 775 <----- 'c' hi-nibble
1381084544.051463000 3 <--+-- separator
1381084544.052082000 23 <--'
1381084544.055415000 804 <----- 'c' lo-nibble
1381084544.056319000 3 <--+-- separator
1381084544.056334000 23 <--'
1381084544.056398000 839 <----- 'e' hi-nibble
1381084544.056404000 3 <--+-- separator
1381084544.056407000 23 <--'
1381084544.056644000 774 <----- 'e' lo-nibble
1381084544.058021000 3 <--+-- separator
1381084544.058034000 23 <--'
1381084544.059236000 1459 <----- passphrase tag
1381084544.059252000 35 <----- passphrase length + 28
1381084544.059255000 3 <--+-- separator
1381084544.059258000 23 <--'
1381084544.059261000 597 <----- 'L' hi-nibble
1381084544.059937000 3 <--+-- separator
1381084544.059949000 23 <--'
1381084544.060043000 685 <----- 'L' lo-nibble
1381084544.060723000 3 <--+-- separator
1381084544.060729000 23 <--'
1381084544.060884000 823 <----- 'e' hi-nibble
1381084544.061407000 3 <--+-- separator
1381084544.061411000 23 <--'
1381084544.061954000 678 <----- 'e' lo-nibble
1381084544.062651000 3 <--+-- separator
1381084544.062709000 23 <--'
1381084544.063217000 616 <----- 't' hi-nibble
1381084544.063696000 3 <--+-- separator
1381084544.063699000 23 <--'
1381084544.064344000 629 <----- 't' lo-nibble
1381084544.064893000 3 <--+-- separator
1381084544.064897000 23 <--'
1381084544.065561000 629 <----- 'M' hi-nibble
1381084544.066131000 3 <--+-- separator
1381084544.066221000 23 <--'
1381084544.066947000 654 <----- 'M' lo-nibble
1381084544.066955000 3 <--+-- separator
1381084544.067371000 23 <--'
1381084544.067491000 679 <----- 'e' hi-nibble
1381084544.067871000 3 <--+-- separator
1381084544.068325000 23 <--'
1381084544.069089000 838 <----- 'e' lo-nibble
1381084544.069097000 3 <--+-- separator
1381084544.069593000 23 <--'
1381084544.069711000 837 <----- 'I' hi-nibble
1381084544.070191000 3 <--+-- separator
1381084544.070656000 23 <--'
1381084544.074244000 842 <----- 'I' lo-nibble
1381084544.074259000 3 <--+-- separator
1381084544.075225000 23 <--'
1381084544.075286000 679 <----- 'n' hi-nibble
1381084544.075291000 3 <--+-- separator
1381084544.075293000 23 <--'
1381084544.075521000 783 <----- 'n' lo-nibble
1381084544.075533000 3 <--+-- separator
1381084544.076058000 23 <--'
-------------------------- No delay on Android, 100ms delay with Java applet library, then repeat from start again.
1381084544.076246000 1399 <----- SSID tag
1381084544.076850000 35 <----- SSID length + 28
...

1381085051.154799000 3 <--+-- separator 1
1381085051.159414000 23 <--'
1381085051.164143000 3 <--+-- separator 2
1381085051.170050000 23 <--'
1381085051.174861000 3 <--+-- separator 3
1381085051.179503000 23 <--'
1381085051.185282000 3 <--+-- separator 4
1381085051.190274000 23 <--'
1381085051.195296000 3 <--+-- separator 5
1381085051.200047000 23 <--'
1381085051.206394000 3 <--+-- separator 6
1381085051.211076000 23 <--'
1381085051.215383000 3 <--+-- separator 7
1381085051.225363500 23 <--'
1381085051.235344000 3 <--+-- separator 8
1381085051.235459000 23 <--'
1381085051.236902000 3 <--+-- separator 9
1381085051.241718000 23 <--'
1381085051.249366000 3 <--+-- separator 10
1381085051.253099000 23 <--'
1381085051.257767000 1399 <----- SSID tag
1381085051.262315500 35 <----- SSID length + 28
1381085051.266864000 597 <----- 'M' hi-nibble
1381085051.273117000 686 <----- 'M' lo-nibble
1381085051.278023500 840 <----- 'y' hi-nibble
1381085051.282930000 666 <----- 'y' lo-nibble
1381085051.291178000 806 <----- 'P' hi-nibble
1381085051.294688000 593 <----- 'P' lo-nibble
1381085051.299266000 695 <----- 'l' hi-nibble
1381085051.308603000 621 <----- 'l' lo-nibble
1381085051.311723000 663 <----- 'a' hi-nibble
1381085051.315706000 834 <----- 'a' lo-nibble
1381085051.321567000 775 <----- 'c' hi-nibble
1381085051.326156000 804 <----- 'c' lo-nibble
1381085051.332654000 839 <----- 'e' hi-nibble
1381085051.337025000 774 <----- 'e' lo-nibble
1381085051.342818000 1459 <----- passphrase tag
1381085051.346519000 35 <----- passphrase length + 28
1381085051.353083000 597 <----- 'L' hi-nibble
1381085051.359196000 685 <----- 'L' lo-nibble
1381085051.362984000 823 <----- 'e' hi-nibble
1381085051.366772000 678 <----- 'e' lo-nibble
1381085051.373192000 616 <----- 't' hi-nibble
1381085051.382117000 629 <----- 't' lo-nibble
1381085051.386131000 629 <----- 'M' hi-nibble
1381085051.390145000 654 <----- 'M' lo-nibble
1381085051.393997000 679 <----- 'e' hi-nibble
1381085051.400047000 838 <----- 'e' lo-nibble
1381085051.404880000 837 <----- 'I' hi-nibble
1381085051.412003000 842 <----- 'I' lo-nibble
1381085051.414365000 679 <----- 'n' hi-nibble
1381085051.420336000 783 <----- 'n' lo-nibble
--------------------------- No delay then repeat from start again.
1381085051.432048500 3 <--+-- separator 1
1381085051.443761000 23 <--'

$ tshark -i en0 -I -w output.pcap

$ tshark -r output.pcap -o 'wlan.enable_decryption:TRUE'
-Y 'wlan.fc.retry == 0 && !icmp && udp && ip.src == 192.168.1.177 && ip.dst == 192.168.1.1 && udp.dstport == 15000'
-T fields -e frame.time_epoch -e data.len | head -n 512

注意,我排除了icmp包,这些是控制包,可以包含与UDP过滤器匹配的嵌入式UDP数据包。在我们的例子中,生成icmp包,告诉我们我们发送的数据包是不可到达的。wlan.fc。重试过滤器我也不排除重传数据包——我将在后面的帖子中讨论这个。

"wpa-pwd","LetMeIn:MyPlace"

上一篇 下一篇

猜你喜欢

热点阅读