ESP8266 (3),自定义配置网络

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值