esp8266服务器网页设计,ESP8266-WebMaster

ESP8266-WebMaster

介绍

ESP8266上的web服务器,这套代码的目的是在ESP8266上实现一个web服务器,以便通过web页面来控制ESP8266

已知问题

内存优化没有完成,网上流传的内存优化方法试用一些,但是没有效果。短时间内连续点击链接会导致内存问题而重启

因为ESP8266只有1个信道,当sta和ap共存时,会将ap的信道自动调整成和sta一样,因此从web端设置ap信道变得没什么意义

WiFi扫描必须得在sta通道空闲时使用,因此wifi扫描时会暂时关闭sta,(受ESP8266只有1个信道的影响)这导致ap的信道可能会发生变化,导致ap连接可能暂时中断

ESP8266在设定的wifi查找不到的时候,会重新尝试扫描并连接,这个过程中,受只有1个信道的影响,ap连接不稳定

版本更新

2019-05-30 0.0.5

增加从web读取串口接收数据的功能,web端只能查看最后一次收到的数据,但串口接收数据在程序里设计只保存5分钟(为节省内存使用),超时则读取不到

增加从web控制GPIO的功能,包括GPIO高低电平控制,input模式阵脚的输入值读取,和模拟量读取

使webchecker的信号灯可以通过web页面重新配置,重新定义到其他针脚

2019-05-28 0.0.4

完善web向串口发送数据功能

增加从web读取串口接收到的数据功能,数据只保持越5分钟,可在宏定义中修改

修正可能出现错误输出的os_sprintf使用

2019-05-28 0.0.3

修改系统读秒为软件定时器

实现从web提交数据到串口输出

修正可能出现错误输出的os_sprintf使用

2019-05-28 0.0.2

将软件定时器的检查点任务改到用户任务中执行

重新定义了系统读秒函数,直接注册为硬件定时器中断回调函数,也可以作为软件定时器的回调函数。

这个改动是为了尝试节省宝贵的硬件定时器。

2019-05-27 初始版本 0.0.1

实现了一个可用的简单web服务器,核心功能在 my_http_server.c文件

在my_html_common.c中的my_html_pages函数中,配置好自定义的html处理函数即可

html处理函数必须是无参数、无返回值的函数,函数结尾处要手动调用my_HTTP_Server_cache_header写入http响应头和my_HTTP_Server_send_cache发送缓存

当前版本代码没有彻底清理,部分代码文件并无实际用处,仅用于参考

当前版本使用硬件计时器读秒,作为整个系统的时间戳使用,因此无法同时输出PWM。要释放对硬件计时器的占用,需要修改代码,必须使系统读秒操作有替代方案

对GPIO做了简单封装,但仅限于GPIO操作,代码在my_gpio.c

已实现的web控制功能:登录验证、sntp配置、wifi扫描、sta配置、ap配置、系统时间间隔设置、系统配置重置

附带一个网站检查器,用于检测目标网站是否可以正常访问(就是为了实现这个简单的功能,最终有了这套代码)。

没有实现的功能:更复杂的设置、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

使用说明

芯片:ESP8266

SDK: NONOS SDK 2.2.1

开发板:Wemos D1 R2 (4Mb),理论上只要是ESP8266芯片的开发板都可用

开发环境:直接使用安信可的开发环境,因为直接基于官方SDK,理论上可直接使用官方的Linux环境

程序入口:my_main.c文件中的my_initAll函数

Web服务器主程序在 my_http_server.c文件

这套代码使用一个软件定时器读秒作为时钟使用

使用一个用户任务处理Web服务器以外的操作

my_html 开头的文件是HTML页面处理函数

关键函数

关键函数说明:

my_initAll(位置:my_main.c)

这个函数用于全局初始化使用,被sdk的用户初始化函数调用。单独设计这么个函数是为了让程序结构更清晰一点。

所有的启动时初始化操作都要在这个函数里面完成。

my_Check_Point_init(位置:my_check_point.c)

实际上就是一个软件定时器初始化函数。当前版本使用软件定时器作为定时任务使用,然后将my_SYS_daemon这个函数作为参数传给定时器回调函数。

my_SYS_daemon(位置:my_daemon.c)

这个函数是整个系统的主执行函数,负责监控并运行各个模块功能

my_html_pages(位置:my_html_common.c)

自定义的html页面函数要注册到这个函数中的结构数组中,以供http 服务器使用

html页面处理函数 my_html_XXXX_do (位置:my_html_XXXX.c)

还没有对代码进行优化,因此当前版本中,需要在页面处理函数结尾处手动调用发送函数。

my_HTTP_Server_cache_header(200);//http头

my_HTTP_Server_send_cache();//发送缓存

my_uart_receive_task(位置:my_uart.c)

这是用于uart接收数据处理的函数,按照sdk要求定义的任务函数。已对sdk中文件进行修改,只需要在这里处理串口接收到数据即可。

字符串处理函数(位置:my_string.c)

实现了一些字符串的处理函数。但因为部分函数需要内存操作,频繁调用可能引发内存错误。

my_Task_do(位置:my_task.c)

用户任务回调函数,会执行注册到my_sys.my_task.P_Task所指向的函数。

my_Task_init(位置:my_task.c)

用户任务初始化函数,需要传入任务中要执行的函数。

10.my_Str_URL_ES2CE URL特殊字符处理,把转义字符串替换成真实字符

参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md

GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目