之前研究的一版破解WiFi打卡的工具,但是WIFI名称、密码、MAC地址全部写死在程序里了,改动需要修改代码重新下载。升级了下网页配置功能
利用自己之前学的一点html知识,结合做前端朋友的帮助,写了一个配网页面,配置时,会对密码和MAC地址进行校验,密码长度必须超过8位或者不输入,MAC先进行格式校验,后对每两个数据进行十六进制校验,通过后,修改所有参数,通过EEPROM库将数据保存在flash。然后重启设备,重新启动后读取配置信息,开启AP并修改MAC地址
下面是最新版的代码,有需要的可以自己下载arduino,买个ESP8266-12F模块,下载进去即可使用
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
//首页html
const char* home_page_str = "<html>\n <head>\n <meta charset=\"utf-8\" name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n <title>配置页面</title>\n <script src=\"config.html\" type=\"text/javascript\" charset=\"utf-8\"></script>\n <style>\n .formBox{\n width: 100%;\n float: left;\n margin: 0 auto\n }\n .formBox > form {\n width: 80%;\n margin: 0 auto;\n }\n form > input{\n width: 100%;\n height: 40px;\n }\n </style>\n </head>\n <body>\n <div align=\"center\">\n <h1>欢迎使用WIFI打卡神器</h1>\n \n </div><br><br>\n <div align=\"center\" class=\"formBox\">\n <form action=\"/result.html\">\n <h3>WIFI名称:</h3>\n <input type=\"text\" name=\"ssid\" value=\"\" required><br>\n <h3>WIFI密码:</h3>\n <input type=\"text\" name=\"password\" value=\"\"><br>\n <h3>MAC地址:</h3>\n <input type=\"text\" name=\"mac\" value=\"\" required><br>\n <input type=\"submit\" style=\"margin-top: 30px; font-size: 20px;\" value=\"配置\">\n </form> \n </div>\n </body>\n <script>\n \n let {mac,password,ssid} = config;\n document.getElementsByName('mac')[0].value = mac || '';\n document.getElementsByName('password')[0].value = password || '';\n document.getElementsByName('ssid')[0].value = ssid || '';\n \n \n </script>\n</html>";
//定义配置类型
typedef struct
{
unsigned char Default_Tag;//默认标记
char stassid[32];//定义WIFI名称
char stapsw[64];//定义WIFI密码
uint8_t mac[6]; //定义mac地址
}config_type;
//定义默认配置
config_type const Default_Config = {
.Default_Tag = 254,
.stassid = "www.dzahz.cn\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
.stapsw = {'\0'},
.mac = {0x44,0x55,0xC4,0x37,0xB9,0xC0}
};
config_type config; //配置信息
ESP8266WebServer server(80);
void setup() {
// 启动串口通讯
Serial.begin(115200);
Serial.println();
Serial.printf("设置接入点中 ... ");
//读取WIFI配置
loadConfig();
if(config.Default_Tag != Default_Config.Default_Tag) //判断是否初始化配置
{
config = Default_Config;
saveConfig();
}
Serial.printf("ssid:%s\n",config.stassid);
Serial.printf("pasword:%s\n",config.stapsw);
Serial.printf("mac:%x:%x:%x:%x:%x:%x\n",config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]);
//启动AP
delay(500);
wifi_set_macaddr(SOFTAP_IF, config.mac);
delay(500);
WiFi.mode(WIFI_AP);
if(config.stapsw[0] == '\0')
WiFi.softAP(config.stassid, NULL);
else
WiFi.softAP(config.stassid, config.stapsw);
//设置wedserver回调
server.on("/",HTTP_GET, homepage);
server.on("/result.html",HTTP_GET, config_result);
server.on("/config.html",HTTP_GET, query_par);
server.onNotFound(handleNotFound);
//启动服务
server.begin();
}
//十六禁止格式判断,传输数据指针
bool hex_jud(char *str)
{
if((str[0] > '9') || (str[0] < '0')) //一个如果不是数字,则判断是否是A-F
{
if((str[0] > 'F') || (str[0] < 'A'))
{
if((str[0] > 'f') || (str[0] < 'a'))
{
return false;
}
}
}
if((str[1] > '9') || (str[1] < '0')) //一个如果不是数字,则判断是否是A-F
{
if((str[1] > 'F') || (str[1] < 'A'))
{
if((str[1] > 'f') || (str[1] < 'a'))
{
return false;
}
}
}
return true;
}
/****************************************
*函数名称:saveConfig
*函数功能:保存配置信息
*输入参数:无
*输出参数:无
*备 注:
*****************************************/
void saveConfig() //保存配置函数
{
EEPROM.begin(1024); //申请1024的内存 配置保存在前256
uint8_t *p = (uint8_t *)(&config);
for (int i = 0; i < sizeof(config); i++)
{
EEPROM.write(i, *(p + i));
}
EEPROM.commit();
}
/****************************************
*函数名称:loadConfig
*函数功能:读取配置信息
*输入参数:无
*输出参数:无
*备 注:
*****************************************/
void loadConfig()
{
EEPROM.begin(1024);
uint8_t *p = (uint8_t *)(&config);
for (int i = 0; i < sizeof(config); i++)
{
*(p + i) = EEPROM.read(i);
}
EEPROM.commit();
}
//acsii转十六进制格式
uint8_t acsii_hes(char *str)
{
uint8_t h;
uint8_t l;
if((str[0] <= '9') && (str[0] >= '0'))
h = str[0] - '0';
else if((str[0] <= 'F') && (str[0] >= 'A'))
h = str[0] - 'A' + 10;
else if((str[0] <= 'f') && (str[0] >= 'a'))
h = str[0] - 'a' + 10;
if((str[1] <= '9') && (str[1] >= '0'))
l = str[1] - '0';
else if((str[1] <= 'F') && (str[1] >= 'A'))
l = str[1] - 'A' + 10;
else if((str[1] <= 'f') && (str[1] >= 'a'))
l = str[1] - 'a' + 10;
return (h << 4) | l;
}
//自定义主页访问处理函数
void homepage()
{
server.send(200, "text/html", home_page_str);
Serial.println("用户访问了主页");
}
//查SSID接口
void query_par()
{
char str[256];
sprintf(str,"const config = {\"ssid\":\"%s\",\"password\":\"%s\",\"mac\":\"%2X:%2X:%2X:%2X:%2X:%2X\"}",config.stassid,config.stapsw,config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]);
server.send(200, "text/html", str);
}
//查WIFI密码接口
void read_stapsw()
{
server.send(200, "text/plain", config.stapsw);
}
//查mac接口
void read_mac()
{
char str[50];
sprintf(str,"%2X:%2X:%2X:%2X:%2X:%2X",config.mac[0],config.mac[1],config.mac[2],config.mac[3],config.mac[4],config.mac[5]);
server.send(200, "text/plain", str);
}
//配置接口
void config_result()
{
char ssid[32];
char password[64];
char mac[64];
char str[512];
int len;
int i;
//取出所有信息
sprintf(ssid,"%s",server.arg("ssid").c_str());
sprintf(password,"%s",server.arg("password").c_str());
sprintf(mac,"%s",server.arg("mac").c_str());
Serial.printf("ssid:%s\n",ssid);
Serial.printf("pasword:%s\n",password);
Serial.printf("mac:%s\n",mac);
//校验密码长度
len = strlen(password);
if((len < 8) && (len != 0))
{
sprintf(str,"<html><meta charset=\"utf-8\"><body><p>密码长度错误,长度:%d<b></body></html>",len);
server.send(200, "text/html",str);
return;
}
//校验MAC格式
len = strlen(mac);
Serial.printf("maclen:%d\n",len);
if(len != 17) //校验总长度
{
server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>");
return;
}
for(i = 0; i < 5; i++) //校验:
{
Serial.printf("mac:%d\n",mac[i*3+2]);
if(mac[i*3+2] != ':')
{
server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>");
return;
}
}
for(i = 0; i < 6; i++) //校验是否十六进制
{
if(hex_jud(&mac[i*3]) == false)
{
server.send(200, "text/html","<html><meta charset=\"utf-8\"><body><p>mac格式错误<b></body></html>");
return;
}
}
//保存信息
len = strlen(ssid);
for(i = 0; i < 32; i++) //先清除原有配置
config.stassid[i] = 0;
for(i = 0; i < len; i++)
config.stassid[i] = ssid[i];
len = strlen(password);
for(i = 0; i < 32; i++) //先清除原有配置
config.stapsw[i] = 0;
for(i = 0; i < len; i++)
config.stapsw[i] = password[i];
for(i = 0; i < 6; i++) //十六进制
{
config.mac[i] = acsii_hes(&mac[i*3]);
}
saveConfig();
server.send(200, "text/html", "<html><meta charset=\"utf-8\"><body><p>设置成功,设备重启<b></body></html>");
delay(500);
system_restart(); //复位
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound() { // 当浏览器请求的网络资源无法在服务器找到时,
server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
void loop()
{
//监听客户请求并处理
server.handleClient();
}
评论 (0)