利用ESP8266制作钉钉WIFI打卡神器升级版

陈晓
2022-12-08 / 0 评论 / 48 阅读 / 正在检测是否收录...

之前研究的一版破解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

评论 (0)

取消
网站已运行 00000000

Powered by Typecho ※ Theme is RST网络


CDN Sponsor Server provider Google Analytics Google Analytics
桂ICP备18006850号-1