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 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目