48#define SERVER_PORT 8080
62 Serial.println(
"\n==============================================");
63 Serial.println(
" HTTP RPC SERVER - Streaming Example");
64 Serial.println(
"==============================================\n");
86 Serial.println(
"✓ Client connected");
90 Serial.println(
"✗ Client disconnected");
95 remote.bind(
"add", [](
int a,
int b) ->
int {
105 remote.bind(
"setLed", [](
int index,
int r,
int g,
int b) {
106 if (index >= 0 && index <
NUM_LEDS) {
108 Serial.print(
"✓ Set LED ");
118 Serial.print(
"✗ LED index ");
120 Serial.println(
" out of range");
124 remote.bind(
"fill", [](
int r,
int g,
int b) {
126 Serial.print(
"✓ Filled all LEDs with RGB(");
138 result.set(
"brightness",
FastLED.getBrightness());
139 result.set(
"millis",
static_cast<int64_t
>(millis()));
140 Serial.println(
"✓ Status requested");
149 ack.
set(
"ack",
true);
152 Serial.println(
"⏳ Long task started (ASYNC mode)");
157 auto durationOpt = params[0].
as_int();
159 duration = *durationOpt;
164 uint32_t startTime = millis();
165 while (millis() - startTime <
static_cast<uint32_t
>(duration)) {
171 result.set(
"value", 42);
172 result.set(
"duration", duration);
175 Serial.print(
"✓ Long task complete (");
185 ack.
set(
"ack",
true);
188 Serial.println(
"📊 Stream started (ASYNC_STREAM mode)");
193 auto countOpt = params[0].
as_int();
200 for (
int i = 0; i < count; i++) {
202 update.
set(
"update", i);
203 update.
set(
"progress", (i * 100) / count);
209 Serial.print((i * 100) / count);
217 final.set(
"done",
true);
218 final.set(
"count", count);
221 Serial.println(
"✓ Stream complete");
226 Serial.print(
"✓ HTTP server listening on port ");
229 Serial.print(
"✗ Failed to start HTTP server on port ");
233 Serial.println(
"\n=== Available RPC Methods ===");
235 Serial.println(
" add(a, b) -> sum");
236 Serial.println(
" setLed(index, r, g, b)");
237 Serial.println(
" fill(r, g, b)");
238 Serial.println(
" getStatus() -> {numLeds, brightness, millis}");
240 Serial.println(
" longTask(duration) -> ACK + {value, duration}");
241 Serial.println(
"ASYNC_STREAM:");
242 Serial.println(
" streamData(count) -> ACK + updates + {done, count}");
245 Serial.println(
"Test with curl:");
246 Serial.println(
" curl -X POST http://localhost:8080/rpc \\");
247 Serial.println(
" -H \"Content-Type: application/json\" \\");
248 Serial.println(
" -H \"Transfer-Encoding: chunked\" \\");
249 Serial.println(
" -d '{\"jsonrpc\":\"2.0\",\"method\":\"add\",\"params\":[2,3],\"id\":1}'");
251 Serial.println(
"Ready for incoming HTTP connections...\n");
260 (*pTransport)->update(millis());
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
fl::unique_ptr< fl::Remote > remote
fl::unique_ptr< fl::net::http::HttpStreamClient > transport
static fl::shared_ptr< fl::net::http::HttpStreamServer > * pTransport
static fl::Remote * pRemote
JSON-RPC server with scheduling support.
void send(const fl::json &result)
Send a single response (for ASYNC mode)
void sendFinal(const fl::json &result)
Send final response and mark stream as complete (for ASYNC_STREAM mode)
void sendUpdate(const fl::json &update)
Send intermediate streaming update (for ASYNC_STREAM mode)
Helper class for sending responses in async/streaming RPC methods.
fl::optional< i64 > as_int() const FL_NOEXCEPT
bool is_array() const FL_NOEXCEPT
size_t size() const FL_NOEXCEPT
void set(const fl::string &key, const json &value) FL_NOEXCEPT
static json object() FL_NOEXCEPT
void fill_solid(CRGB *targetArray, int numToFill, const CRGB &color) FL_NOEXCEPT
Fill a range of LEDs with a solid color.
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT