What Will I Learn?
认识“盲连接”smartconfig
使用微信扫一扫功能给esp8266模块配网
Requirements
ESP8266 -12F
Arduino IDE (版本要大于1.6.7)
wechat application 微信应用
接入微信硬件功能的微信测试号,或者是一个二维码
Difficulty
中等
Tutorial Contents
什么是smartconfig
在物联网领域内,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 <ESP8266WiFi.h>
- ESP8266WiFi.h:用于esp8266连接wifi并实现wifi操作功能的有关库文件
设置esp8266的网络模式
WiFi.mode(WIFI_STA);
WIFI_STA:设置为STA 站点模式,即只能连接wifi热点而不可以发射wifi热点
若为AP模式,则为只能发射wifi热点,而不能连接wifi
开启智能配网模式
WiFi.beginSmartConfig();
- beginSmartConfig():开启smartconfig配网模式,开启智能配网模式之前必须要设置为WIFI_STA的网络模式。
- 开启smartconfig模式之后,esp8266模块会自动嗅探UDP广播包,在此时应该进入微信或者app,切入相对应的界面输入wifi的用户名和密码,即可向空中发送UDP广播包,若esp8266模块嗅探到UDP广播包则会自动抓取并按照smartconfig加密协议进行解密。
检测smartconfig抓取是否成功
WiFi.smartConfigDone();
- smartConfigDone():若抓取空中UDP加密数据包成功,则该函数会返回TRUE,若失败则返回FALSE
获取esp8266抓取UDP数据包之后解密得到的wifi账号与密码
WiFi.SSID(); WiFi.psk();
- WiFi.SSID():返回解密得到的wifi的账号
- WiFi.psk():返回解密得到的wifi密码
当smartconfig成功的获取到wifi的账号与密码的时候,esp8266模块会自动的连接上该wifi
WiFi.stopSmartConfig();
- stopSmartConfig():退出smartconfig模式
结合esp8266的自带按钮与LED监控wifi连接情况
#define STATE_BLUE 13 #define STATE_GREEN 12 #define STATE_RED 15 #define AIRKISS 4
int buttonstate = digitalRead(pin);
- digitalRead():获取连接数字引脚的按钮状态
- STATE_BLUE:esp8266-12f小黑板自带三色灯的蓝灯LED引脚
- STATE_GREEN:esp8266-12f小黑板自带三色灯的绿灯LED引脚
- STATE_RED:esp8266-12f小黑板自带三色灯的红灯LED引脚
- AIRKISS:esp8266-12f小黑板自带的按钮引脚
按钮去抖动检测按钮是否按下,当按钮按下的时候进行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; }
- millis():启动计时器
- keyCnt >= 200:通过计时器达到按钮去抖动的效果,当持续时间大于200的时候,判断这个时候按钮为长按
- keyCnt >= 5:当持续时间大于5而按钮引脚处于低电平的时候,判断这个时候按钮为短按。在短按按钮时,触发,进入smartconfig模式配置wifi
- millis() - preTick2 > 5 * 1000:当多次没检测到按钮被按下,则退出按钮检测模式,进入正常运行状态
- ESP.wdtFeed():由于需要计时,先对esp的看门狗进行“喂狗”操作
整合代码
#include <Ticker.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #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(){ }
烧写上传到ESP8266模块
1.打开Arduino IDE
2.选择对应的开发板,此步骤可以参照:**你的wifi我作主----DIY一个wifi杀手 **
3.上传程序
注意:上传程序的时候,需要按一下esp8266-12f模块的RST键
4.测试效果:
手机连接上wifi
打开微信应用,扫一扫以下二维码
出现配置界面
点击开始配置
配置界面会直接从手机的wifi设置获取到现在已经连接上的wifi账号,手动输入wifi的密码,点击连接
同时打开arduino IDE的串口监视框,可以看到esp8266获取到wifi账号密码并连接上wifi了
Posted on Utopian.io - Rewarding Open Source Contributors
@cha0s0000, No matter approved or not, I upvote and support you.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Thank you so much!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Thank you for the contribution. It has been approved.
You can contact us on Discord.
[utopian-moderator]
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hey @cha0s0000 I am @utopian-io. I have just upvoted you!
Achievements
Suggestions
Get Noticed!
Community-Driven Witness!
I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!
Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit