目录
第一件事:当文件系统中 没有 网页文件 时,提供一个简易的上传文件界面:
当文件系统中 有网页文件优先 读取网页文件,这样方便更改网页页面设计
第二件事 :和上传文件也相关 ,因为要根据上传的文件来 升级 OTA
其他类似芯片其实都可以按这个流程去走,网络模块嘛,要利用好.
原理很简单: web 发送一个请求 给 单片机服务器 单片机服务器处理请求
考虑到你可能不知道单片机服务器怎么部署(这里用esp8266)举例 代码如下
第二句:我准备让它 骑马(GET),信件内容(字符串格式),true(人出去了就不管了,做我其他事去-异步)
当填入内容为 你好 时 请求网址: http://ip地址/MQTT?dz=你好
文件管理处理一些请求的案例代码(范本代码-来源于网络|太极创客):
web 处理啥的安装一个库就解决,就是那个界面属实"------"
` 其实想开发这些单片机啥的,现在已经很简单了,以前我们是看不懂代码,又没什么资源,找人问吧,一句两句问不明白.
现在好了,用vscode 再配置一个AI 得,直接生成,看不懂的直接叫AI加上中文注释,再怎么说中文注释看得懂吧.
一:ESP8266 相关经验总结
主要还是讲讲ESP8266吧,开发板其实都大差不差的!
经过很长时间的 "蹂躏",总结了以下小技巧:
最好是把其封装成 库文件,方便自己重复调用
- 首先写 文件系统 相关处理
- web 服务器 相关处理
- 配网这一块强烈建议用这个库 #include <WiFiManager.h>
就这两个就非常实用了,首先是web服务器只需要做2件事就好
第一件事:当文件系统中 没有 网页文件 时,提供一个简易的上传文件界面:
当文件系统中 有网页文件优先 读取网页文件,这样方便更改网页页面设计
第二件事 :和上传文件也相关 ,因为要根据上传的文件来 升级 OTA
这样就可以局域网内部更新代码而不用手动去复位什么的.
其他类似芯片其实都可以按这个流程去走,网络模块嘛,要利用好.
二:关于web网页和ESP8266 类似单片机通信
原理很简单: web 发送一个请求 给 单片机服务器 单片机服务器处理请求
考虑到你可能不知道单片机服务器怎么部署(这里用esp8266)举例 代码如下
加载库文件: #include <ESP8266WebServer.h>
设置服务器端口:ESP8266WebServer server(80);
在初始设置中激活(void setup(){放这里面}): server.begin();
设置请求发生时应该由谁处理: server.onNotFound(HTTPA);
这是一个一劳永逸的办法,任何请求都会调用 HTTPA 这个 自命名 函数;
实际上还可以这样写: server.on("/",HTTPA);
弊端:不处理 这种请求 http://192.168.100.103/t8
想要处理这种请求 又得单独写 server.on("/t8",HTTPA);
好处是不用重复的 if 判断 请求是 谁谁谁 结尾 ,可能处理速度会更快
小重点 void loop(){这里面一定要有}: server.handleClient(); // 监听服务 不然web 没反应
WEB网页上 关键代码举例:
这不是唯一方法,但是 简单 好理解
第一句: 给浏览器说 我要一个新的 人 送信;
第二句:我准备让它 骑马(GET),信件内容(字符串格式),true(人出去了就不管了,做我其他事去-异步)
如果是false(我要等它回来了我再做其他事)
第三句:这个人出门了
单片机服务器处理代码举例:
大致意思就是这个人到了邮局,邮局看这个信是给谁的 ,再分发下去.(有点笼统了)
看看标准的请求格式:你就理解了:
实际上就是一个网址,上面代码 获取了这个请求,然后判断最后是不是这个格式
根据我这个来请求地址 (http://192.168.100.103/t8)来分析,代码应该这样写
首先是获取这个请求网址:String text = server.uri();
再分析其结尾是不是这个样式: if( text.endsWith("/t8") ){满足条件后做什么事}
这里就不得不说表单的处理
<form class="fr">
<span>MQTT服务器:</span>
<input type="text" id="mqtt" name="dz" placeholder="填入服务器地址">
<button type="button" οnclick="connected()">连接</button>
</form>
这里按钮设置为不触发 表单提交后自动跳转到其他页面
这里请求代码和之前一样
var getc = document.getElementById('mqtt').value; 获取填写的内容给getc
var xhr = new XMLHttpRequest();
var str = "/MQTT?dz="+ getc; 拼接请求体
xhr.open("GET", str, false);
xhr.send();
当填入内容为 你好 时 请求网址: http://ip地址/MQTT?dz=你好
单片机服务端像这样处理表单:
String text = server.uri(); 获取网址:http://ip地址/MQTT?dz=你好
if (text.endsWith("/MQTT")) 处理网址
{
String webget = server.arg("dz");获取dz的值 : 你好
现在webget=你好
}
文件管理处理一些请求的案例代码(范本代码-来源于网络|太极创客):
File file = SPIFFS.open(path, "r"); // 则尝试打开该文件
server.streamFile(file, contentType);// 并且将该文件返回给浏览器
// 获取文件类型
String getContentType(String filename){
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";
}
// 处理上传文件函数
void handleFileUpload(){
HTTPUpload& upload = esp8266_server.upload();
if(upload.status == UPLOAD_FILE_START){ // 如果上传状态为UPLOAD_FILE_START
String filename = upload.filename; // 建立字符串变量用于存放上传文件名
if(!filename.startsWith("/")) filename = "/" + filename; // 为上传文件名前加上"/"
Serial.println("File Name: " + filename); // 通过串口监视器输出上传文件的名称
fsUploadFile = SPIFFS.open(filename, "w"); // 在SPIFFS中建立文件用于写入用户上传的文件数据
} else if(upload.status == UPLOAD_FILE_WRITE){ // 如果上传状态为UPLOAD_FILE_WRITE
if(fsUploadFile)
fsUploadFile.write(upload.buf, upload.currentSize); // 向SPIFFS文件写入浏览器发来的文件数据
} else if(upload.status == UPLOAD_FILE_END){ // 如果上传状态为UPLOAD_FILE_END
if(fsUploadFile) { // 如果文件成功建立
fsUploadFile.close(); // 将文件关闭
Serial.println(" Size: "+ upload.totalSize); // 通过串口监视器输出文件大小
esp8266_server.sendHeader("Location","/success.html"); // 将浏览器跳转到/success.html(成功上传页面)
esp8266_server.send(303); // 发送相应代码303(重定向到新页面)
} else { // 如果文件未能成功建立
Serial.println("File upload failed"); // 通过串口监视器输出报错信息
esp8266_server.send(500, "text/plain", "500: couldn't create file"); // 向浏览器发送相应代码500(服务器错误)
}
}
}
MicroPython :
直接一个 python小型系统堆上去了 ,
web 处理啥的安装一个库就解决,就是那个界面属实"------"
其他
` 其实想开发这些单片机啥的,现在已经很简单了,以前我们是看不懂代码,又没什么资源,找人问吧,一句两句问不明白.
现在好了,用vscode 再配置一个AI 得,直接生成,看不懂的直接叫AI加上中文注释,再怎么说中文注释看得懂吧.
不用去关心为什么去这么写,直接拿到答案,改一改.就成了.
光学不练,假把式. 没几天就忘了.
直接做项目,代码靠AI ,自己缝缝补补,印象深.
我就是吃了亏,python,arduino,c++,web ,同步开拔 到头来 全忘了..............
别看我发了这么多博客,其实我只是记性差,找个地方存储记忆,万一以后用得上,回来找找,不就完美了嘛!