我怀疑这是一个已经存在" stock"解;我需要部署ESP8266设备,以便能够连接到安全的本地WiFi,但在软件嵌入设备时我无法知道凭据。不知何故,我需要能够拥有最终用户,使用普通计算机(即具有键盘和屏幕的计算机!)" push"将此信息导入设备。首先,我希望他们能够通过无线方式进行此操作,但如果必须以这种方式进行,则可以进行USB /串行连接。
我想我可以"捆绑"整个工具链和源代码,让他们运行一个脚本,提示输入此信息,通过USB构建和上传软件。但考虑到ESP能够充当AP的能力,我无法帮助他们思考更好的方法,并且有人可能已经将其打包了!
(我想一个值得一提的问题是,是否可能存在某种对等配置,这是优选的。我希望ESP与计算机主机具有双向,可靠(即TCP套接字)通信(它并不真正需要互联网访问)。但我并不真正想要任何可能危及该计算机安全性的事情,因此坚持使用最终用户的常规WiFi似乎是最好的选择。)
我应该调查什么?或者有什么建议吗?或者什么关键字搜索会找到答案!?
TIA!
答案 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");
}
);
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(); }
您将获得一个带有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连接。