首页
越南之旅
越南之旅2
友链
更多
时光机
Search
1
基于PushBear开发借助微信第三方实现消息推送和提醒
9,099 阅读
2
基于ESP8266-01开发wifi钓鱼器
2,035 阅读
3
Win10数字权利激活神器 HWIDGen v60.01 汉化版
1,883 阅读
4
国内主流安全软件个人向非专业测评
1,808 阅读
5
Cloudreve云盘源码+搭建教程+成品
1,794 阅读
默认
技术文章
前端技术
网络技术
打卡研究
软件工具
windows软件
IOS软件
Android软件
建站相关
网站源码
Typecho
服务器相关
WordPress
WordPress主题
WordPress 插件
闲谈
游戏分享
博客大事件
网络安全
服务器安全
程序漏洞
安全武器库
网络教程
学习笔记
网易云音乐专栏
登录
Search
标签搜索
esp8266
typecho
合宙ESP32C3
网站源码
AnyDesk
建站
点击器
WiFi打卡
程潇
累计撰写
181
篇文章
累计收到
38
条评论
首页
栏目
默认
技术文章
前端技术
网络技术
打卡研究
软件工具
windows软件
IOS软件
Android软件
建站相关
网站源码
Typecho
服务器相关
WordPress
WordPress主题
WordPress 插件
闲谈
游戏分享
博客大事件
网络安全
服务器安全
程序漏洞
安全武器库
网络教程
学习笔记
网易云音乐专栏
页面
越南之旅
越南之旅2
友链
时光机
搜索到
21
篇与
技术文章
的结果
2023-04-17
推荐几个免费高质量的AI自动抠图工具网站
1.BgSub官网:https://bgsub.cn消除或者替换图像背景,无需上传图像。2.Photopea | Online Image Editor官网:https://www.photopea.com3.在线抠图软件_AI抠图证件照换底色 – 稿定抠图官网:https://koutu.gaoding.com4.Remove Background from Image – remove.bg官网:https://www.remove.bg5.比ps抠图更加智能的在线抠图软件 – 改图神器官网:https://img.logosc.cn/remove-bg
2023年04月17日
2 阅读
0 评论
0 点赞
2023-03-09
HTML5自适应全屏幕视频背景(背景跟随滚动)
HTML5自适应全屏幕视频背景(背景跟随滚动)演示运行地址:https://wow.techbrood.com/fiddle/89https://wow.techbrood.com/fiddle/89<!DOCTYPE html><!-- This web page is copied by "https://bazhan.wang" --><html><head><meta charset="utf-8"> <style> h1 { margin: 0; color: red; } video { position: fixed; right: 0; bottom: 0; min-width: 100%; min-height: 100%; width: auto; height: auto; z-index: -100; background-size: cover; } </style> </head> <body> <video src="./bg.mp4" autoplay loop muted ></video> </body></html>
2023年03月09日
1 阅读
0 评论
0 点赞
2023-02-03
JS操作HTML页面内容
innerText:普通标签内容(自身文本与所有子标签文本)innerHTML:包含标签在内的内容(自身文本及子标签的所有)value:表单标签的内容outerHTML:包含自身标签在内的内容(自身标签及往下的所有)<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JS处理页面内容</title> <style> div { width: 100px; height: 100px; background-color: cyan; margin-top: 15px; } </style> </head> <body> <div class="d1">001</div> <div class="d2">002</div> <div class="d3">003</div> <div class="box"></div> </body> <script> // 先获取页面元素 var d1 = document.querySelector('.d1'); var d2 = document.querySelector('.d2'); var d3 = document.querySelector('.d3'); // ① 操作文本内容 var text = d1.innerText; // 获取内容 console.log(text); // 修改(删除)内容 d1.innerText = ""; d1.innerText = "修改后的文本内容"; // ② 操作子标签 // 获取 var html = d2.innerHTML; console.log(html) // 修改 d2.innerHTML = "<b>加粗的文本</b>"; // 可以解析html语法的代码 // d2.innerText = "<b>加粗的文本</b>"; // 了解 console.log(d2.innerHTML); // 只是标签内部的子标签与子内容 console.log(d2.outerHTML); // 不仅包含标签内部的子标签与子内容,还包含自身标签信息 // ③ 操作页面样式 // 获取 ?? var bgColor = d3.style.backgroundColor; // 只能获取行间式 console.log(bgColor); // 修改 d3.style.backgroundColor = "yellow"; // 只能修改行间式 // 问题: 那用内联外联设置的样式如何获取 // 内联与外联设置的样式叫: 计算后样式 // getComputedStyle(目标标签, 伪类(null填充)).具体的样式 bgColor = window.getComputedStyle(d3, null).backgroundColor; // 兼容性较差 console.log(bgColor); // 可以获取计算后样式, 也可以获取行间式, 但它为只读 bgColor = getComputedStyle(d3, null).getPropertyValue('background-color'); // 兼容性较好 console.log(bgColor); // 一些不常用的属性会出现浏览器之间的兼容问题, 通过添加前缀来处理 console.log(d3.style); // chrome: -webkit- // ie: -ms- // opera: -o- </script> <script> // 需求: box的颜色通过点击在cyan与red之间切换 var box = document.querySelector('.box'); box.onclick = function () { var bgColor = getComputedStyle(this, null).backgroundColor; console.log(bgColor); // 要注意计算后样式获取的结果, 以及结果具体的字符串格式 if (bgColor == 'rgb(0, 255, 255)') { this.style.backgroundColor = 'red'; } else { this.style.backgroundColor = 'cyan'; } } </script> </html>JS操作页面样式读写style属性样式div.style.backgroundColor = 'red';1.操作的为行间式 2.可读可写 3.具体属性名采用小驼峰命名法只读计算后样式推荐getComputedStyle(页面元素对象, 伪类).getPropertyValue('background-color'); 不推荐getComputedStyle(页面元素对象, 伪类).backgroundColor;// IE9以下页面元素对象.currentStyle.getAttribute('background-color');页面元素对象.currentStyle.backgroundColor;1.页面元素对象由JS选择器获取 2.伪类没有的情况下用null填充 3.计算后样式为只读 4.该方式依旧可以获取行间式样式 (获取逻辑最后的样式)结合 css 操作样式页面元素对象.className = ""; // 清除类名 页面元素对象.className = "类名"; // 设置类名 页面元素对象.className += " 类名"; // 添加类名实例1,JS事件控制标题栏<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>js事件控制标题栏</title> <style> .part1 div { width: 100px; height: 30px; text-align: center; line-height: 30px; float: left; cursor: pointer; } .part1 { overflow: hidden; } h2 { height: 30px; background-color: cyan; } </style> </head> <body> <div class="part1"> <div class="b1">标题栏</div> <div class="b2">标题栏</div> <div class="b3">标题栏</div> <div class="b4">标题栏</div> </div> <h2></h2> </body> <script> /* var b1 = document.querySelector('.b1'); // 鼠标悬浮事件 b1.onmouseenter = function () { console.log("鼠标悬浮上了"); // 悬浮上后,该标签的字体颜色变化橘色 this.style.color = "#FF6700"; } // 需求并非为鼠标移走,去除颜色 b1.onmouseleave = function () { this.style.color = "#000"; } */ </script> <script> // 制作数据 var data = ["标题1", "标题2", "标题3", "标题4"]; var divs = document.querySelectorAll('.part1 div'); console.log(divs); // 循环绑定 => 会出现变量(i)污染 for (let i = 0; i < divs.length; i++) { divs[i].onmouseenter = function () { // 打印自身索引值 console.log(i); // 将自身颜色变为橘色,其他兄弟颜色变为黑色 // 就是i为橘色, 非i为黑色 changeColor(i); // 悬浮内容 changeContent(i) } } // console.log(i); // 自定义的修改颜色的方法 function changeColor(index) { for (let i = 0; i < divs.length; i++) { // 先不管三七二十一,全改成黑色 divs[i].style.color = "black"; // 如果是目标选中标签,它的颜色再重新设置为橘色 if (i == index) { divs[i].style.color = "#FF6700"; } } } var h2 = document.querySelector('h2'); // 修改内容 function changeContent(index) { h2.innerText = data[index]; } </script> </html>实例2,JS控制类名<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>js控制类名</title> <style> .y { width: 100px; height: 100px; background-color: red; border-radius: 50%; } .f { width: 100px; height: 100px; background-color: orange; } .g { display: none; } .ttt { } </style> </head> <body> <ul> <li class="l1">圆</li> <li class="l2">方</li> <li class="l3">滚</li> </ul> <div></div> </body> <script> var box = document.querySelector('div'); var l1 = document.querySelector('.l1'); l1.onclick = function () { box.className = 'y' } var l2 = document.querySelector('.l2'); l2.onclick = function () { box.className = 'f' } var l3 = document.querySelector('.l3'); l3.onclick = function () { box.className = 'g'; // box.className = ""; // 清除类名 // box.className = 'y f'; // box.className += " ttt"; } </script> </html> 事件的绑定与取消 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件的绑定与取消</title> <style> .box { width: 100px; height: 100px; background-color: orange; border-radius: 50%; } </style> </head> <body> <div class="box"></div> <div class="box"></div> <div class="box"></div> <div class="begin">开始</div> <div class="event_on1">事件的绑定1</div> <div class="event_on2">事件的绑定2</div> </body> <script> // 每一个box点击都会toggle颜色, 当颜色都变成黑色, 取消所有点击事件, // 点击开始, 重新获得点击事件(所有状态应该重置) var beginBtn = document.querySelector('.begin'); var boxs = document.querySelectorAll('.box'); // 定义一个count计算器,计黑的个数 var count = 0; // 启动服务 beginBtn.onclick = init; // 开始功能 // function beginAction() { // // 让所有box拥有点击事件 // } // box点击切换颜色 function toggleColor() { // console.log(this) if (this.style.backgroundColor == "orange") { this.style.backgroundColor = "black"; count++; } else { this.style.backgroundColor = "orange"; count--; } // 检测是否需要结束 count == 3 && overAction(); } // 结束功能, 取消所有box点击事件 function overAction() { for (var i = 0; i < boxs.length; i++) { boxs[i].onclick = null; } } // 重置功能, 并让所有box拥有点击事件 function init() { for (var i = 0; i < boxs.length; i++) { boxs[i].style.backgroundColor = "orange"; boxs[i].onclick = toggleColor; } // 计算器重置 count = 0; } // 启动服务 // init(); </script> <script> var event_on1 = document.querySelector('.event_on1'); // 事件绑定的第一种方式 event_on1.onclick = function () { console.log(1) }; event_on1.onclick = function () { console.log(2) } // 事件绑定的第二种方式 var event_on2 = document.querySelector('.event_on2'); // 可以为一个元素绑定多个事件, 按绑定顺序依次执行 event_on2.addEventListener('click', function () { console.log("a") }); var action = function () { console.log("b") } event_on2.addEventListener('click', action); // 如何取消事件 event_on2.removeEventListener('click', action) </script> </html> 复习总结并延伸 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>复习预习</title> <style> [key='value'] { color: #0f8209; } </style> </head> <body> <div class="ele" alert="OK">div div div</div> </body> <script> // 1.面向对象js // ES5 // 普通的单一对象 var obj = { // 普通对象的属性 key: "value", fn: function () { console.log("普通对象的方法") } }; console.log(obj.key); console.log(obj["key"]); // 1.key的类型为字符串类型 // 结论: // js支持的标识符可以省略引号, 反之不可以省略 // 不支持的标识符访问方式: 不可以采用.语法,需要采用[]语法,eg:obj["background-color"] var obj1 = { "name": "obj1", // key有时候会出现js不能直接支持的标识符书写方式 // 需求: obj1用来描述页面标签的各种颜色 color: "red", // "color": "red", "background-color": "yellow" } console.log(obj1.name); console.log(obj1["name"]); console.log(obj1.color); // obj1.background = 12; // color = 10; console.log(obj1["background-color"]); // 2. 对象可以任意添加或删除属性 var obj2 = { name: "obj2" }; console.log(obj2); // 删除属性 delete obj2.name; console.log(obj2); // 添加属性 obj2.age = 8; console.log(obj2); // 拓展: 获取的页面元素就是标签对象, 可以对其添加任意属性 var ele = document.querySelector('.ele'); console.log(ele.info); // 直接使用无值, 原因ele并没有添加该属性 ele.info = "添加的属性信息"; // 添加属性 console.log(ele.info); // 添加属性后就可以正常方式添加的属性值 delete ele.info; // 删除操作 console.log(ele.info); // 删除后属性又会消失 // 构造函数 function Perple(name, age) { this.name = name; this.age = age; this.fn = function () { console.log("fn") } } // 实例化对象 var p = new Perple("张三", 18); p.fn(); // ES6 class Student { constructor (name, age) { this.name = name; this.age = age; } fn () { console.log("fn") } } var s = new Student("张三", 18); s.fn(); </script> <script> // getElementById只能由document调用 var ele = document.getElementsByClassName("ele")[0]; console.log(ele); ele = document.querySelector(".ele"); console.log(ele); ele = document.querySelectorAll(".ele")[0]; console.log(ele); // 该添加属性的方式只映射到js代码中 ele.index = 123; console.log(ele.index); // js如何操作元素(页面标签)的全局属性, 映射到html代码中 ele = document.querySelector('[alert]'); // 通过全局属性获取元素 console.log(ele); // 获取全局属性值 var info = ele.getAttribute('alert'); console.log(info); // 修改全局属性值 ele.setAttribute('alert', 'no ok'); // 添加全局属性值(映射到html代码中) => 结合CSS来控制页面标签的样式 ele.setAttribute('key', 'value'); </script> </html> 小练习 开灯关灯封装<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>开灯关灯封装</title> <style type="text/css"> .wrap { width: 280px; height: 280px; margin: 100px auto; } .wrap div { width: 55px; height: 55px; margin: 1px 1px 0 0; /*background-image: url(img/off.png);*/ background-color: black; float: left; border-radius: 20%; } .begin { width: 80px; height: 35px; background-color: dodgerblue; font: normal 20px/ 35px "STSong"; text-align: center; color: white; margin: -50px auto; border-radius: 10px; cursor: pointer; } .begin:active { background-color: deepskyblue; } </style> </head> <body> <div class="wrap"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> <div class="begin" onclick="beginGame()">开始</div> </body> <script type="text/javascript"> // 设定运用到的全局变量 var divs = null; // 存放25盏灯 var count = 0; // 记录关闭的灯的盏数 // 游戏结束功能 function gameOver() { if (count == divs.length) { var timeout = setTimeout(function() { alert("游戏结束!"); // 清除定时器 clearTimeout(timeout); }, 10); } } // 初始化操作功能 function initGame() { divs = document.querySelectorAll('.wrap div'); count = 0; for (var i = 0; i < divs.length; i++) { // 1、设置背景颜色(设置灯初始状态) // divs[i].style.backgroundImage = 'url("img/on.png")'; divs[i].style.backgroundColor = "yellow"; // 2、给每盏灯按顺序编号 divs[i].index = i; // 3、给每盏灯绑定点击事件 divs[i].onclick = eleOnclick; } } // 点击事件功能 function eleOnclick() { // 保存但前被点击的索引,以便查找出周围的元素 var index = this.index; // 自身 changeBGImg(this); // 上 if (index >= 5) { changeBGImg(divs[index - 5]); } // 下 if (index < 20) { changeBGImg(divs[index + 5]); } // 左 if (index % 5 != 0) { changeBGImg(divs[index - 1]); } // 右 if (index % 5 != 4) { changeBGImg(divs[index + 1]); } // 点击结束后检查游戏是否结束 gameOver(); } // 切换背景图片功能 function changeBGImg(ele) { // var tempImg = ele.style.backgroundImage; var tempColor = ele.style.backgroundColor; if (tempColor == "yellow") { ele.style.backgroundColor = 'black'; count++; } else{ ele.style.backgroundColor = 'yellow'; count--; } } // 游戏开始功能 function beginGame() { initGame(); } </script> </html>小练习分析<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>事件高级</title> <style> .box { width: 350px; height: 350px; margin: 100px auto 0; } .box div { width: 70px; height: 70px; background-color: yellow; border-radius: 50%; float: left; } </style> </head> <body> <div class="box"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> <script> var divs = document.querySelectorAll(".box div"); // 需要注意的点: 我们需要修改背景颜色, 背景颜色是计算后样式, // 那么getComputedStyle()获取颜色的格式需要手动处理, 而行间式不需要处理, // 且行间式不仅可以设置, 还可以修改 => 将原本计算后样式设置的更改为行间式 // 通过循环利用行间式将所有背景颜色重置 for (let i = 0; i < divs.length; i++) { divs[i].style.backgroundColor = "black"; } // 游戏的实现 for (let i = 0; i < divs.length; i++) { // 循环绑定 (问题: 变量污染) divs[i].onclick = function () { console.log(i) // toggle 颜色 => 抽离出toggle颜色的方法 // 修改自身 toggleBGColor(this); // 修改上下左右, 考虑问题, 不存在的兄弟方位 // 上, 关系i-5, 第一排没有上 i < 5 => 对立面 i >= 5均有上 if (i >= 5) { var topEle = divs[i - 5] toggleBGColor(topEle); } // 下, 关系i+5, 最后一排没有下, 对立面 i < 20 i < 20 && toggleBGColor(divs[i + 5]); // 左, 关系i-1, 第一列没有左, 对立面 i % 5 != 0 i % 5 != 0 && toggleBGColor(divs[i - 1]); // 右, 关系i+1, 最后一列没有右, 对立面 i % 5 != 4 i % 5 != 4 && toggleBGColor(divs[i + 1]); } } function toggleBGColor(ele) { var bgColor = ele.style.backgroundColor; if (bgColor == 'black') { ele.style.backgroundColor = "yellow"; } else { ele.style.backgroundColor = "black"; } } </script> </html>
2023年02月03日
9 阅读
0 评论
0 点赞
2022-12-08
利用ESP8266-12E破解钉钉WIFI打卡
钉钉越来越普及,大量的公司都在采用钉钉,同时,使用钉钉的考勤方式。 钉钉打卡方式存在一个WIFI打卡模式,需要连接指定WIFI进行打卡,识别的方式是WIFI的名称和MAC地址, ESP8266-12E是安信可官方推出的wifi模组,可以自建AP,同时还可以修改mac地址,所以就试了试使用ESP8266自建的AP来破解打卡,完美破解。 下面试破解的代码,用的arduino开发的,arduino如何安装,可看我另外一篇文章: Arduino-IDE搭建ESP8266开发环境 Arduino-IDE搭建ESP8266开发环境 代码是复制的太极创客8266 AP模式的代码,增加了设置mac地址#include <ESP8266WiFi.h> #define AP_ssid "XXXXXXXX" //这里改成公司的WIFI名称 #define password "XXXXXXXX" //密码随便,一样不一样都行 uint8_t macAddr[6] = {0x00,0x00,0x00,0x00,0x00,0x00}; //改成公司的路由器mac地址 bool flag; void setup() { // 启动串口通讯 Serial.begin(9600); Serial.println(); //设置为接入点模式 WiFi.mode(WIFI_AP); //启动AP,并设置账号和密码 Serial.printf("设置接入点中 ... "); //启动校验式网络(需要输入账号密码的网络) WiFi.softAP(AP_ssid, password); //监控状态变量result flag = WiFi.softAP(AP_ssid, password); if (flag) { Serial.println(""); // 通过串口监视器输出信息 Serial.print("当前工作模式:"); // 告知用户设备当前工作模式 Serial.println(WiFi.getMode()); Serial.print("接入点名字:"); Serial.println(AP_ssid); // 告知用户建立的接入点WiFi名 Serial.print("接入点密码:"); Serial.println(password); // 告知用户建立的接入点WiFi密码 Serial.println("接入点模式成功开启"); //不输入参数获取MAC地址 //Serial.printf("MAC地址为 %s\n", WiFi.softAPmacAddress().c_str()); //输入参数获取MAC地址 //WiFi.softAPmacAddress(macAddr); wifi_set_macaddr(SOFTAP_IF, macAddr); delay(1000); WiFi.softAPmacAddress(macAddr); Serial.printf("MAC地址为 %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); } else { //若没有开启成功 Serial.println("开启失败"); } Serial.println("初始化结束"); } void loop() {}
2022年12月08日
7 阅读
0 评论
0 点赞
2022-12-08
利用ESP8266制作钉钉WIFI打卡神器升级版
之前研究的一版破解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(); }
2022年12月08日
11 阅读
0 评论
0 点赞
2022-11-30
ESP32C3刷固件,清除Flash
打开烧录软件,按下图选择,点 OK如图,出现固件和地址选项,在 combine 文件夹下有四种 .bin 可以选择点 START,出现 等待上电同步 时长按 BOOT 此时出现下载中,待进度条走动,可松开 BOOT 键 等待烧写完成后,按 RST 键即可 烧录器、固件下载:{cloud title="" type="default" url="https://neictop-1256272185.cos.ap-guangzhou.myqcloud.com/2022/11/30/1669821489.zi" password=""/}
2022年11月30日
11 阅读
0 评论
0 点赞
2022-11-30
EPS8266刷固件,清除Flash
关于使用Arduino给8266烧录程序后,8266无法使用AT指令,刷固件教程由于之前使用8266的时候,用过Arduino烧录过程序,导致无法使用AT指令集,本文将带给大家最详细的清除Flash的教程,学不会你顺着网线来找我。在写文章之前,已经踩过很多雷了,在网上一搜如何清除Flash的时候,大多数都是使用Python,既不方便使用,也不易操作。其实安信可官方网站已经有提供了相应的固件清除程序。下载:https://docs.ai-thinker.com/esp_download在页面找到这两个,下载烧录软件和 文件。文件在页面的最下方。下载完成解压后找到这个ESP_DOWNLOAD_TOOL_V2.4.exe执行文件打开它使用:1.选择ESP82662.根据我所示的图片修改为以下的配置根据这个顺序找到相应的烧录文件填写入Download Path Config这里需要根据你自己不同的8266芯片的FLASH选择不同的FLASH的大小路径的地方选择下载的Ai-Thinker_ESP8266_DOUT_8Mbit_v1.5.4.1-a_20171130_bin文件的路径地址写0x00000下面的COM端口号,根据自己电脑选择,波特率设置为115200设置好之后,点start,烧录完成会出现FINISH即完成。这样就擦除了8266的FLASH,AT指令集可以正常使用。软件和固件打包下载:{cloud title="" type="default" url="https://neictop-1256272185.cos.ap-guangzhou.myqcloud.com/2022/11/30/1669821489.zip" password=""/}
2022年11月30日
5 阅读
0 评论
0 点赞
2022-11-21
合宙ESP32C3 的Arduino开发教程环境配置
介绍ESP32C3 和ESP32S3都是基于RISCV的内核的处理器,是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件,所以它的性能好,又因为这个开源设计所以价格极低没有授权费用。这次我使用的是合宙出的,后面会都是用自己设计的板子,板子不带CH343的加上个屏一共是22.5,当然只是当前价格。东西收到是这样,C3和S3主要还是屏幕支持上差别,比如 ESP32-C3支持QSPI 适合4.3寸以下,SPI QSPI,MCU(8080)接口的屏。ESP32-S3除了支持ESP32-C3上述接口外还支持RGB接口,对一些7寸左右屏幕提供支持性能上,ESP32C3是单核160Mhz,这种开发板标配4MB的FLASH开发环境的配置合宙ESP32C3开发板一定要安装驱动,芮然买回来,插上默认能识别到串口,并显示端口号,但是还是不能用的,一定要安装CH343驱动才行,安装成功后,合宙ESP32C3端口信息会是上图那样带CH343字样。这是开发合宙ESP32C3第一步。CH343驱动下载地址:https://www.wch.cn/downloads/CH343SER_EXE.html安装ESP32C3支持固件包如果原来Arduino IDE默认安装了ESP32支持固件包,型号列表里面是默认不带ESP32C3以及ESP32S2等型号的。ESP32支持固件包下载地址:https://github.com/espressif/arduino-esp32附上快速下载地址:如果是第一次安装ESP32支持固件,需要在Arduino IDE的菜单-文件-首选项-附加开发板网址管理器当中添加对应的链接1.https://dl.espressif.com/dl/package_esp32_index.json 2.https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json上面第一个网址是标准的ESP32开发板地址,后面那个是完整的开发板型号的地址,里面包含C3,S2等型号。如果是通过上面的github链接将支持固件包离线下载下来了,就可以忽略添加这个网址的步骤。将下载下来的ESP32支持固件包解压并放置到指定文件夹下放置路径:C:UsersAdministratorAppDataLocalArduino15packagesesp32hardwareesp321.0.6这个ESP32支持固件包下来下来压缩包有260多MB,解压后有721MB下载下来的支持固件包比默认安装的ESP32标准固件包文件要多,在拷贝到这个文件夹里面,会遇到有相同的文件的提示,出现这个情况,选择并点击 替换掉原有的文件。最关键一步来了将文件解压之后,进入到:C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\tools双击鼠标左键运行get.exe可执行文件。会弹出一个DOS界面安装窗口:一定要看到全部安装了上图那些内容才算成功,不然在Arduino IDE里面有可能看不到ESP32C3 /S2等型号的ESP32,或者就是有显示ESP32C3,S2等型号,但是选择这些型号,在进行代码编译,到最后会报错:esptool.exe": file does not exist其他相关建议在安装完驱动后,或者在点击get.exe运行时安装不全就退出的情况时,建议重启电脑,并再次尝试安装,get.exe安装一定要看到安装齐全才行,安装窗口界面,安装完,会自动关闭的,安装的时候一定要留心安装完整了。我在这个地方就踩过坑,以为自动安装的,安装完了,就没有问题了,以为可以看到能选择ESP32C3的型号的出现就可以使用了,结果跑去编译代码,到最后还是会报错,后面重启电脑,重新运行get.exe,看着窗口安装,并截图下来了,以此作为安装依据。当然最后成功编译,并烧录了第一个程序。Creating esp32c3 image... Merged 2 ELF sections Successfully created esp32c3 image. "C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.6/tools/gen_esp32part.exe" -q "d:\\arduino\\MyHexDir/partitions.csv" "d:\\arduino\\MyHexDir/Blink.ino.partitions.bin" "C:\\Users\\Administrator\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.6/tools/riscv32-esp-elf/bin/riscv32-esp-elf-size" -A "d:\\arduino\\MyHexDir/Blink.ino.elf" 项目使用了 232580 字节,占用了 (17%) 程序存储空间。最大为 1310720 字节。 全局变量使用了10156字节,(3%)的动态内存,余留317524字节局部变量。最大为327680字节。 C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/esptool/esptool.exe --chip esp32c3 --port COM5 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x0 d:\arduino\MyHexDir/Blink.ino.bootloader.bin 0x8000 d:\arduino\MyHexDir/Blink.ino.partitions.bin 0xe000 C:\Users\Administrator\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6/tools/partitions/boot_app0.bin 0x10000 d:\arduino\MyHexDir/Blink.ino.bin esptool.py v3.3 Serial port COM5 Connecting.... Chip is ESP32-C3 (revision 3) Features: Wi-Fi Crystal is 40MHz MAC: 60:55:f9:79:87:98 Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. Configuring flash size... Flash will be erased from 0x00000000 to 0x00002fff...烧录时选择flash模式为DIO
2022年11月21日
209 阅读
0 评论
0 点赞
1
2
3
网站已运行
00
天
00
时
00
分
00
秒
Powered by
Typecho
※ Theme is
RST网络