ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。
网页
<!DOCTYPE html>
<html lang="zh-CN"> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ESP8266 配置信息</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
</head> <body> <div style="text-align:center;"> <h1 style="background-color:rgba(155,255,30,0.75)">欢迎使用</h1> <div class="starter-template";clear:both;text-align:center;"> <h3 style="background-color:rgba(255,10,10,0.75);color:#ffffff;">1板载LED控制</h3> <button onclick='setPinValue("on")' >点亮</button>
<button onclick='setPinValue("off")' >熄灭</button>
<p style="color:#40B3DF;">LED状态: <span id="txtState"></span></p>
</div> <div class="starter-template">
<h3 style="background-color:rgba(255,10,10,0.75);color:#ffffff;">2选择WIFI连接方式:</h3> <div style="color:#40B3DF;">
<p>WIFI连接状态: <span id="wifiState"></span></p>
<div/> <hr/>
<h4><2.1>普通WIFI上网(家庭)</h4>
<form action="">
WIFI名称: <input type="text" id="wifiname" />
</form>
<form action="">
WIFI密码: <input type="text" id="wifipwd" />
</form> <br/>
<button onclick='setWifi(wifiname.value,wifipwd.value)' >连接</button> <h4><2.2>网页认证上网(学校和商场)</h4> <form action="">
WIFI名称: <input type="text" id="wifi_wname" />
</form>
<form action="">
登陆网址: <input type="text" id="wifi_wip" />
</form>
<form action="">
<form action="">
上网密钥: <input type="text" id="wifi_postdata" />
</form>
<p style="color:#01a1ff;">(上网密钥 = 账号(学号)+密码+其他信息)<p/>
<button onclick='setWifi_wangye(wifi_wname.value,wifi_wip.value,wifi_postdata.value)' >连接</button>
<br/> <hr/> </div> </div> <script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script> <div>
<button onclick='' >如何一键获取上网密钥?</button>
</div> <script type="text/javascript">
function setPinValue(value) {
alert("按键点击!");
var xmlhttp;
if (value.length==0)
{
document.getElementById("txtState").innerHTML="请点击正确按键!";
return;
} if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//alert(xmlhttp.responseText);
//alert("操作成功");
document.getElementById("txtState").innerHTML = xmlhttp.responseText;
}
} var requestString = "/pin?a=" + value + "&pin=2";
xmlhttp.open("GET", requestString, true);
xmlhttp.send(null);
} function setWifi(name,pwd) {
alert("按键点击!");
var xmlhttp;
if (name.length==0)
{
document.getElementById("wifiState").innerHTML="请输入WIFI信息!";
return;
} if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//alert(xmlhttp.responseText);
//alert("操作成功");
document.getElementById("wifiState").innerHTML = xmlhttp.responseText;
}
} var requestString = "/wifi?config=on" + "&name="+name+"&pwd="+pwd;
xmlhttp.open("GET", requestString, true);
xmlhttp.send(null);
} function setWifi_wangye(wifi_wname,wifi_wip,wifi_postdata) {
alert("按键点击!");
var xmlhttp;
if (wifi_wname.length==0||wifi_wip.length==0||wifi_postdata.length==0)
{
document.getElementById("wifiState").innerHTML="请输入网页认证信息!";
return;
} //for(var i=0;i<wifi_postdata.length;i++)
//{
//if(wifi_postdata[i]=="&")wifi_postdata[i]="-"; //} if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//alert(xmlhttp.responseText);
//alert("操作成功");
document.getElementById("wifiState").innerHTML = xmlhttp.responseText;
}
} var requestString = "/wifi_wangye?config=on" + "&wifi_wname="+wifi_wname+"&wifi_wpwd"+""+"&wifi_wip="+wifi_wip+"&wifi_postdata="+wifi_postdata;
xmlhttp.open("GET", requestString, true);
xmlhttp.send(null);
}
</script>
</body>
</html>
程序代码
/* 1 上电从rom读取上次WIFI地址
成功-1网页交互 2MQTT通信
失败-进入网页模式,等待新的密码 2
添加上电检测重连wifi, 如果是普通直连,如果是网页认证,直连+网页请求
*/ //------是否开启打印-----------------
#define Use_Serial Serial //-----------------------------A-1 库引用开始-----------------//
#include <string.h>
#include <math.h> // 数学工具库
#include <EEPROM.h>// eeprom 存储库 // WIFI库
#include <ESP8266WiFi.h>
//-------客户端---------
#include <ESP8266HTTPClient.h>
//---------服务器---------
#include <ESP8266WebServer.h>
#include <FS.h> //Mqtt
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h" //ESP获取自身ID
#ifdef ESP8266
extern "C" {
#include "user_interface.h" //含有system_get_chip_id()的库
}
#endif //-----------------------------A-1 库引用结束-----------------// //-----------------------------A-2 变量声明开始-----------------//
int PIN_Led = D4;
bool PIN_Led_State=0;
ESP8266WebServer server ( 80 );
//储存SN号
String SN; /*----------------WIFI账号和密码--------------*/
char ssid[50] = ""; // Enter SSID here
char password[50] = ""; //Enter Password here #define DEFAULT_STASSID "lovelamp"
#define DEFAULT_STAPSW "lovelamp" // 用于存上次的WIFI和密码
#define MAGIC_NUMBER 0xAA
struct config_type
{
char stassid[50];
char stapsw[50];
uint8_t magic;
};
config_type config_wifi; //------mqtt头定义-----------------
#define AIO_SERVER "www.dongvdong.top" //mqtt服务器
#define AIO_SERVERPORT 1883 //端口
#define AIO_USERNAME ""
#define AIO_KEY ""
WiFiClient mqttclient; //------mqtt通信-----------------
Adafruit_MQTT_Client mqtt(&mqttclient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/test", MQTT_QOS_1); //--------------HTTP请求------------------
struct http_request {
String Referer;
char host[20];
int httpPort=80;
String host_ur ; String usr_name;//账号
String usr_pwd;//密码 String postDate; }; String http_html;
//-----------------------------A-2 变量声明结束-----------------// //-----------------------------A-3 函数声明开始-----------------//
void wifi_Init();
void saveConfig();
void loadConfig();
int hdulogin(struct http_request ruqest) ;
void http_wifi_xidian();
String getContentType(String filename);
void handleNotFound();
void handleMain();
void handlePin();
void handleWifi();
void http_jiexi(http_request ruqest);
void handleWifi_wangye();
void handleTest();
void MQTT_connect();
void onoffcallback(char *data, uint16_t len) ;
//---------------------------A-3 函数声明结束------------------------// //-----------------------------A-3 函数-----------------//
//3-1管脚初始化
void get_espid(){
SN = (String )system_get_chip_id();
Use_Serial.println(SN); }
void LED_Int(){ pinMode(D4, OUTPUT); }
//3-2WIFI初始化
void wifi_Init(){
Use_Serial.println("Connecting to "); Use_Serial.println(config_wifi.stassid); WiFi.begin(config_wifi.stassid, config_wifi.stapsw);
int retries=3;
while (WiFi.status() != WL_CONNECTED) {
server.handleClient();
// retries--;
// if (retries == 0) {
// Use_Serial.println("WIFI connect 3 times fail!");
// return;
// } ESP.wdtFeed();
delay(500); Use_Serial.print(".");
PIN_Led_State = !PIN_Led_State;
digitalWrite(PIN_Led, PIN_Led_State); } Use_Serial.println("--------------WIFI CONNECT!------------- ");
Use_Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Use_Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
Use_Serial.println("---------------------------------------- "); } /*
*3-/2 保存参数到EEPROM
*/
void saveConfig()
{
Serial.println("Save config!");
Serial.print("stassid:");
Serial.println(config_wifi.stassid);
Serial.print("stapsw:");
Serial.println(config_wifi.stapsw);
EEPROM.begin(1024);
uint8_t *p = (uint8_t*)(&config_wifi);
for (int i = 0; i < sizeof(config_wifi); i++)
{
EEPROM.write(i, *(p + i));
}
EEPROM.commit();
}
/*
* 从EEPROM加载参数
*/
void loadConfig()
{
EEPROM.begin(1024);
uint8_t *p = (uint8_t*)(&config_wifi);
for (int i = 0; i < sizeof(config_wifi); i++)
{
*(p + i) = EEPROM.read(i);
}
EEPROM.commit();
//出厂自带
if (config_wifi.magic != MAGIC_NUMBER)
{
strcpy(config_wifi.stassid, DEFAULT_STASSID);
strcpy(config_wifi.stapsw, DEFAULT_STAPSW);
config_wifi.magic = MAGIC_NUMBER;
saveConfig();
Serial.println("Restore config!");
}
Serial.println(" ");
Serial.println("-----Read config-----");
Serial.print("stassid:");
Serial.println(config_wifi.stassid);
Serial.print("stapsw:");
Serial.println(config_wifi.stapsw);
Serial.println("-------------------"); // ssid=String(config.stassid);
// password=String(config.stapsw);
} //3-3ESP8266建立无线热点
void SET_AP(){ // 设置内网
IPAddress softLocal(192,168,4,1); // 1 设置内网WIFI IP地址
IPAddress softGateway(192,168,4,1);
IPAddress softSubnet(255,255,255,0);
WiFi.softAPConfig(softLocal, softGateway, softSubnet); String apName = ("ESP8266_"+(String)ESP.getChipId()); // 2 设置WIFI名称
const char *softAPName = apName.c_str(); WiFi.softAP(softAPName, "admin"); // 3创建wifi 名称 +密码 adminadmin Use_Serial.print("softAPName: "); // 5输出WIFI 名称
Use_Serial.println(apName); IPAddress myIP = WiFi.softAPIP(); // 4输出创建的WIFI IP地址
Use_Serial.print("AP IP address: ");
Use_Serial.println(myIP); }
//3-4ESP建立网页服务器
void Server_int(){ server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理 ---- 返回主页面 一键配网页面
server.on ("/pin", HTTP_GET, handlePin); // 绑定‘/pin’地址到handlePin方法处理 ---- 开关灯请求
server.on ("/wifi", HTTP_GET, handleWifi); // 绑定‘/wifi’地址到handlePWIFI方法处理 --- 重新配网请求
server.on ("/wifi_wangye", HTTP_GET, handleWifi_wangye);
server.on ("/test", HTTP_GET, handleTest);
server.onNotFound ( handleNotFound ); // NotFound处理
server.begin();
Use_Serial.println ( "HTTP server started" ); }
//3-5-1 网页服务器主页
void handleMain() { /* 返回信息给浏览器(状态码,Content-type, 内容) * 这里是访问当前设备ip直接返回一个String */ Serial.print("handleMain"); File file = SPIFFS.open("/index.html", "r"); size_t sent = server.streamFile(file, "text/html"); file.close(); return; }
//3-5-2 网页控制引脚
/* 引脚更改处理 * 访问地址为htp://192.162.xxx.xxx/pin?a=XXX的时候根据a的值来进行对应的处理 */ void handlePin() { if(server.hasArg("a")) { // 请求中是否包含有a的参数 String action = server.arg("a"); // 获得a参数的值 if(action == "on") { // a=on digitalWrite(2, LOW); // 点亮8266上的蓝色led,led是低电平驱动,需要拉低才能亮 server.send ( 200, "text/html", "Pin 2 has turn on"); return; // 返回数据 } else if(action == "off") { // a=off digitalWrite(2, HIGH); // 熄灭板载led server.send ( 200, "text/html", "Pin 2 has turn off"); return; } server.send ( 200, "text/html", "unknown action"); return; } server.send ( 200, "text/html", "action no found"); } //3-5-3 网页修改普通家庭WIFI连接账号密码
/* WIFI更改处理 * 访问地址为htp://192.162.xxx.xxx/wifi?config=on&name=Testwifi&pwd=123456
根据wifi进入 WIFI数据处理函数
根据config的值来进行 on
根据name的值来进行 wifi名字传输
根据pwd的值来进行 wifi密码传输 */ void handleWifi(){ if(server.hasArg("config")) { // 请求中是否包含有a的参数 String config = server.arg("config"); // 获得a参数的值
String wifiname;
String wifipwd; if(config == "on") { // a=on
if(server.hasArg("name")) { // 请求中是否包含有a的参数
wifiname = server.arg("name"); // 获得a参数的值 } if(server.hasArg("pwd")) { // 请求中是否包含有a的参数
wifipwd = server.arg("pwd"); // 获得a参数的值
} String backtxt= "Wifiname: "+ wifiname +"/r/n wifipwd: "+ wifipwd ;// 用于串口和网页返回信息 Use_Serial.println ( backtxt); // 串口打印给电脑 server.send ( 200, "text/html", backtxt); // 网页返回给手机提示
// wifi连接开始 wifiname.toCharArray(config_wifi.stassid, 50); // 从网页得到的 WIFI名
wifipwd.toCharArray(config_wifi.stapsw, 50); //从网页得到的 WIFI密码 saveConfig();
wifi_Init(); return;
} else if(config == "off") { // a=off
server.send ( 200, "text/html", "config is off!");
return; } server.send ( 200, "text/html", "unknown action"); return; } server.send ( 200, "text/html", "action no found"); } //3-5-4 网页认证西电上网-- 无用
void http_wifi_xidian(){ //// 通过上网认证,请自己修改postDate中的学号和密码
// 例如:
/*网页认证上网post*/
// String Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
// char* host = "10.255.44.33";
// int httpPort = 80;
// String host_ur = "srun_portal_pc.php"; /*网页认证上网模式 */
// String usr_name;//账号
// String usr_pwd;//密码
// String postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+usr_name+"&password="+usr_pwd; // 认证上网
http_request ruqest;
ruqest.Referer="http://10.255.44.33/srun_portal_pc.php?ac_id=1&";
String("10.255.44.33").toCharArray( ruqest.host , 20);
ruqest.httpPort = 80;
ruqest.host_ur = "srun_portal_pc.php";
ruqest.usr_name="1601120383";//账号 密码已修改 要+1
ruqest.usr_pwd="mimaHENFuza";//密码 密码已修改 要-1
ruqest.postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+ ruqest.usr_name+"&password="+ruqest.usr_pwd; if (hdulogin(ruqest) == 0) { Use_Serial.println("WEB Login Success!");
}
else { Use_Serial.println("WEB Login Fail!");
} } //3-5-5-1 网页认证上网
void handleWifi_wangye(){
if(server.hasArg("config")) { // 请求中是否包含有a的参数
// 1 解析数据是否正常
String config = server.arg("config"); // 获得a参数的值
String wifi_wname,wifi_wpwd,wifi_wip,wifi_postdata; if(config == "on") { // a=on
if(server.hasArg("wifi_wname")) { // 请求中是否包含有a的参数
wifi_wname = server.arg("wifi_wname"); // 获得a参数的值
if(wifi_wname.length()==0){
server.send ( 200, "text/html", "please input WIFI名称!"); // 网页返回给手机提示
return;}
}
if(server.hasArg("wifi_wpwd")) { // 请求中是否包含有a的参数
wifi_wpwd = server.arg("wifi_wpwd"); // 获得a参数的值 }
if(server.hasArg("wifi_wip")) { // 请求中是否包含有a的参数
wifi_wip = server.arg("wifi_wip"); // 获得a参数的值
if(wifi_wip.length()==0){
server.send ( 200, "text/html", "please input 登陆网址!"); // 网页返回给手机提示
return;} }
if(server.hasArg("wifi_postdata")) { // 请求中是否包含有a的参数 String message=server.arg(3);
for (uint8_t i=4; i<server.args(); i++){
message += "&" +server.argName(i) + "=" + server.arg(i) ;
} wifi_postdata = message; // 获得a参数的值
if(wifi_postdata.length()==0){
server.send ( 200, "text/html", "please input 联网信息!"); // 网页返回给手机提示
return;}
} //--------------------------------- wifi连接-------------------------------------------------
wifi_wname.toCharArray(config_wifi.stassid, 50); // 从网页得到的 WIFI名
wifi_wpwd.toCharArray(config_wifi.stapsw, 50); //从网页得到的 WIFI密码 saveConfig(); // wifi连接开始
wifi_Init(); //--------------------------------- 认证上网------------------------------------------------- // 2 发送认证 // ruqest.Referer="http://10.255.44.33/srun_portal_pc.php";
http_request ruqest_http;
ruqest_http.httpPort = 80;
ruqest_http.Referer=wifi_wip;// 登录网址
ruqest_http.postDate=wifi_postdata; Use_Serial.println (wifi_wip);
Use_Serial.println (wifi_postdata); http_jiexi(ruqest_http); return;
} else if(config == "off") { // a=off
server.send ( 200, "text/html", "config is off!");
return;
}
server.send ( 200, "text/html", "unknown action"); return;
}
server.send ( 200, "text/html", "action no found"); } //3-5-5-2 网页解析IP消息
void http_jiexi(http_request ruqest){ int datStart ; int datEnd; // 1 解析ip
// http://10.255.44.33/
char h[]="http://"; char l[]="/";
datStart = ruqest.Referer.indexOf(h)+ strlen(h);
datEnd= ruqest.Referer.indexOf(l,datStart);
String host=ruqest.Referer.substring(datStart, datEnd);
host.toCharArray( ruqest.host , 20); Use_Serial.println ( ruqest.host); // 串口打印给电脑 // 2 解析请求的网页文件-登录页面
// srun_portal_pc.php?ac_id&";
char s[] ="?";
datStart = ruqest.Referer.indexOf(l,datStart)+strlen(l);
// datEnd = ruqest.Referer.indexOf(s,datStart)-strlen(s)+1;
if(ruqest.Referer.indexOf(s,datStart)==-1)
{datEnd = ruqest.Referer.length();}
else{
datEnd = ruqest.Referer.indexOf(s,datStart)-1;
}
ruqest.host_ur = String(ruqest.Referer.substring(datStart, datEnd));
Use_Serial.println ( ruqest.host_ur); // 串口打印给电脑 Use_Serial.println( ruqest.postDate); if (hdulogin(ruqest) == 0) {
Use_Serial.println("WEB Login Success!");
}
else {
Use_Serial.println("WEB Login Fail!");
}
return; } //3-5-5-3 网页认证发送HTTP请求
/*---------------------------------------------------------------*/
int hdulogin(struct http_request ruqest) {
WiFiClient client; if (!client.connect(ruqest.host, ruqest.httpPort)) {
Use_Serial.println("connection failed");
return 1;
}
delay(10); if (ruqest.postDate.length() && ruqest.postDate != "0") {
String data = (String)ruqest.postDate;
int length = data.length(); String postRequest =
(String)("POST ") + "/"+ruqest.host_ur+" HTTP/1.1\r\n" +
"Host: " +ruqest.host + "\r\n" +
"Connection: Keep Alive\r\n" +
"Content-Length: " + length + "\r\n" +
"Accept:text/html,application/xhtml+xml,application/xml;*/*\r\n" +
"Origin: http://"+ruqest.host+"\r\n" +
"Upgrade-Insecure-Requests: 1"+"\r\n" +
"Content-Type: application/x-www-form-urlencoded;" + "\r\n" +
"User-Agent: zyzandESP8266\r\n" +
"Accept-Encoding: gzip, deflate"+"\r\n" +
"Accept-Language: zh-CN,zh;q=0.9"+"\r\n" +
"\r\n" +
data + "\r\n";
// String postDate = String("")+"action=login&ac_id=1&user_ip=&nas_ip=&user_mac=&url=&username=+"+usr_name+"&password="+usr_pwd;
client.print(postRequest);
delay(600);
//处理返回信息
String line = client.readStringUntil('\n');
Use_Serial.println(line);
while (client.available() > 0) {
Use_Serial.println(client.readStringUntil('\n'));
line += client.readStringUntil('\n'); // line += client.readStringUntil('\n');
} http_html=line; client.stop(); if (line.indexOf("时间") != -1 || line.indexOf("登陆") != -1) { //认证成功
return 0; }
else {
return 2;
} }
client.stop();
return 2;
} //3-5-6 网页测试
void handleTest(){
server.send(200, "text/html", http_html);
} //3-5-。。。 网页没有对应请求如何处理
void handleNotFound() { String path = server.uri(); Serial.print("load url:"); Serial.println(path); String contentType = getContentType(path); String pathWithGz = path + ".gz"; if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)){ if(SPIFFS.exists(pathWithGz)) path += ".gz"; File file = SPIFFS.open(path, "r"); size_t sent = server.streamFile(file, contentType); file.close(); String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message); return; } String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += ( server.method() == HTTP_GET ) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for ( uint8_t i = 0; i < server.args(); i++ ) { message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n"; } server.send ( 404, "text/plain", message ); }
// 解析请求的文件
/** * 根据文件后缀获取html协议的返回内容类型 */ String getContentType(String filename){ if(server.hasArg("download")) return "application/octet-stream"; else if(filename.endsWith(".htm")) return "text/html"; else if(filename.endsWith(".html")) return "text/html"; else if(filename.endsWith(".css")) return "text/css"; else if(filename.endsWith(".js")) return "application/javascript"; else if(filename.endsWith(".png")) return "image/png"; else if(filename.endsWith(".gif")) return "image/gif"; else if(filename.endsWith(".jpg")) return "image/jpeg"; else if(filename.endsWith(".ico")) return "image/x-icon"; else if(filename.endsWith(".xml")) return "text/xml"; else if(filename.endsWith(".pdf")) return "application/x-pdf"; else if(filename.endsWith(".zip")) return "application/x-zip"; else if(filename.endsWith(".gz")) return "application/x-gzip"; return "text/plain"; } //3-6-1 MQTT初始化 ----------------------------------- void Mqtt_int(){
//MQTT绑定初始化
onoffbutton.setCallback(onoffcallback);
mqtt.subscribe(&onoffbutton);
} //------mqtt回调函数-----------------
void onoffcallback(char *data, uint16_t len) {
Serial.print("Hey we're in a onoff callback, the button value is: ");
Serial.println(data);
} //3-6-2------mqtt连接检测-----------------
void MQTT_reconnect() {
int8_t ret; // Stop if already connected.
if (mqtt.connected()) {
return;
} Use_Serial.print("Connecting to MQTT... "); uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected server.handleClient(); Use_Serial.println(mqtt.connectErrorString(ret));
Use_Serial.println("Retrying MQTT connection in 10 seconds...");
mqtt.disconnect();
delay(10000); // wait 10 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
//while (1);
Use_Serial.println("Retrying MQTT connection 3 fali...");
return;
}
}
Use_Serial.println("MQTT Connected!"); } ////3-6-3 MQTT主函数
void Mqtt_Domain(){
if(WiFi.status() == WL_CONNECTED){
MQTT_reconnect();
mqtt.processPackets(2000);
if(! mqtt.ping()) {
mqtt.disconnect();
}
}
else {
wifi_Init(); }
} //------------------------------------------- void setup() ------------------------------------------ void setup() {
Use_Serial.begin(115200);
get_espid();
LED_Int(); loadConfig();// 读取信息 WIFI
wifi_Init(); // 3次尝试 SET_AP(); // 建立WIFI
SPIFFS.begin();
Server_int();
Mqtt_int();
} //------------------------------------------- void void loop() ------------------------------------------ void loop()
{ server.handleClient();
Mqtt_Domain(); }
ESP8266 HTTP 项目(2)HTTP网页修改WIFI连接,上电自动连接上次的WIFI。的更多相关文章
- 修改centos地址连接为自动连接
1.进入目录/etc/sysconfig/network-scripts/ 2.修改ifcfg-etn0 文件 (即你的网卡标识命名的配置文件) 3.将ONBOOT=no改成yes 4.保存后重启 ...
- WiFi-ESP8266入门http(3-4)网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信
网页一键配网(1若为普通wifi直连 2若为西电网页认证自动网页post请求连接)+网页按钮灯控+MQTT通信 工程连接:https://github.com/Dongvdong/ESP8266_H ...
- ESP8266 HTTP 项目(1)在刻度盘上进行ESP8266 NodeMCU模拟读取的步骤
https://circuits4you.com/2018/02/03/esp8266-nodemcu-adc-analog-value-on-dial-gauge/ ESP8266(NodeMCU) ...
- IntelliJ IDEA 在网页修改数据,但是在浏览器刷新的时候,不能读取到修改之后的数据
使用IntelliJ IDEA 在网页修改数据,但是在浏览器刷新的时候,不能读取到修改之后的数据? 解决办法:tomcat配置中,On frame deactivation属性选择Update cla ...
- 手机连上wifi热点后自动弹窗的功能
使用buildroot编译bind DNS服务器 用buildroot来制作文件系统很方便,编译出来的文件系统是直接可用的,不用添加脚本等麻烦的工作,很多的库和app都可以直接添加到文件系统里边,如常 ...
- PowerShell脚本自动设置安卓手机wifi代理
在实际测试工作中,经常要将安卓手机通过wifi代理的形式连接到本机的fiddler或charles服务器代理进行抓包测试.最近一直在想,有没有什么方法可以自动设置安卓手机的wifi代理,曾经想通过修改 ...
- 升级了win10后开启wifi热点出现iphone&macbook连接断线的问题(win7也一样)
升级了win10后开启wifi热点出现iphone&macbook连接 不间断 断线的问题 文后附上开启虚拟wifi的办法 百度参考了别人也出现这种问题,解决办法是修改信道,默认信道是11,修 ...
- 转-Android中自动连接到指定SSID的Wi-Fi
最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...
- 【转】Android中自动连接到指定SSID的Wi-Fi
最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...
随机推荐
- Ext.isEmpty()的使用
说明如下: isEmpty( Object value, Boolean allowEmptyString ) : Boolean 如果传递的值为空,则返回 true,否则返回 false.该值被认为 ...
- UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...
- 在“非软件企业”开发软件的困局 ZT
软件产品广泛服务于各行业,其开发具有高科技.高投入.高产出.高风险的特点.在项目开发和软件应用中,只有将人员能力的发挥与科学技术的使用应用市场的认识进行最佳的融合,才能发挥软件的效益.普通企业虽涉足软 ...
- Android string资源 包含 数学符号等特殊字符 及 参数占位符
定义:<?xml version="1.0" encoding="utf-8"?><resources> <string n ...
- 关于iframe跨域实践
提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...
- video 标签在微信浏览器的问题解决方法
最近做的些web页面,内嵌许多小视频,在ios和安卓手机上播放时,遇到不少问题: 在微信浏览器内播放时,视频会自动全屏 如果每个视频都有一张自定义的图片作为封面,在显示视频的同时,如果没有给这个视频设 ...
- 品牌电脑硬盘损坏后,使用MediaCreationTool从微软官方下载正版Windows到USB做安装盘
最近我的一台台式机电脑的硬盘损坏了.一开始是速度逐渐变慢,后来慢得难以忍受,有时半天无响应.查看 Windows event ,发现有 id 为 7 的磁盘报错.使用 Windows 8.1 家庭版自 ...
- 机器学习之EM算法(五)
摘要 EM算法全称为Expectation Maximization Algorithm,既最大期望算法.它是一种迭代的算法,用于含有隐变量的概率参数模型的最大似然估计和极大后验概率估计.EM算法经常 ...
- linux 命令之netstat
转自:http://www.maomao365.com/?p=699 linux 命令之netstat 在linux中netstat命令的作用是查看TCP/IP网络当前所开放端口,所对应的本地和外地端 ...
- http网站转换成https网站
https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题 一:什么是https SSL(Security Socket ...