使 ArduinoJSON 阵列全球可用

Make ArduinoJSON Array globally available

我很长一段时间都在思考这个问题。 我正在打开一个从我的 ESP32 到我的 NodeJS 后端的 websocket 连接。收到消息时,内容会使用 ArduinoJSON 进行解析。

我将解析后的内容存储在全局变量中,这样我就可以在我的 void loop() 中访问它们。每次收到新消息时,它们都会被覆盖。就应该这样。

变量声明:

uint8_t  brightness = 10;
uint8_t lastMillis = 0;
int ArrayPointer = 0;
int interval = 2000;
bool immediate = true;
const size_t capacity = JSON_ARRAY_SIZE(32) + JSON_OBJECT_SIZE(1) + 290;

void Setup()后

void onMessageCallback(WebsocketsMessage message) {
    Serial.print("Got Message: ");
    DynamicJsonBuffer jsonBuffer(capacity);
    JsonObject & JSONResponse = jsonBuffer.parseObject(message);
    JsonArray & PixelArray = JSONResponse["frame"];
    brightness = JSONResponse["brightness"];
    ArrayPointer = 0;
    immediate = true;
}

void loop() {
  client.poll();


  if(millis() - lastMillis >= interval || immediate == true) {
    // Here I would like to access the Variable PixelArray
    lastMillis = millis();
  }
}

当然,我不能在 void 循环中访问 PixelArray,因为它的作用域不同。 现在我需要一种方法来使 PixelArray 可以在全球范围内访问。

我尝试了什么:

希望有人能帮助我 ;)

提前致谢;)

PS:目前我使用的是ArduinoJson 5,但升级没问题。

不要那样做。

您应该使用 ArduinoJson 来序列化和反序列化 JSON 对象,而不是存储程序状态。 Its documentation makes that very clear.

执行此操作的正确方法(ArduinoJSON 包的设计使用方式)是维护一个内部数据结构并将您的 JSON 对象序列化和反序列化到它。

因此,您将拥有一个全局变量,它将作为 PixelArray 的内部表示,然后在您收到 JSON 消息时将值从 JsonArray 复制到它。您在这里正确使用 brightness;你应该用 PixelArray.

做同样的事情