wifi类物联产品配网之web

文章介绍了WiFi类物联产品使用Web配网的方法,包括设备初始化进入AP模式,创建热点并启动HTTP服务器,用户通过连接设备热点并在网页上输入WiFiSSID和密码进行配网。代码示例展示了如何监听和处理GET、POST请求,以及在接收到网络信息后设备如何连接选定的WiFi网络。
摘要由CSDN通过智能技术生成

wifi类物联产品配网之web

上接wifi类物联产品配网前言

web配网介绍

web主要连接设备建立的wifi 热点后,以网页的形式,让用户输入wifi ssid和密码,点击提交给设备进行配网。

优点:

不受wifi频段限制。

缺点:

需要用户手动连接设备wifi热点,手动输入wifi ssid和密码。

web配网实现

  1. wifi设备初始化进入AP模式,热点ap信息,然后启动http服务器,监听get和post请求;主要代码如下:

    //建立wifi热点,启动http服务器,监听get和post请求;
    void wifi_webConfigNet()
    {
        int i = 0, key;
        const char *ssid = "qytech";
        const char *password = "12345678";
        
        WiFi.forceSleepWake();
        WiFi.disconnect();
        WiFi.enableSTA(false);
        WiFi.setAutoConnect(true);
        WiFi.setAutoReconnect(true);
        WiFi.mode(WIFI_AP_STA);
        WiFi.softAP(ssid, password);
        IPAddress ipAddr = WiFi.softAPIP();
        Serial.println("htmlConfig ,and enter AP mode,wifi info:");
        Serial.printf("ssid:%s\r\n,password:%s\r\n", ssid, password);
        Serial.print("IP address:");
        Serial.println(ipAddr);
    
        if (MDNS.begin("esp8266"))
        {
            Serial.println("MDNS started");
        }
    
        server.on("/", response_index_page);
        server.on("/handleWifiInfo", HTTP_GET, request_handleWifiInfo);
        server.onNotFound(response_404_error);
    
        server.begin();
        Serial.println(">>HTTP server started");
        while (!httpSeverClose)
        {
            ESP.wdtFeed();
            server.handleClient();
            MDNS.update();
        }
        Serial.println(">>HTTP server stoped");
    }
    
    //对应请求响应server.on("/", response_index_page);
    static void response_index_page()
    {
        loadData(wifiConfig_jsonFile, WIFICONFIG, NULL);
        String htmlStr;
        if (readFile("/index.html", &htmlStr))
        {
            htmlStr.replace("{version}", firmwareVersion);
            htmlStr.replace("{ssid}", WiFi.SSID());
            htmlStr.replace("{password}", WiFi.psk());
            server.send(200, "text/html", htmlStr);
        }
    }
    
    //返回handleWifiInfo请求处理结果
    static void response_result_page()
    {
        loadData(wifiConfig_jsonFile, WIFICONFIG, NULL);
        String htmlStr;
        if (readFile("/result.html", &htmlStr))
        {
            htmlStr.replace("{version}", firmwareVersion);
            htmlStr.replace("{ssid}", wifiConfig.ssid);
            htmlStr.replace("{password}", wifiConfig.password);
            htmlStr.replace("{result}", mqttConfig.deviceId+",Config save,ready to reboot after 10s.");
            server.send(200, "text/html", htmlStr);
        }
    }
    
    //对应请求响应server.on("/handleWifiInfo", HTTP_GET, request_handleWifiInfo);
    static void request_handleWifiInfo()
    {
        String ssid = "";
        String password = "";
        ssid = server.arg("ssid");
        password = server.arg("password");
        ssid.trim();
        password.trim();
        if ((!ssid.isEmpty()) and (!password.isEmpty()))
        {
            Serial.println("save web wifi config info:");
            Serial.printf("ssid:%s,password:%s\r\n", ssid.c_str(), password.c_str());
            wifiConfig.ssid = ssid;
            wifiConfig.password = password;
            wifiConfig.configNetType = webConfigNet;
            response_result_page();
        }
        else
        {
            Serial.println("ssid or password is null");
            String htmlStr = "406 error,ssid or password is null\n\n";
            htmlStr += "server uri: ";
            htmlStr += server.uri();
            htmlStr += "\nmethod: ";
            htmlStr += (server.method() == HTTP_GET) ? "GET" : "POST";
            htmlStr += "\nargs: ";
            htmlStr += server.args();
            htmlStr += "\n";
            for (uint8_t i = 0; i < server.args(); i++)
            {
                htmlStr += " " + server.argName(i) + ": " + server.arg(i) + "\n";
            }
            server.send(406, "text/plain", htmlStr);
        }
    }
    
    //对应错误页server.onNotFound(response_404_error);
    static void response_404_error()
    {
        String htmlStr = "404 error,request file not exist\n\n";
        htmlStr += "server uri: ";
        htmlStr += server.uri();
        htmlStr += "\nmethod: ";
        htmlStr += (server.method() == HTTP_GET) ? "GET" : "POST";
        htmlStr += "\nargs: ";
        htmlStr += server.args();
        htmlStr += "\n";
        for (uint8_t i = 0; i < server.args(); i++)
        {
            htmlStr += " " + server.argName(i) + ": " + server.arg(i) + "\n";
        }
        server.send(404, "text/plain", htmlStr);
    }
    
  2. 用户连接上边的qytech后,在浏览器端输入192.168.4.1,然后在返回的页面中输入wifi名称,密码点击提交

    image-20230213092045813

  3. 设备接收到配网数据,然后连接该wifi,主要代码:

     
       WiFi.persistent(true);
       WiFi.begin(wifiConfig.ssid, wifiConfig.password);
        while (WiFi.status() != WL_CONNECTED)
        {
            count++;
            if (count > 10)
            {
                Serial.println("\r\n>>wifi connect fail");
                return false;
            }
    
            ESP.wdtFeed();
            Serial.print(".");
            delay(500);
        }
         wifiConnected = true;
        Serial.println("\r\n>>wifi connect success");
       
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之雅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值