认识“盲连接”smartconfig
使用微信扫一扫功能给esp8266模块配网
ESP8266 -12F
Arduino IDE (版本要大于1.6.7)
wechat application 微信应用
接入微信硬件功能的微信测试号,或者是一个二维码
中等
在物联网领域内,smartconfig的出现让硬件接入互联网更加的快捷与方便,是物联网发展的一大突破。那么什么是smartconfig呢?
smartconfig其实是一种让设备联网的方式,生活中其实大家都经常接触到的。一般设备连接网络有三种方式:
第一个种是:设备通过界面显示,访问web页面进行配置设备需要连接的wifi的账号和密码
这种方式的优点是可以客观形象直接的配置设备,但是缺点就是需要设备带有一个可以显示ui界面的模块以及一个用户交互模块,正因为如此,导致了设备的便携性变差,灵活性与适用性大大的下降。我相信,如果用户要使用该设备,都会觉得这种方式的缺点在更大的程度上遮盖了优点,使用户觉得用起来十分的不方便。
第二种是:开发设备的时候,直接把wifi的账号与密码写入到设备的固件
这种方式其实根本不适用于实际生产,最多只是适合爱好者开发玩玩。要知道并不是每一个用户都会开发固件,改写设备的。
第三种是:通过smartconfig方式连接网络
这种方式其实生活中已经在用到的了,如果大家家里有网络摄像头、天猫精灵智能音箱等物联网设备的话,相信大家都已经体现过这种方式带来的优越了。在使用网络摄像头的时候是不是在给摄像头配置网络的时候打开预安装的app,当摄像头进入配网模式下,一般是有LED闪烁提示下,在app下填写wifi的账号与密码,点击配置即可让网络摄像头连接wifi。是不是觉得很神奇又实用?对了,这种方式就是smartconfig连接方式。
那么,smartconfig连接方式的原理是什么呢:
其实就是手机APP应用或微信应用发送包含WiFi热点账号与WiFi密码的UDP广播包或者组播包,物联网设备的WiFi芯片可以在空中抓取到到该UDP包,结合UDP的数据包形式,可以通过接收到的UDP包解密出WiFi热点的用户名密码,wifi芯片基于wifi账号密码连接上wifi热点即可。
引入esp8266库文件
#include
设置esp8266的网络模式
WiFi.mode(WIFI_STA);
WIFI_STA:设置为STA 站点模式,即只能连接wifi热点而不可以发射wifi热点
若为AP模式,则为只能发射wifi热点,而不能连接wifi
开启智能配网模式
WiFi.beginSmartConfig();
检测smartconfig抓取是否成功
WiFi.smartConfigDone();
获取esp8266抓取UDP数据包之后解密得到的wifi账号与密码
WiFi.SSID();
WiFi.psk();
当smartconfig成功的获取到wifi的账号与密码的时候,esp8266模块会自动的连接上该wifi
WiFi.stopSmartConfig();
结合esp8266的自带按钮与LED监控wifi连接情况
#define STATE_BLUE 13
#define STATE_GREEN 12
#define STATE_RED 15
#define AIRKISS 4
int buttonstate = digitalRead(pin);
按钮去抖动检测按钮是否按下,当按钮按下的时候进行smartconfig模式并有自带的三色灯LED显示smartconfig的状态
void waitKey()
{
char keyCnt = 0;
unsigned long preTick = millis();
unsigned long preTick2 = millis();
int num = 0;
while (1)
{
ESP.wdtFeed();
if (millis() - preTick < 10 ) continue;
preTick = millis();
num++;
if (num % 10 == 0)
{
ledState = !ledState;
digitalWrite(STATE_GREEN, ledState);
Serial.print(".");
}
if (keyCnt >= 200)
{ //长按
keyCnt = 0;
}
else if (keyCnt >= 5 && digitalRead(AIRKISS) == 0)
{ //短按
keyCnt = 0;
smartconfig();
}
if (digitalRead(AIRKISS) == 1) keyCnt++;
else
keyCnt = 0;
if (millis() - preTick2 > 5 * 1000) break;
}
整合代码
#include
#include
#include
#define STATE_BLUE 13
#define STATE_GREEN 12
#define STATE_RED 15
#define AIRKISS 4
int led_state = HIGH;
bool ledState = 0;
void smartconfig()
{
ESP.eraseConfig();
flipper.attach(0.3, flip);
WiFi.mode(WIFI_STA);
Serial.println("\rWait for smartconfig");
WiFi.stopSmartConfig();
WiFi.beginSmartConfig();
while (1)
{
ESP.wdtFeed();
delay(300);
if (WiFi.smartConfigDone())
{
Serial.println("smartconfig success");
Serial.println("SSID: " + WiFi.SSID());
Serial.println("PSW: " + WiFi.psk());
delay(10000);
WiFi.stopSmartConfig();
flipper.detach();
break;
}
}
}
void waitKey()
{
char keyCnt = 0;
unsigned long preTick = millis();
unsigned long preTick2 = millis();
int num = 0;
while (1)
{
ESP.wdtFeed();
if (millis() - preTick < 10 ) continue;
preTick = millis();
num++;
if (num % 10 == 0)
{
ledState = !ledState;
digitalWrite(STATE_GREEN, ledState);
Serial.print(".");
}
if (keyCnt >= 200)
{ //长按
keyCnt = 0;
}
else if (keyCnt >= 5 && digitalRead(AIRKISS) == 0)
{ //短按
keyCnt = 0;
smartconfig();
}
if (digitalRead(AIRKISS) == 1) keyCnt++;
else
keyCnt = 0;
if (millis() - preTick2 > 5 * 1000) break;
}
void setup() {
Serial.begin(9600);
pinMode(AIRKISS, INPUT);
pinMode(STATE_GREEN, OUTPUT);
pinMode(STATE_BLUE, OUTPUT);
pinMode(STATE_RED, OUTPUT);
waitKey();
while (1)
{
if (WiFi.status() == WL_CONNECTED) break;
}
}
void loop(){
}
1.打开Arduino IDE
2.选择对应的开发板,此步骤可以参照:**你的wifi我作主----DIY一个wifi杀手 **
3.上传程序
注意:上传程序的时候,需要按一下esp8266-12f模块的RST键
4.测试效果:
手机连接上wifi
打开微信应用,扫一扫以下二维码
出现配置界面
点击开始配置
配置界面会直接从手机的wifi设置获取到现在已经连接上的wifi账号,手动输入wifi的密码,点击连接
同时打开arduino IDE的串口监视框,可以看到esp8266获取到wifi账号密码并连接上wifi了