使 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 可以在全球范围内访问。
我尝试了什么:
- 在 void Setup() 之前声明了一个全局 JsonArray,但这引发了错误 ;(。
- 将其分配给另一个(全局)数组没有正常工作,因为 PixelArray 的大小不同。
希望有人能帮助我 ;)
提前致谢;)
PS:目前我使用的是ArduinoJson 5,但升级没问题。
不要那样做。
您应该使用 ArduinoJson 来序列化和反序列化 JSON 对象,而不是存储程序状态。 Its documentation makes that very clear.
执行此操作的正确方法(ArduinoJSON 包的设计使用方式)是维护一个内部数据结构并将您的 JSON 对象序列化和反序列化到它。
因此,您将拥有一个全局变量,它将作为 PixelArray
的内部表示,然后在您收到 JSON 消息时将值从 JsonArray 复制到它。您在这里正确使用 brightness
;你应该用 PixelArray
.
做同样的事情
我很长一段时间都在思考这个问题。 我正在打开一个从我的 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,但升级没问题。
不要那样做。
您应该使用 ArduinoJson 来序列化和反序列化 JSON 对象,而不是存储程序状态。 Its documentation makes that very clear.
执行此操作的正确方法(ArduinoJSON 包的设计使用方式)是维护一个内部数据结构并将您的 JSON 对象序列化和反序列化到它。
因此,您将拥有一个全局变量,它将作为 PixelArray
的内部表示,然后在您收到 JSON 消息时将值从 JsonArray 复制到它。您在这里正确使用 brightness
;你应该用 PixelArray
.