引导WiFi凭证进入ESP8266

时间:2017-06-26 13:18:39

标签: wifi esp8266 arduino-esp8266

我怀疑这是一个已经存在" stock"解;我需要部署ESP8266设备,以便能够连接到安全的本地WiFi,但在软件嵌入设备时我无法知道凭据。不知何故,我需要能够拥有最终用户,使用普通计算机(即具有键盘和屏幕的计算机!)" push"将此信息导入设备。首先,我希望他们能够通过无线方式进行此操作,但如果必须以这种方式进行,则可以进行USB /串行连接。

我想我可以"捆绑"整个工具链和源代码,让他们运行一个脚本,提示输入此信息,通过USB构建和上传软件。但考虑到ESP能够充当AP的能力,我无法帮助他们思考更好的方法,并且有人可能已经将其打包了!

(我想一个值得一提的问题是,是否可能存在某种对等配置,这是优选的。我希望ESP与计算机主机具有双向,可靠(即TCP套接字)通信(它并不真正需要互联网访问)。但我并不真正想要任何可能危及该计算机安全性的事情,因此坚持使用最终用户的常规WiFi似乎是最好的选择。)

我应该调查什么?或者有什么建议吗?或者什么关键字搜索会找到答案!?

TIA!

2 个答案:

答案 0 :(得分:3)

简单的方法是使用像WiFiManager这样的第三方库: https://github.com/tzapu/WiFiManager

示例用法:http://www.instructables.com/id/Avoid-Hard-Coding-WiFi-Credentials-on-Your-ESP8266/

答案 1 :(得分:0)

我使用以下解决方案。假设您使用arduino API编程ESP8266

  • 将wifi模式设置为AP_STA

    WiFi.mode(WIFI_AP_STA);

  • 配置softAP(您可以硬编码SSID和密码,也可以使用默认值的配置文件)

    IPAddress apIP(192,168,1,1); WiFi.mode(WIFI_AP); WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0)); WiFi.softAP(apname,密码);

  • (可选)使用DNSServer库设置DNS服务器

  • 使用ESP8266WebServer库设置HTTP服务器

  • 调用服务器对象的onNotFound方法,传递一个闭包搜索所请求的文件,无论是在SPIFF上还是在SD上(或两者都适用于两个接口)并对其进行流式处理。

    server->onNotFound
      (
        [&]()
        {
          if(!handleFileRead(server->uri()))
            server->send(404, "text/plain", "FileNotFound");
        }
      ); 
    
    • 调用on方法,以便它需要一个名为networks.json的文件(您可以提供另一个名称)。此方法将json字符串与所有可用网络SSID进行流式传输,信号级别和安全模式。要使用此代码,您应该包含ArduinoJson库

    server-&gt; on(“/ networks.json”,&amp;     {       String json;       int numNetworks,i,j,rssi;       StaticJsonBuffer&LT; 4096&GT; jsonBuffer;       JsonArray&安培; networks = jsonBuffer.createArray();       for(j = 0; j <10; j ++)       {         numNetworks = WiFi.scanNetworks();         Serial.print(numNetworks);         Serial.println(“networks”);         for(j = 0; j

          if (WiFi.encryptionType(j) != 7)
            network["auth"] = 0;
          else
            network["auth"] = 1;
    
          rssi = WiFi.RSSI(j);
    
          if (rssi < -90)
            network["signal"] = 1;
          else if (rssi < -80)
            network["signal"] = 2;
          else if (rssi < -70)
            network["signal"] = 3;
          else if (rssi < -67)
            network["signal"] = 4;
          else if (rssi < -30)
            network["signal"] = 5;
        }
      }
      networks.printTo(json);
      server->send(200, "application/json", json);
      Serial.println("handleFileRead: /networks.json");
    }
    

    );

  • 再次调用on方法以获得配置:

    server-&gt; on(“/ configure”,&amp; {//处理程序   //添加一个新行   文件配置;   文件文件= SPIFFS.open(“/ resp.htm”,“r”);   SPIFFS.remove(CONFIGFILE);   StaticJsonBuffer&LT; 512&GT; jsonBuffer;   的JSONObject和放大器; root = jsonBuffer.createObject();   config = SPIFFS.open(configFile,“w”); //稍后添加一些备份逻辑   if(!file)   {     server-&gt; send(404,“text / plain”,“File Not Found”);     返回;   }

    for(int i = 0; i&lt; server-&gt; args(); i ++)   {     root [server-&gt; argName(i)] = server-&gt; arg(i);     如果(服务器 - &GT; argName(ⅰ).equals( “SSID”))     {       root [“wifissid”] = server-&gt; arg(i);     }

    if(server->argName(i).equals("password"))
    {
      root["wifipassword"] = server->arg(i);
    }
    

    }

    server-&gt; streamFile(file,“text / html”);

    root.printTo(配置);   file.close();   config.close(); }

    • 创建一个网页,该网页读取名为/networks.json的文件,以填充表单中的可用网络列表。当用户选择一个网络时,让页面要求输入密码(我不会为此提供代码,因为有数百万种方法可以做到这一点)。你应该在这个页面上使用javascript。如果你想使用任何花哨的javascript插件,比如jquery,bootstrap或angular,你可以使用它,但是请记住,ESP8266HttpServer库可能会对更大的文件行为不端(我设法将jquery压缩到27kb并且在这个大小上没有问题) 。表格应该为“/ config”。
  • 您将获得一个带有JSON的整洁配置文件,您可以使用它配置STA SSID和密码。

    configWifi(){       文件配置;       int filelenght;       int taglen;       结果;       unsigned char mac [6];       char * buffer = NULL;       StaticJsonBuffer&LT; 1024&GT; jsonBuffer;       wifiConnection = new WiFiClient();       WiFi.mode(WIFI_STA);       WiFi.macAddress(MAC);       hex2str(this-&gt; clientid,(char *)mac,6);       config = SPIFFS.open(configFile,“r”);       if(!config)       {         config.close();         返回;       }       if(config.size()&lt; 10)       {         config.close();         返回;       }
          buffer =(char *)calloc(config.size()+ 1,1);       config.readBytes(buffer,config.size());       config.close();       Serial.println(缓冲液);       的JSONObject和放大器; root = jsonBuffer.parseObject(buffer);       if(!root.success())       {         config.close();         自由(缓冲液);         返回;       }       strcpy(wifi_ssid,root [“wifissid”]);       strcpy(wifi_password,root [“wifipassword”]);       Serial.print(“SSID =”);       Serial.print(wifi_ssid);       Serial.print(“Pass =”);       Serial.println(wifi_password);       WiFi.begin(wifi_ssid,wifi_password);       自由(缓冲液);       Serial.println( “初始化”);
          返回; }

就是这样。用户将获得一个强制页面来配置他的wifi连接。