一 背景:
智能家居/家電現階段還處于普及階段,由于家庭wifi網絡的普及,目前普遍采用wifi與路由器完成連接配接,與手機/雲端進行資料互動.
智能硬體,如智能插座,智能空調,智能空氣淨化器,智能燈泡,智能門鎖由于不具備人機互動界面,不能像電腦一樣的搜尋/選擇指定路由器,輸入連接配接SSID和密碼的界面,是以必須先解決正确連接配接路由問題;
二 解決方法
目前流行的wifi配置模式一般有以下2種:
方案一 softAP方案:
硬體處于AP模式,手機用于station模式,手機連接配接智能硬體的AP後組成區域網路,手機發送需要連接配接路由的SSID和密碼至智能硬體,智能硬體主動去連接配接指定路由後,完成連接配接。
AP模式需要手動切換手機wifi連接配接的網絡,先連接配接智能硬體的AP網絡,配置完成後再恢複連接配接正常wifi網絡.有一定的複雜性;
方案二、smartconfig(一鍵配置)方案:
1.簡介:
是一步式Wi-Fi設定過程,允許多個家用裝置快速高效地連接配接到Wi-Fi網絡。考慮到應用通常沒有用于輸入Wi-Fi網絡名稱和密碼的顯示屏或鍵盤,SmartConfig技術為最終使用者提供了将其裝置輕松連接配接到接入點的能力。通過簡單的SmartConfig技術為最終使用者提供了将其裝置輕松連接配接到接入點的能力。通過簡單的SmartConfig技術接口,消費者隻需要利用簡單的應用便可以使用iOS或者Andriod智能手機/平闆電腦或家庭PC連接配接到網絡。
2.使用者如何識别裝置:
2.1 小米的Yeelight智能彩燈使用掃描ssid的方法
米家app是通過掃描wifi熱點的方法擷取到的,我将華為路由器A1的2.4Gssid修改為了yeelink-light-color1_miapbe58結果手機顯示如下:
2.2京東微聯的智能插座使用掃描二維碼的方式識别裝置
①解析二維碼生成的url為http://smartcloud.jd.com/download?d=RldBU1VC
将d= RldBU1VC去掉,然後在手機浏覽器中輸入http://smartcloud.jd.com/download
直接就可以打開小京魚app的下載下傳界面了
②将http://smartcloud.jd.com/download通過草料二維碼生成器https://cli.im/生成一個二維碼
通過浏覽器掃描照樣可以下載下傳小京魚app但是通過小京魚app掃描這個二維碼顯示如下圖所示
③将http://smartcloud.jd.com/download?d=RldBU1VC通過草料二維碼生成器生成一個二維碼
通過浏覽器掃描可以下載下傳小京魚app并且通過小京魚app掃描這個二維碼同樣會顯示如下
3.技術原理:
①手機向區域網路廣播特殊的資料包,其中包含路由器的ssid,bssid,password等加密資料
②智能硬體開啟混雜模式,從空中抓取這種特殊的資料包。解析其中的資料。擷取到ssid和密碼後,連接配接這個熱點。
③ 連接配接成功後。這個時候手機與智能硬體就處于同一個區域網路中,智能硬體會向指定端口廣播一組特殊的資料包,
手機監聽該端口的資料,收到之後表示配置成功。
Smartconfig廠家支援
官方并沒有公開smartconfig 智能硬體端底層源碼,不過已經公開手機端源碼。我們可以擷取相關協定,打造自己的apk。
抓包分析驗證結果
抓包擷取到的資料
①米家智能彩燈使用的是多點傳播技術 多點傳播ip為
②京東智能插座使用的是廣播技術 廣播ip為
③米家智能彩燈 需要特别說明一下
首先會使用upnp發現裝置
可能某些智能家居是通過這種方式發現的,但是智能彩燈是通過掃描AP的ssid擷取的
Smartconfig以esp8266為例sdk分析
實際調用過程
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#include "smartconfig.h"
void ICACHE_FLASH_ATTR
smartconfig_done(sc_status status, void *pdata)
{
switch(status) {
case SC_STATUS_WAIT:
os_printf("SC_STATUS_WAIT\n");
break;
case SC_STATUS_FIND_CHANNEL:
os_printf("SC_STATUS_FIND_CHANNEL\n");
break;
case SC_STATUS_GETTING_SSID_PSWD:
os_printf("SC_STATUS_GETTING_SSID_PSWD\n");
sc_type *type = pdata;
if (*type == SC_TYPE_ESPTOUCH) {
os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
} else {
os_printf("SC_TYPE:SC_TYPE_AIRKISS\n");
}
break;
case SC_STATUS_LINK:
os_printf("SC_STATUS_LINK\n");
struct station_config *sta_conf = pdata;
wifi_station_set_config(sta_conf);
wifi_station_disconnect();
wifi_station_connect();
break;
case SC_STATUS_LINK_OVER:
os_printf("SC_STATUS_LINK_OVER\n");
if (pdata != NULL) {
uint8 phone_ip[4] = {0};
os_memcpy(phone_ip, (uint8*)pdata, 4);
os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]);
}
smartconfig_stop();
break;
}
}
void user_rf_pre_init(void)
{
}
void user_init(void)
{
os_printf("SDK version:%s\n", system_get_sdk_version());
smartconfig_set_type(SC_TYPE_ESPTOUCH); //SC_TYPE_ESPTOUCH,SC_TYPE_AIRKISS,SC_TYPE_ESPTOUCH_AIRKISS
wifi_set_opmode(STATION_MODE);
smartconfig_start(smartconfig_done);
}
各廠家sdk下載下傳位址:
https://download.csdn.net/download/caofengtao1314/10963169