本帖最后由 lin704932121 于 2017-1-27 10:18 编辑
智能家居现在还处于发展阶段,由于大部分智能设备不具备人机交互界面,不能输入WIFI的密码。因此,想要让智能设备联网,首先要解决智能设备如何获取WIFI密码的问题。
目前流行的wifi配置模式一般有以下2种:
1:智能硬件处于AP模式,手机用于station模式,手机连接智能插座的AP后组成局域网,手机发送需要连接路由的SSID及密码至智能插座,智能硬件主动去连接指定路由后,完成连接
2:智能连接(smarlink)模式:智能硬件处于监听模式下,监听802.11网络中的所有报文;手机APP将SSID和密码编码到UDP报文中,通过广播包或组播报发送,智能硬件接收到UDP报文后解码,得到正确的SSID和密码,然后主动连接指定SSID的路由,完成连接。
一、WIFI智能连接原理
这里介绍一下第二种智能连接(smarlink)模式:手机通过发送UDP组播数据包来配置智能设备。如下图所示,802.11帧头部包含有AP的MAC地址(RA域)、源MAC地址(SA/TA域)以及目的MAC地址(DA域)。虽然WIFI数据包是加密的,但是802.11帧头部是没有加密的,这就给了我们通过编码目的MAC地址(DA域)来传输数据的机会。
如何编码目的MAC地址呢?组播的目的MAC地址与目的IP地址有映射关系:将MAC地址的前25位设定为01:00:5e,而MAC地址的后23位对应组播IP地址的位。其中组播地址是保留的D类地址从224.0.0.0-239.255.255.255。如下图所示,假设我们要传输AP_NAME这几个字符给智能设备,将AP_NAME分四次发送。
第一次发送,将UDP组播IP地址设置为234.0.'A'.'P',对应的MAC地址为01:00:5E:00:'A':'P',发送的数据包长度为100。
第二次发送,将UDP组播IP地址设置为234.0.'_'.'N',对应的MAC地址为01:00:5E:00:'_':'N',发送的数据包长度为101。
第三次发送,将UDP组播IP地址设置为234.0.'A'.'M',对应的MAC地址为01:00:5E:00:'A':'M',发送的数据包长度为102。
第四次发送,将UDP组播IP地址设置为234.0.'E'.'\0',对应的MAC地址为01:00:5E:00:'E':'\0',发送的数据包长度为103。
发送的数据包长度每次加一。数据包长度可以用来作为数据索引,从而防止接收到的802.11帧次序不同的情况。
二、智能连接的使用
这个无线网卡驱动支持监听模式,因此我们可以编写智能连接的程序。
1、将smartlink.c文件导入MDK工程。
2、在app.c中AppTaskStart()函数里添加智能连接程序的初始化函数smartlink_init()
3、在无线网卡的热插拔回调函数ralink_hotplug_call_back()里,添加智能连接的启动和停止函数smartlink_start()、smartlink_stop()。
4、重新编译工程。
以上修改已经打包好成附件,将附件uCOS-III_SmartLink.rar解压到EvalBoards\ST\STM32469I-Discovery目录下,打开工程文件EvalBoards\ST\STM32469I-Discovery\uCOS-III_SmartLink\KeilMDK\uCOS-III.uvproj进行编译即可。
安装手机端Android智能连接应用(见附件),连接指定热点后,打开智能连接应用。如下图所示,SSID里会显示当前连接的WIFI名称,输入密码后点击”开始智能连接“按钮,应用程序将会一直发送包含SSID和密码的UDP组播数据包。
设备端的程序会不停地切换无线网卡的信道,来监听802.11数据包。在串口里看到以下信息:
wireless_send_event[0x8c02][0x217] (RT2860) BSS(ra0) Scanning
smartlink set STA to monitor mode
smartlink setup packet detected
4 of 77 bytes received
10 of 77 bytes received
12 of 77 bytes received
14 of 77 bytes received
16 of 77 bytes received
┋
68 of 77 bytes received
70 of 77 bytes received
72 of 77 bytes received
74 of 77 bytes received
76 of 77 bytes received
All data received
SSID: NetWork_Main
PSK : guodanian
smartlink try to connect NetWork_Main
wireless_send_event[0x8c02][0x217] (RT2860) BSS(ra0) Scanning
wireless_send_event[0x8c02][0x211] (RT2860) BSS(ra0) scan completed
wireless_send_event[0x8c02][0x200] (RT2860) BSS(ra0) had associated successfully
wireless_send_event[0x8c02][0x210] (RT2860) STA(a8:57:4e:83:f9:28) disconnects with our wireless client
wireless_send_event[0x8c02][0x20f] (RT2860) STA(a8:57:4e:83:f9:28) connects with our wireless client
dhcp_start...
DHCP IP:192.168.2.101
DHCP GW:192.168.2.1
DHCP MASK:255.255.255.0
设备一旦在某个信道监听到了数据,将会保持在该信道,直到获得所有剩余数据。设备获得了AP的SSID和密码后,将会切换到STA模式来连接AP,并通过DHCP来获取IP地址。
|