目录
介绍
这篇文章的目的是解释如何使用ArduinoJson库和ESP32 创建JSON格式的消息。您可以通过Arduino的IDE库管理器安装这个库。
程序
首先,我们需要包含ArduinoJson库,以便访问创建JSON消息所需的所有功能。另外,为了能够打印结果,我们需要设置波特率。这将在setup函数中完成,其余代码将在循环函数中:
#include
void setup() {
Serial.begin(115200);
Serial.println();
}
现在,在主循环中,我们需要声明一个StaticJsonBuffer类的对象,它将用于创建JSON消息。从这里可以看出 ,我们需要指定缓冲区的容量(以字节为单位)作为模板参数。基本上,模板参数对应于我们将在代码中放在<>之间的值,我们将在下面看到。
我们将使用300个字节,这对于我们想要创建的消息来说已经足够了。如果您希望更详细地指定此值,请选中此工具以帮助进行计算。
然后,我们通过调用createObject方法从我们创建的StaticJsonBuffer对象获得对JsonObject的引用:
StaticJsonBuffer<300> JSONbuffer;
JsonObject& JSONencoder = JSONbuffer.createObject();
在这种情况下,我们想要创建一个JSON消息,该消息将与下面显示的结构相匹配。在这种情况下,我们将分配静态值,但我们可以从传感器中获取静态值:
{
"SensorType" : "Temperature",
"Value" : [20,21,23]
}
要在JSON结构中创建名称/值,我们使用下标运算符(方括号),如下面的代码所示。我们将使用它来指定“SensorType”是“Temperature”:
JSONencoder["sensorType"] = "Temperature";
要创建数组,我们在JsonObject引用上调用createNestedArray方法。这将返回对JsonArray [1] 的引用,我们将使用它来添加模拟的传感器值。为此,我们只需在JsonArray上调用add方法:
JsonArray& values = JSONencoder.createNestedArray("values");
values.add(20);
values.add(21);
values.add(23);
现在我们已经有了JSON消息的表示,我们可以使用不同的方法将它打印到串行控制台。我们可以使用我们之前定义的JsonObject引用的printTo方法。我们可以直接传值到串口对象作为此方法的输入,以便打印内容。在这种情况下,它将以较少的内存打印JSON消息。
如果我们需要以用户友好的格式打印内容,我们可以调用prettyPrintTo方法,该方法将为我们处理缩进格式。
作为替代方案,我们可以先将JSON消息打印到char缓冲区,然后再将其内容打印到串行控制台。检查下面3种不同的方式:
Serial.println("Less overhead JSON message: "); JSONencoder.printTo(Serial); Serial.println("\nPretty JSON message: "); JSONencoder.prettyPrintTo(Serial); Serial.println("\nPretty JSON message from buffer: "); char JSONmessageBuffer[300]; JSONencoder.prettyPrintTo(JSONmessageBuffer, sizeof(JSONmessageBuffer)); Serial.println(JSONmessageBuffer);
如果我们需要获取要打印的JSON消息的大小,我们可以调用measureLenght 或measurePrettyLength方法。这些方法将分别作为输出返回printTo和prettyPrintTo生成的字符串的大小。
下面是完整的代码:
#include
void setup() {
Serial.begin(115200);
Serial.println();
}
void loop() {
Serial.println("—————");
StaticJsonBuffer<300> JSONbuffer;
JsonObject& JSONencoder = JSONbuffer.createObject();
JSONencoder["sensorType"] = "Temperature";
JsonArray& values = JSONencoder.createNestedArray("values");
values.add(20);
values.add(21);
values.add(23);
int lenghtSimple = JSONencoder.measureLength();
Serial.print("Less overhead JSON message size: ");
Serial.println(lenghtSimple);
int lenghtPretty = JSONencoder.measurePrettyLength();
Serial.print("Pretty JSON message size: ");
Serial.println(lenghtPretty);
Serial.println();
Serial.println("Less overhead JSON message: ");
JSONencoder.printTo(Serial);
Serial.println();
Serial.println("\nPretty JSON message: ");
JSONencoder.prettyPrintTo(Serial);
Serial.println();
Serial.println("\nPretty JSON message from buffer: ");
char JSONmessageBuffer[300];
JSONencoder.prettyPrintTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));
Serial.println(JSONmessageBuffer);
Serial.println();
delay(10000);
}
测试结果
要测试结果,只需将程序上传到ESP32并打开Arduino IDE串行监视器。您就可以得到类似于图1的输出,它显示消息的长度和JSON格式的内容。
图1 – 程序的输出,带有JSON格式的消息。