(七)ESP32:创建JSON消息

释放双眼,带上耳机,听听看~!
这篇文章的目的是解释如何使用ArduinoJson库和ESP32创建JSON格式的消息。

介绍

这篇文章的目的是解释如何使用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格式的内容。

(七)ESP32:创建JSON消息

图1 – 程序的输出,带有JSON格式的消息。

给TA打赏
共{{data.count}}人
人已打赏
动态

(六)ESP32:解析JSON

2018-12-22 23:57:57

动态

(八)ESP32:通过MQTT发送JSON消息

2018-12-23 14:12:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();