一个使用ESP32S3作为wifi小服务器的项目。
- ESP32S3-WROOM-1 N16R8
16MB flash 8MB RAM - VScode 版本:1.91.0
- ESP-IDF vscode 扩展 版本:v1.8.0
不知道是不是必要项:
- ESP32S3 N16R8
- Ubuntu 22.04.4 LTS
- ESP-IDF 版本:v5.3-beta2
版本更新可能忘记修改。
带“*”标识的配置为必要配置
请创建./main/wifi.inl文件,内容如下:
constexpr char WIFISSID[32] = "your wifi ssid";
constexpr char WIFIPASSWORD[64] = "your wifi password";
constexpr char APSSID[32] = "ESP32S3";
constexpr char APPASSWORD[64] = "12345678";
请勿上传你的wifi名称及密码,避免泄露信息!
编译烧录完成后请在浏览器打开/file
管理页面。建立serverPath
(默认值:server
)目录。然后将./main/server/web下的文件和目录依次上传。
修改./main/main.cpp里app_main
中的startPWM((gpio_num_t)1);
为LED正极GPIO的引脚编号。
碎碎念:记得加限流电阻,3.3v直连LED有可能将其烧毁!
./main/main.cpp中有void setIo0();
,可自定义。在本项目中,IO0用于无网络下启动Ap并启动服务端。
文件位置: ./partitions.csv
fat分区与./main/fat.hpp中的FlashPartitionLabel
相同,确保成功挂载。
flash、mem挂载点均由./main/vfs/hpp中的对应变量指定。
设备 | 配置项 | 默认挂载点 |
---|---|---|
内置fat分区 (大小设定参照分区表一节) |
PerfixFlash | /root |
内存 | PerfixMem | /root/mem |
服务器访问根目录由./main/vfs/hpp中的PerfixRoot
决定。
服务器默认访问目录由./main/server/server.cpp中的ServerPath
决定。
URI中直接就是路径的普通用户访问被限制在serverPath
目录下
URI中含file的管理用户访问提高到PerfixRoot
目录下
管理用户有权访问普通目录,应此serverPath
在PerfixRoot
下
例如:
http://esp32s3.local/testFloor/testFile 将访问PerfixRoot/ServerPath/testFloor/testFile
http://esp32s3.local/file/testFloor/testFile 将访问PerfixRoot/testFloor/testFile
为了权限分离,也为了方便普通用户,加入不同的用户级别。但这目前仅限于脑中假想,目前没有任何用户级的权限限制。给未来打地基了属于是。
ESP-IDF限制。ESP-IDF要求挂载点以“/”开头,至少两个字符。意味着必须有一个目录(PerfixRoot
)作为虚拟“根”目录。
对于文档中所述例外情况,限于水平问题我没弄成功。所以退而求其次加入虚拟的根目录。
./main/server/server.cpp中的formatingPassword
设置地址:./main/server/server.cpp中的MDnsName
设置服务:./main/server/mDns.cpp里mDnsStart
、mDnsAdd
中的对于函数参数
该部分代码大部分来源于IDF文档,建议结合文档修改。
mDNS项目
接入TCP并放入window中,等待coWorker
的处理
coWorker
同一时间只能处理一个请求。大型请求(GET和PUT)内部会有delay函数避免挤占资源导致其他请求无法响应。
最大连接数:./main/server/server.cpp中的socketStreamWindowNumber
。
请注意:LWIP最大支持16个socket,默认10个socket。修改最大连接数时记得留心LWIP设定。
coWorker
数:./main/server/server.cpp中的coworkerNumber
。
请注意ESP32S3为双核SoC,增加的并发数不一定能提高性能。但能缓解大型请求下的资源挤占问题。
socketStream缓存:./main/server/head/socketStream.hpp中的SocketStreamBufferSize
。决定socketStream
的缓存数量。socketStream
是本项目中所有网络相关的基础,提供最基本的read
、write
函数。提高缓存有利于增加性能。(虽然我估计影响不大)
URI解析缓存:./main/server/head/http.hpp中的HttpUrlBufferLenght
。决定URI的最大长度。
Reason缓存:./main/server/head/http.hpp中的HttpReasonBufferLenght
。决定解析响应时的最大长度
Head缓存:./main/server/head/http.hpp中的HttpHeadsBufferLenght
。决定解析Http Head时每行(没个Http Head)的最大长度。
发送文件缓存:./main/server/head/http.hpp中的HttpBodySendingBufferLenght
。决定发送Http请求时文件的读取缓存。更大的数字可使coWorker
一次发送更多内容,减少发送次数与delay时间,有利于提高整体性能。
PUT缓存:./main/server/server.cpp中的PutBufferSize
。决定PUT时服务器的读取缓存。更大的数字可使coWorker
一次读取更多内容,减少接收次数与delay时间,有利于提高整体性能。
请注意:缓存由于速度、管理方便大部分都在线程的栈上。过大的缓存可能导致栈溢出错误和小型处理时空间的浪费。
PUT的最大限制:./main/server/server.cpp中的PutMaxSize
。
Mem文件系统中的最大限制:./main/mem.hpp中的MemFileMaxSize
。
想不起来了,到时候再说
由./main/server/server.cpp中的对应函数处理。除GET外基本目录都对应PerfixRoot
- GET请求
由httpGet
处理。解析URI,若URI为/file
、/File
、/FILE
则返回管理页面;若URI以/file/
、/File/
、/FILE/
开头则返回PerfixRoot
下的对应文件;其余情况返回PerfixRoot/ServerPath
下的对应文件。 - PUT请求
由httpPut
处理。解析URI,若URI以'/'结尾则建立目录;否则打开并写入文件。 - DELETE请求
由httpDelete
处理。解析URI,尝试删除对应文件或目录。 - POST请求
-
/api/setLightLevel
设定PWM占比从而设置LED亮度。
请求的body为PWM占比。
-
/api/getLightLevel
获取PWM占比。
响应的body为PWM占比。
-
/api/getTemperature
获取内部温度。
响应的body为内部温度。
-
/api/floor
获取目录信息。
请求的body为目录,如“/server”。
响应的body为目录信息,每行一个内容,以“/”结尾的为目录,其余为文件。
-
/api/getSpaece
获取Fat文件系统的空间信息。
响应的body为空间信息,两个数字由“,”分割,前一个为可用空间,后一个为总空间。
-
/api/wifiScan
扫描wifi
响应的body为扫描到的wifi,每行一个wifi。“:”前为wifi的rssi,后为wifi的SSID
-
/api/wifiStart
启动wifi
请求的body可为空,连接编译时指定的wifi
请求body第一行为wifi的SSID,第二行为wifi的密码
-
/api/wifiStop
关闭wifi
-
/api/apStart
启动AP
请求的body可为空,连接编译时指定的Ap
请求body第一行为Ap的SSID,第二行为Ap的密码
-
/api/apStop
关闭Ap
-
/api/serverOff
关闭wifi、服务器功能
再次开启请使用IO0按钮(见上文)
-
/api/formatFlash
请求的body为格式化密码(设置见上文)
响应的body为格式化情况
ESP-IDF
使用Apache License 2.0
协议。未对其进行任何修改。项目连接:https://github.com/espressif/esp-idf
本项目wifihostB
使用GPL-3.0 license
协议
新人一个,协议方面不熟。讲究一个无脑GPL3做最开源的一次。
A是废弃项目,还没来得及开源。它和esp-led都是B的前身。只不过A的代码太烂了,LED的代码太过于偏向测试了,所以重新开了B的项目。C只是重写了wifi部分的代码。将来的某个时间B过于零乱的时候或许D就会出现。
纯纯懒的,对项目没有影响。
- 一个管理密码的页面
- 一个小型数据库的页面
- 权限分离与账户登录
- 聊天页面
- 小游戏服务端(可能是单独的项目,而且客户端还遥遥无期)
- ...