Starting with ESP8266(5)–Simple HTTP configure server

ESP8266 Non-OS SDK开发探坑之五-简单的HTTP配置服务器

Starting with ESP8266 — Light a LED

Starting with ESP8266 (2)–Touch to control relay status-circuit design & electronic components selection

Starting with ESP8266(3) — Touch to control Relay-Programming & PCB design

Starting with ESP8266(4)–User parameters securely save & load on flash

Starting with ESP8266(5)–Simple HTTP configure server

经过一段时间的折腾,总算把esp8266搞入门了,开始正式开发了

esp8266的模块要联网进行控制,首先肯定是得配置wifi信息,

1、原始的方法是写到代码里,定义个宏,定义个变量。。。

2、串口通信方式、AT指令之类的。。。

3、初始化softAP模式,然后提供个tcpserver,由手机app实现TCP传输配置,这个目前产品上用的比较多,在需要断开家里wifi连上设备wifi配置完再重连家里wifi的都属这一类

4、初始化SoftAP模式,然后提供webserver,由手机通过浏览器访问进行配置,这个是本文实现的方法

5、airkiss,这个比较便捷,产品上也用的比较多,不需要断开任何wifi,直接进行一段时间的扫描、广播、配置。

其中1、2方法显然只适合diy人士,做产品是不行的,3、4、5方法各有优劣,3缺点是需要安装app,优点是交互性好,4缺点是界面不友好(UI都需要esp8266提供),配置过程略繁琐,但是只要一部手机就能配置,不用下载app,5的原理还蛮有意思,巧妙利用了无线传输物理层某些字段明文传输,并且包数据长length字段可由应用层控制的特点进行信息传输,当然安全性不太高,理论上只要能接收到信号都能解析,毕竟是明文传输,但是比较方便,有新设备加入,只需要一台设备能发送对应的信息即可完成配置,几乎不需要人工介入。

前几篇充满了对esp8266的吐槽,不过随着深入了解,对esp8266更多了些喜欢,麻雀虽小,五脏俱全,esp8266具备了实现上述5种方法的软硬件基础,而且官方也给了接口和例程,所以难度就小了很多。

为了探坑,我决定造轮子。。。。。。写个简单的HTTP Server完成初始化配置, 同时完成tcp客户端定时上传数据,和tcp服务端远程控制的功能。

这篇先讲WebServer,及其配套的方法,下一篇再说下TCP Server和Client

简单说说可行性,HTTP协议比较简单,基于TCP协议,只要能开启TCP服务即可实现Web服务,显然ESP8266的能力完全可以cover,那便只要开启TCP服务,监听某端口,能监听80便是最好,然后在接收回调里完成请求解析、头部信息解析,数据提取,以及发送响应结果。这里我只实现最基本的HTTP协议内容,完成基本网页通信,也就是解析了头部的GET、POST请求,解析Conten-Length字段,实现响应重定向Location,并自定义了很基础的几个html静态页面。其实内存够大,完全可以把页面弄的很华丽,就是有点没必要了。

先初始化web服务

当有客户端连接执行回调:

其中定义了几个回调。

重点是接收回调:

接收回调里先是提取HTTP的方法(GET、POST)和请求的URL地址及参数,提取后放在传入指针 URLParam里。

如果是POST方法,则提取post数据,就是判断HTTP头部结尾标识\r\n\r\n,并比对Content-Length字段里的长度信息,

再提取post参数并组装成json对象,这样解析方便并且将来可以和TCP server的参数解析方法统一,目前没这么做。其中用到了cjson库,关于cjson库的移植参考了博客:

https://blog.csdn.net/yannanxiu/article/details/52713746

完成上述解析后,即可对请求进行处理并相应,为了节省内存空间,定义了很多static const char数组对象,这些对象一般存在flash上,用的时候才加载到内存。响应函数如下

支持状态码成功(200 SUCCESS),重定向(301 REDIRECTION),错误的请求(400 BAD REQUEST),服务器错误(500 SERVER INTERNAL ERROR)等简单的状态。由于在接收回调函数中不便于进行一些操作,比如和wifi状态相关的对象操作或者espconn对象的操作,所以开启任务队列进行处理:

手机连上ESP8266 AP后访问html页面:

插播下我重打的板:

AC-DC继电器控制版

DC-DC继电器控制版

 

实物还得等打板,好慢。

代码见:  ESP8266_NONOS_SDK-2.2.1-WebServer

https://github.com/atp798/BlogStraka/

发表评论