smartconfig技术研究总结
一 背景:
智能家居/家电现阶段还处于普及阶段,由于家庭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分析
实际调用过程
/******************************************************************************
* Copyright 2013-2014 Espressif Systems (Wuxi)
*
* FileName: user_main.c
*
* Description: entry file of user application
*
* Modification history:
* 2014/1/1, v1.0 create this file.
*******************************************************************************/
#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下载地址: