0

很长一段时间以来,我一直在思考这个问题。我正在打开一个从我的 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 全局可访问的方法。

我尝试了什么:

  • 在 void Setup() 之前声明了一个全局 JsonArray 但这引发了错误 ;(。
  • 将其分配给另一个(全局)数组无法正常工作,因为 PixelArray 的大小会有所不同。

希望有人可以帮助我;)

提前致谢 ;)

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

4

1 回答 1

1

不要那样做。

您应该使用 ArduinoJson 来序列化和反序列化 JSON 对象,而不是存储程序状态。它的文档说明了这一点。

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

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

于 2019-11-05T22:16:41.560 回答