mirror of
https://github.com/me-no-dev/ESPAsyncWebServer.git
synced 2025-07-29 18:27:34 +02:00
feat: add rp2040 support
This commit is contained in:
committed by
Mathieu Carbou
parent
e3eb2b1044
commit
1af677d88b
9
.github/workflows/ci.yml
vendored
9
.github/workflows/ci.yml
vendored
@ -28,7 +28,10 @@ jobs:
|
||||
- core: esp8266:esp8266
|
||||
board: esp8266:esp8266:huzzah
|
||||
index_url: https://arduino.esp8266.com/stable/package_esp8266com_index.json
|
||||
|
||||
- name: package_rp2040_index.json
|
||||
core: rp2040:rp2040
|
||||
board: rp2040:rp2040:rpipicow
|
||||
index_url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@ -55,6 +58,10 @@ jobs:
|
||||
if: ${{ matrix.core == 'esp8266:esp8266' }}
|
||||
run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/esphome-ESPAsyncTCP#v2.0.0
|
||||
|
||||
- name: Install AsyncTCP (RP2040)
|
||||
if: ${{ matrix.core == 'rp2040:rp2040' }}
|
||||
run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/khoih-prog/AsyncTCP_RP2040W#v1.2.0
|
||||
|
||||
- name: Build CaptivePortal
|
||||
run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/CaptivePortal/CaptivePortal.ino"
|
||||
|
||||
|
@ -4,13 +4,14 @@
|
||||
[](https://github.com/mathieucarbou/ESPAsyncWebServer/actions/workflows/ci.yml)
|
||||
[](https://registry.platformio.org/libraries/mathieucarbou/ESP%20Async%20WebServer)
|
||||
|
||||
Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266
|
||||
Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266 and RP2040
|
||||
Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc.
|
||||
|
||||
This fork is based on [yubox-node-org/ESPAsyncWebServer](https://github.com/yubox-node-org/ESPAsyncWebServer) and includes all the concurrency fixes.
|
||||
|
||||
## Changes in this fork
|
||||
|
||||
- [@ayushsharma82](https://github.com/ayushsharma82) and [@mathieucarbou](https://github.com/mathieucarbou): Add RP2040 support ([#31](https://github.com/mathieucarbou/ESPAsyncWebServer/pull/31))
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `SSE_MAX_QUEUED_MESSAGES` to control the maximum number of messages that can be queued for a SSE client
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `write()` function public in `AsyncEventSource.h`
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `WS_MAX_QUEUED_MESSAGES`: control the maximum number of messages that can be queued for a Websocket client
|
||||
|
@ -1,7 +1,7 @@
|
||||
# bundle exec jekyll serve --host=0.0.0.0
|
||||
|
||||
title: ESP Async WebServer
|
||||
description: "Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266"
|
||||
description: "Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266 and RP2040"
|
||||
remote_theme: pages-themes/cayman@v0.2.0
|
||||
plugins:
|
||||
- jekyll-remote-theme
|
||||
|
@ -4,13 +4,14 @@
|
||||
[](https://github.com/mathieucarbou/ESPAsyncWebServer/actions/workflows/ci.yml)
|
||||
[](https://registry.platformio.org/libraries/mathieucarbou/ESP%20Async%20WebServer)
|
||||
|
||||
Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266
|
||||
Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266 and RP2040
|
||||
Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc.
|
||||
|
||||
This fork is based on [yubox-node-org/ESPAsyncWebServer](https://github.com/yubox-node-org/ESPAsyncWebServer) and includes all the concurrency fixes.
|
||||
|
||||
## Changes in this fork
|
||||
|
||||
- [@ayushsharma82](https://github.com/ayushsharma82) and [@mathieucarbou](https://github.com/mathieucarbou): Add RP2040 support ([#31](https://github.com/mathieucarbou/ESPAsyncWebServer/pull/31))
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `SSE_MAX_QUEUED_MESSAGES` to control the maximum number of messages that can be queued for a SSE client
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `write()` function public in `AsyncEventSource.h`
|
||||
- [@mathieucarbou](https://github.com/mathieucarbou): `WS_MAX_QUEUED_MESSAGES`: control the maximum number of messages that can be queued for a Websocket client
|
||||
|
@ -5,6 +5,9 @@
|
||||
#elif defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WebServer.h>
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include "ESPAsyncWebServer.h"
|
||||
|
||||
|
@ -7,6 +7,9 @@
|
||||
#elif defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WebServer.h>
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include "ESPAsyncWebServer.h"
|
||||
|
||||
|
@ -12,6 +12,9 @@
|
||||
#elif defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WebServer.h>
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include <ESPAsyncWebServer.h>
|
||||
|
||||
|
@ -17,7 +17,11 @@ class StreamConcat : public Stream {
|
||||
return c != -1 ? c : _s2->read();
|
||||
}
|
||||
|
||||
#if defined(TARGET_RP2040)
|
||||
size_t readBytes(char* buffer, size_t length) {
|
||||
#else
|
||||
size_t readBytes(char* buffer, size_t length) override {
|
||||
#endif
|
||||
size_t count = _s1->readBytes(buffer, length);
|
||||
return count > 0 ? count : _s2->readBytes(buffer, length);
|
||||
}
|
||||
|
@ -6,6 +6,9 @@
|
||||
#elif defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WebServer.h>
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include "StreamConcat.h"
|
||||
#include "StreamString.h"
|
||||
@ -42,7 +45,11 @@ void setup() {
|
||||
StreamConcat stream1(&header, &body);
|
||||
|
||||
StreamString content;
|
||||
#if defined(TARGET_RP2040)
|
||||
content.printf("FreeHeap: %d", rp2040.getFreeHeap());
|
||||
#else
|
||||
content.printf("FreeHeap: %" PRIu32, ESP.getFreeHeap());
|
||||
#endif
|
||||
StreamConcat stream2 = StreamConcat(&stream1, &content);
|
||||
|
||||
File footer = LittleFS.open("/footer.html", "r");
|
||||
@ -67,7 +74,11 @@ void loop() {
|
||||
// dnsServer.processNextRequest();
|
||||
|
||||
if (millis() - last > 2000) {
|
||||
#if defined(TARGET_RP2040)
|
||||
Serial.printf("FreeHeap: %d", rp2040.getFreeHeap());
|
||||
#else
|
||||
Serial.printf("FreeHeap: %" PRIu32, ESP.getFreeHeap());
|
||||
#endif
|
||||
last = millis();
|
||||
}
|
||||
}
|
@ -18,7 +18,11 @@ class StreamString : public Stream {
|
||||
return c;
|
||||
}
|
||||
|
||||
#if defined(TARGET_RP2040)
|
||||
size_t readBytes(char* buffer, size_t length) {
|
||||
#else
|
||||
size_t readBytes(char* buffer, size_t length) override {
|
||||
#endif
|
||||
if (length > _buffer.length())
|
||||
length = _buffer.length();
|
||||
// Don't use _str.ToCharArray() because it inserts a terminator
|
||||
|
11
library.json
11
library.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "ESP Async WebServer",
|
||||
"version": "2.10.8",
|
||||
"description": "Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266. Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc.",
|
||||
"description": "Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266 and RP2040. Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc.",
|
||||
"keywords": "http,async,websocket,webserver",
|
||||
"homepage": "https://github.com/mathieucarbou/ESPAsyncWebServer",
|
||||
"repository": {
|
||||
@ -21,7 +21,8 @@
|
||||
"frameworks": "arduino",
|
||||
"platforms": [
|
||||
"espressif32",
|
||||
"espressif8266"
|
||||
"espressif8266",
|
||||
"raspberrypi"
|
||||
],
|
||||
"dependencies": [
|
||||
{
|
||||
@ -39,6 +40,12 @@
|
||||
{
|
||||
"name": "Hash",
|
||||
"platforms": "espressif8266"
|
||||
},
|
||||
{
|
||||
"owner": "khoih-prog",
|
||||
"name": "AsyncTCP_RP2040W",
|
||||
"version": "^1.2.0",
|
||||
"platforms": "raspberrypi"
|
||||
}
|
||||
],
|
||||
"export": {
|
||||
|
@ -2,9 +2,9 @@ name=ESP Async WebServer
|
||||
version=2.10.8
|
||||
author=Me-No-Dev
|
||||
maintainer=Mathieu Carbou <mathieu.carbou@gmail.com>
|
||||
sentence=Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266
|
||||
sentence=Asynchronous HTTP and WebSocket Server Library for ESP32, ESP8266 and RP2040
|
||||
paragraph=Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc
|
||||
category=Other
|
||||
url=https://github.com/mathieucarbou/ESPAsyncWebServer
|
||||
architectures=esp8266,esp32
|
||||
architectures=*
|
||||
license=LGPL-3.0
|
||||
|
@ -46,3 +46,15 @@ board = huzzah
|
||||
lib_deps =
|
||||
bblanchon/ArduinoJson @ 7.0.4
|
||||
esphome/ESPAsyncTCP-esphome @ 2.0.0
|
||||
|
||||
; PlatformIO support for Raspberry Pi Pico is not official
|
||||
; https://github.com/platformio/platform-raspberrypi/pull/36
|
||||
; https://github.com/earlephilhower/arduino-pico/blob/master/docs/platformio.rst
|
||||
; board settings: https://github.com/earlephilhower/arduino-pico/blob/master/tools/json/rpipico.json
|
||||
[env:rpipicow]
|
||||
upload_protocol = picotool
|
||||
platform = https://github.com/maxgerhardt/platform-raspberrypi.git
|
||||
board = rpipicow
|
||||
lib_deps =
|
||||
bblanchon/ArduinoJson @ 7.0.4
|
||||
khoih-prog/AsyncTCP_RP2040W @ 1.2.0
|
||||
|
@ -18,7 +18,7 @@
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include "Arduino.h"
|
||||
#ifndef ESP8266
|
||||
#if defined(ESP32)
|
||||
#include <rom/ets_sys.h>
|
||||
#endif
|
||||
#include "AsyncEventSource.h"
|
||||
@ -190,7 +190,7 @@ void AsyncEventSourceClient::_queueMessage(const char* message, size_t len) {
|
||||
if (_messageQueue.size() >= SSE_MAX_QUEUED_MESSAGES) {
|
||||
#ifdef ESP8266
|
||||
ets_printf(String(F("ERROR: Too many messages queued\n")).c_str());
|
||||
#else
|
||||
#elif defined(ESP32)
|
||||
log_e("Too many messages queued: deleting message");
|
||||
#endif
|
||||
return;
|
||||
|
@ -28,11 +28,16 @@
|
||||
#ifndef SSE_MAX_QUEUED_MESSAGES
|
||||
#define SSE_MAX_QUEUED_MESSAGES 32
|
||||
#endif
|
||||
#else // esp8266
|
||||
#elif defined(ESP8266)
|
||||
#include <ESPAsyncTCP.h>
|
||||
#ifndef SSE_MAX_QUEUED_MESSAGES
|
||||
#define SSE_MAX_QUEUED_MESSAGES 8
|
||||
#endif
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <AsyncTCP_RP2040W.h>
|
||||
#ifndef SSE_MAX_QUEUED_MESSAGES
|
||||
#define SSE_MAX_QUEUED_MESSAGES 32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <ESPAsyncWebServer.h>
|
||||
|
@ -25,14 +25,14 @@
|
||||
|
||||
#include <libb64/cencode.h>
|
||||
|
||||
#ifndef ESP8266
|
||||
#if defined(ESP32)
|
||||
#if ESP_IDF_VERSION_MAJOR < 5
|
||||
#include "./port/SHA1Builder.h"
|
||||
#else
|
||||
#include <SHA1Builder.h>
|
||||
#endif
|
||||
#include <rom/ets_sys.h>
|
||||
#else
|
||||
#elif defined(TARGET_RP2040) || defined(ESP8266)
|
||||
#include <Hash.h>
|
||||
#endif
|
||||
|
||||
@ -417,7 +417,7 @@ void AsyncWebSocketClient::_queueMessage(AsyncWebSocketSharedBuffer buffer, uint
|
||||
if (closeWhenFull) {
|
||||
#ifdef ESP8266
|
||||
ets_printf("AsyncWebSocketClient::_queueMessage: Too many messages queued: closing connection\n");
|
||||
#else
|
||||
#elif defined(ESP32)
|
||||
log_e("Too many messages queued: closing connection");
|
||||
#endif
|
||||
_status = WS_DISCONNECTED;
|
||||
@ -426,7 +426,7 @@ void AsyncWebSocketClient::_queueMessage(AsyncWebSocketSharedBuffer buffer, uint
|
||||
} else {
|
||||
#ifdef ESP8266
|
||||
ets_printf("AsyncWebSocketClient::_queueMessage: Too many messages queued: discarding new message\n");
|
||||
#else
|
||||
#elif defined(ESP32)
|
||||
log_e("Too many messages queued: discarding new message");
|
||||
#endif
|
||||
}
|
||||
@ -1155,7 +1155,7 @@ AsyncWebSocketResponse::AsyncWebSocketResponse(const String& key, AsyncWebSocket
|
||||
uint8_t hash[20];
|
||||
char buffer[33];
|
||||
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266) || defined(TARGET_RP2040)
|
||||
sha1(key + WS_STR_UUID, hash);
|
||||
#else
|
||||
String k;
|
||||
|
@ -28,12 +28,18 @@
|
||||
#ifndef WS_MAX_QUEUED_MESSAGES
|
||||
#define WS_MAX_QUEUED_MESSAGES 32
|
||||
#endif
|
||||
#else
|
||||
#elif defined(ESP8266)
|
||||
#include <ESPAsyncTCP.h>
|
||||
#ifndef WS_MAX_QUEUED_MESSAGES
|
||||
#define WS_MAX_QUEUED_MESSAGES 8
|
||||
#endif
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <AsyncTCP_RP2040W.h>
|
||||
#ifndef WS_MAX_QUEUED_MESSAGES
|
||||
#define WS_MAX_QUEUED_MESSAGES 32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <ESPAsyncWebServer.h>
|
||||
|
||||
#include <deque>
|
||||
|
@ -34,6 +34,11 @@
|
||||
#elif defined(ESP8266)
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESPAsyncTCP.h>
|
||||
#elif defined(TARGET_RP2040)
|
||||
#include <WiFi.h>
|
||||
#include <AsyncTCP_RP2040W.h>
|
||||
#include <http_parser.h>
|
||||
#include <HTTP_Method.h>
|
||||
#else
|
||||
#error Platform not supported
|
||||
#endif
|
||||
@ -61,17 +66,21 @@ class AsyncStaticWebHandler;
|
||||
class AsyncCallbackWebHandler;
|
||||
class AsyncResponseStream;
|
||||
|
||||
#ifndef WEBSERVER_H
|
||||
typedef enum {
|
||||
HTTP_GET = 0b00000001,
|
||||
HTTP_POST = 0b00000010,
|
||||
HTTP_DELETE = 0b00000100,
|
||||
HTTP_PUT = 0b00001000,
|
||||
HTTP_PATCH = 0b00010000,
|
||||
HTTP_HEAD = 0b00100000,
|
||||
HTTP_OPTIONS = 0b01000000,
|
||||
HTTP_ANY = 0b01111111,
|
||||
} WebRequestMethod;
|
||||
#if defined (TARGET_RP2040)
|
||||
typedef enum http_method WebRequestMethod;
|
||||
#else
|
||||
#ifndef WEBSERVER_H
|
||||
typedef enum {
|
||||
HTTP_GET = 0b00000001,
|
||||
HTTP_POST = 0b00000010,
|
||||
HTTP_DELETE = 0b00000100,
|
||||
HTTP_PUT = 0b00001000,
|
||||
HTTP_PATCH = 0b00010000,
|
||||
HTTP_HEAD = 0b00100000,
|
||||
HTTP_OPTIONS = 0b01000000,
|
||||
HTTP_ANY = 0b01111111,
|
||||
} WebRequestMethod;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FS_FILE_OPEN_MODE
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
#include "WebAuthentication.h"
|
||||
#include <libb64/cencode.h>
|
||||
#ifdef ESP32
|
||||
#if defined(ESP32) || defined(TARGET_RP2040)
|
||||
#include <MD5Builder.h>
|
||||
#else
|
||||
#include "md5.h"
|
||||
@ -64,7 +64,7 @@ bool checkBasicAuthentication(const char* hash, const char* username, const char
|
||||
}
|
||||
|
||||
static bool getMD5(uint8_t* data, uint16_t len, char* output) { // 33 bytes or more
|
||||
#ifdef ESP32
|
||||
#if defined(ESP32) || defined(TARGET_RP2040)
|
||||
MD5Builder md5;
|
||||
md5.begin();
|
||||
md5.add(data, len);
|
||||
|
@ -210,7 +210,15 @@ void AsyncStaticWebHandler::handleRequest(AsyncWebServerRequest* request) {
|
||||
String etag;
|
||||
if (lw) {
|
||||
setLastModified(gmtime(&lw));
|
||||
#if defined(TARGET_RP2040)
|
||||
// time_t == long long int
|
||||
const size_t len = 1 + 8 * sizeof(time_t);
|
||||
char buf[len];
|
||||
char* ret = lltoa(lw, buf, len, 10);
|
||||
etag = ret ? String(ret) : String(request->_tempFile.size());
|
||||
#else
|
||||
etag = String(lw);
|
||||
#endif
|
||||
} else {
|
||||
etag = String(request->_tempFile.size());
|
||||
}
|
||||
|
Reference in New Issue
Block a user