# ESP8266-WebMaster **Repository Path**: polygithub/ESP8266-WebMaster ## Basic Information - **Project Name**: ESP8266-WebMaster - **Description**: ESP8266上的web服务器,这套代码的目的是在ESP8266上实现一个web服务器,以便通过web页面来控制ESP8266 - **Primary Language**: C - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-09-13 - **Last Updated**: 2025-03-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP8266-WebMaster #### 介绍 ESP8266上的web服务器,这套代码的目的是在ESP8266上实现一个web服务器,以便通过web页面来控制ESP8266 #### 已知问题 1. 内存优化没有完成,网上流传的内存优化方法试用一些,但是没有效果。短时间内连续点击链接会导致内存问题而重启 2. 因为ESP8266只有1个信道,当sta和ap共存时,会将ap的信道自动调整成和sta一样,因此从web端设置ap信道变得没什么意义 3. WiFi扫描必须得在sta通道空闲时使用,因此wifi扫描时会暂时关闭sta,(受ESP8266只有1个信道的影响)这导致ap的信道可能会发生变化,导致ap连接可能暂时中断 4. ESP8266在设定的wifi查找不到的时候,会重新尝试扫描并连接,这个过程中,受只有1个信道的影响,ap连接不稳定 #### 版本更新 ---------- 2019-05-30 0.0.5 1. 增加从web读取串口接收数据的功能,web端只能查看最后一次收到的数据,但串口接收数据在程序里设计只保存5分钟(为节省内存使用),超时则读取不到 2. 增加从web控制GPIO的功能,包括GPIO高低电平控制,input模式阵脚的输入值读取,和模拟量读取 3. 使webchecker的信号灯可以通过web页面重新配置,重新定义到其他针脚 ---------- 2019-05-28 0.0.4 1. 完善web向串口发送数据功能 2. 增加从web读取串口接收到的数据功能,数据只保持越5分钟,可在宏定义中修改 3. 修正可能出现错误输出的os_sprintf使用 ---------- 2019-05-28 0.0.3 1. 修改系统读秒为软件定时器 2. 实现从web提交数据到串口输出 3. 修正可能出现错误输出的os_sprintf使用 ---------- 2019-05-28 0.0.2 1. 将软件定时器的检查点任务改到用户任务中执行 2. 重新定义了系统读秒函数,直接注册为硬件定时器中断回调函数,也可以作为软件定时器的回调函数。 这个改动是为了尝试节省宝贵的硬件定时器。 ---------- 2019-05-27 初始版本 0.0.1 1. 实现了一个可用的简单web服务器,核心功能在 my_http_server.c文件 2. 在my_html_common.c中的my_html_pages函数中,配置好自定义的html处理函数即可 3. html处理函数必须是无参数、无返回值的函数,函数结尾处要手动调用my_HTTP_Server_cache_header写入http响应头和my_HTTP_Server_send_cache发送缓存 4. 当前版本代码没有彻底清理,部分代码文件并无实际用处,仅用于参考 5. 当前版本使用硬件计时器读秒,作为整个系统的时间戳使用,因此无法同时输出PWM。要释放对硬件计时器的占用,需要修改代码,必须使系统读秒操作有替代方案 6. 对GPIO做了简单封装,但仅限于GPIO操作,代码在my_gpio.c 7. 已实现的web控制功能:登录验证、sntp配置、wifi扫描、sta配置、ap配置、系统时间间隔设置、系统配置重置 8. 附带一个网站检查器,用于检测目标网站是否可以正常访问(就是为了实现这个简单的功能,最终有了这套代码)。 9. 没有实现的功能:更复杂的设置、HTTPS、网页端的GPIO控制、url和html转义字符处理 10.使用os_sprintf函数处理各种缓存。 11.http缓存有三个,一个用来处理http头,一个用来处理body,一个用来整合头和body。理论上可以分多次发送,但是实际测试发现只有一次完全发送才稳定。 因为要计算body长度,因此必须先写完body,再生成头,最后整合数据,发送。 12.自定义的html处理函数必须要把html字符串写入body缓存,必须按如下形式调用,其中msg为html字符串: my_sys.http_session.P_cache_body += os_sprintf(my_sys.http_session.P_cache_body, msg); 13.修改宏定义中的项目名称和版本号,在初次上电时会触发系统配置初始化操作 14.为方便测试,挂了一个arduino的扩展板,相关代码没有清理 ---------- #### 软件架构 SDK 版本:ESP8266_NONOS_SDK-2.2.1 代码路径:/app/user #### 使用说明 1. 芯片:ESP8266 2. SDK: NONOS SDK 2.2.1 3. 开发板:Wemos D1 R2 (4Mb),理论上只要是ESP8266芯片的开发板都可用 4. 开发环境:直接使用安信可的开发环境,因为直接基于官方SDK,理论上可直接使用官方的Linux环境 5. 程序入口:my_main.c文件中的my_initAll函数 6. Web服务器主程序在 my_http_server.c文件 7. 这套代码使用一个软件定时器读秒作为时钟使用 8. 使用一个用户任务处理Web服务器以外的操作 9. my_html 开头的文件是HTML页面处理函数 #### 关键函数 关键函数说明: 1. my_initAll(位置:my_main.c) 这个函数用于全局初始化使用,被sdk的用户初始化函数调用。单独设计这么个函数是为了让程序结构更清晰一点。 所有的启动时初始化操作都要在这个函数里面完成。 2. my_Check_Point_init(位置:my_check_point.c) 实际上就是一个软件定时器初始化函数。当前版本使用软件定时器作为定时任务使用,然后将my_SYS_daemon这个函数作为参数传给定时器回调函数。 3. my_SYS_daemon(位置:my_daemon.c) 这个函数是整个系统的主执行函数,负责监控并运行各个模块功能 4. my_html_pages(位置:my_html_common.c) 自定义的html页面函数要注册到这个函数中的结构数组中,以供http 服务器使用 5. html页面处理函数 my_html_XXXX_do (位置:my_html_XXXX.c) 还没有对代码进行优化,因此当前版本中,需要在页面处理函数结尾处手动调用发送函数。 my_HTTP_Server_cache_header(200);//http头 my_HTTP_Server_send_cache();//发送缓存 6. my_uart_receive_task(位置:my_uart.c) 这是用于uart接收数据处理的函数,按照sdk要求定义的任务函数。已对sdk中文件进行修改,只需要在这里处理串口接收到数据即可。 7. 字符串处理函数(位置:my_string.c) 实现了一些字符串的处理函数。但因为部分函数需要内存操作,频繁调用可能引发内存错误。 8. my_Task_do(位置:my_task.c) 用户任务回调函数,会执行注册到my_sys.my_task.P_Task所指向的函数。 9. my_Task_init(位置:my_task.c) 用户任务初始化函数,需要传入任务中要执行的函数。 10.my_Str_URL_ES2CE URL特殊字符处理,把转义字符串替换成真实字符 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)