esp8266 在sta模式下,需要实现联网,需要提供WIFI的账号和密码
网上有 smartconfig 这种
我想实现自己的一种方式
1, 先启动ap-sta 模式
2, 对外提供AP,
3. 对外提供一个webserver ,并提供一个可以输入WIFI 的账号和密码的网页
4. 对外提供一个webserver接口,接收 wifi的账号和密码
5. 内置一个函数,接收到账号和密码后,链接到该WIFI
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
int lighttime = 0;
ESP8266WebServer webServer(80);
//初始化
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//定义io口为输出,简易的esp8266,只有0端口,其他的esp8266会有多个端口
pinMode(0, OUTPUT);
//定义esp8266的默认led灯
pinMode(LED_BUILTIN, OUTPUT);
//定义io默认为高电平
digitalWrite(0, HIGH);
//定义默认亮
digitalWrite(LED_BUILTIN, LOW);
wifiInit();
webserverInit();
}
//wifi初始化话
void wifiInit() {
WiFi.mode(WIFI_AP_STA); //设置Wi-Fi为AP模式
delay(500);
IPAddress softLocal(192, 168, 1, 1);
IPAddress softGateway(192, 168, 1, 1); //设置网关
IPAddress softSubnet(255, 255, 255, 0);
WiFi.softAPConfig(softLocal, softGateway, softSubnet);
String apName = ("ESP8266-cat11-car" ); // 2 设置WIFI名称
const char *softAPName = apName.c_str();
WiFi.softAP(softAPName, "87654321"); // 3创建wifi 名称 +密码 adminadmin
Serial.println("12345678"); // 5输出WIFI 名称
Serial.println(WiFi.localIP()); // 5输出WIFI 名称
Serial.println(WiFi.softAPIP()); // 5输出WIFI 名称
}
//链接其他wifi
void connectwifi(const char *wifiname, const char *password,const char *force){
lighttime = 500;
if(WiFi.isConnected()){
Serial.println("has WiFi isConnected");
Serial.println(force);
char *a = "1";
if(0 != strcmp(force,a)){
Serial.println("force not 1");
lighttime=0;
return;
}
WiFi.disconnect();
}
WiFi.begin(wifiname, password);
int i = 0;
while (!WiFi.isConnected()) {
i++;
delay(500);
Serial.println("Connecting to WiFi..");
if(i > 20){
lighttime = 1;
Serial.println("Connecting to WiFi.fail.");
return;
}
}
lighttime = 0;
Serial.println("Connecting to WiFi.success.");
Serial.print("是否连接:");
Serial.println(WiFi.isConnected());
Serial.print("本地IP:");
Serial.println(WiFi.localIP());
Serial.print("本地IPv6:");
Serial.print("mac地址:");
Serial.println(WiFi.macAddress());
Serial.print("是否自动连接:");
Serial.println(WiFi.getAutoConnect());
Serial.print("是否自动重连:");
Serial.print("获取模式:");
Serial.println(WiFi.getMode());
Serial.print("获取主机名:");
Serial.print("获取网关IP:");
Serial.println(WiFi.gatewayIP());
Serial.print("dnsIP:");
Serial.println(WiFi.dnsIP());
Serial.print("状态:");
Serial.println(WiFi.status());
}
//led闪烁
void shuklight() {
if(lighttime == 1){
if(digitalRead(LED_BUILTIN) != HIGH){
digitalWrite(LED_BUILTIN, HIGH);
}
return;
}
if(lighttime == 0){
if(digitalRead(LED_BUILTIN) != LOW){
digitalWrite(LED_BUILTIN, LOW);
}
return;
}
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(lighttime);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
delay(lighttime);
}
//webserver 初始化
void webserverInit() {
//api接口处理事件
webServer.on("/wifiApi", htmlwifiApi);
// wifi静态网页初始化
webServer.on("/wifi", htmsetwifi);
//路径找不到的 处理函数
webServer.onNotFound(htmsetwifi);
webServer.begin();
}
void htmlwifiApi() {
Serial.println("wifi-name:" + webServer.arg("wifiname"));
Serial.println("wifi-password:" + webServer.arg("wifipassword"));
webServer.send(200, "text/html", "get:" + webServer.arg("wifiname") + ":," + webServer.arg("wifipassword")+","+webServer.arg("force").c_str());
Serial.println("htmlwifiApi");
connectwifi(webServer.arg("wifiname").c_str(),webServer.arg("wifipassword").c_str(),webServer.arg("force").c_str());
}
void htmsetwifi() {
String h = "<!DOCTYPE html>" +
h += "<html>";
h += "<head>";
h += "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF8\">";
h += "<title>wifi set</title>";
h += "</head>";
h += "<body>";
h += "<div>";
h += "<form action=\"http://" + WiFi.softAPIP().toString() + "/wifiApi\" method=\"get\" style='margin-left:20px;'>";
h += "<h3>WIFI-name:</h3><input type=\"text\" name=\"wifiname\" style='width: 90%;height=30px;font-size: 25px;' /><br>";
h += "<h3>WIFI-password:</h3><input type=\"text\" name=\"wifipassword\" style='width: 90%;height=30px;font-size: 25px;' /><br>";
h += "<h3>WIFI-FORCE:</h3><input type=\"text\" name=\"force\" style='width: 90%;height=30px;font-size: 25px;' value = '0' /><br>";
h += "<input type = 'submit' value=\"Set\" style='height=30px;font-size: 25px;margin-top: 19px;'>";
h += "</form>";
h += "</div>";
h += "</body>";
h += "<html>";
webServer.send(200, "text/html", h);
Serial.println("htmsetwifi");
}
//循环执行程序
void loop() {
// put your main code here, to run repeatedly:
shuklight();
webServer.handleClient();
}