ESP8266是一款非常流行的Wi-Fi模块,广泛应用于物联网设备中。在许多应用场景下,我们需要通过ESP8266与服务器或其他设备进行通信,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性和跨语言兼容性,在现代开发中被广泛应用。
本文将详细介绍如何使用ESP8266处理JSON数据的发送与解析。内容包括JSON基础、ESP8266的相关库介绍、代码实现以及调试技巧等。
JSON是一种以键值对形式表示数据的格式,其结构简单且易于解析。以下是JSON的基本语法:
{"name": "ESP8266", "age": 5}
。[1, 2, 3, 4]
。null
。示例JSON数据:
{
"device": "ESP8266",
"parameters": {
"temperature": 25.5,
"humidity": 60
},
"status": true
}
ESP8266的Arduino开发环境提供了丰富的库来简化JSON的处理。主要使用的库包括:
ArduinoJson:一个功能强大且高效的库,用于解析和生成JSON数据。
工具 -> 管理库 -> 搜索 ArduinoJson
安装。WiFiClient:用于建立TCP连接,发送和接收数据。
以下代码演示了如何通过ESP8266向服务器发送JSON数据:
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
const char* serverAddress = "http://example.com/api";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverAddress);
// 创建JSON对象
StaticJsonDocument<200> doc;
doc["device"] = "ESP8266";
doc["parameters"]["temperature"] = 25.5;
doc["parameters"]["humidity"] = 60;
doc["status"] = true;
// 将JSON对象序列化为字符串
String payload;
serializeJson(doc, payload);
// 设置请求头并发送POST请求
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("HTTP Response Code: ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.println(response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
delay(5000); // 每5秒发送一次
}
}
假设服务器返回如下JSON数据:
{
"command": "turn_on",
"data": {
"pin": 5,
"value": 255
}
}
以下是解析该JSON数据的代码示例:
void handleIncomingData(String jsonData) {
StaticJsonDocument<200> doc;
// 解析JSON数据
DeserializationError error = deserializeJson(doc, jsonData);
if (error) {
Serial.print("Failed to parse JSON: ");
Serial.println(error.c_str());
return;
}
const char* command = doc["command"];
int pin = doc["data"]["pin"];
int value = doc["data"]["value"];
Serial.print("Command: ");
Serial.println(command);
Serial.print("Pin: ");
Serial.println(pin);
Serial.print("Value: ");
Serial.println(value);
// 根据解析结果执行操作
if (strcmp(command, "turn_on") == 0) {
digitalWrite(pin, HIGH);
} else if (strcmp(command, "turn_off") == 0) {
digitalWrite(pin, LOW);
}
}
Serial.println()
打印关键变量值,便于定位问题。DynamicJsonDocument
),但需注意避免内存溢出。flowchart LR A[开始] --> B[创建JSON对象] B --> C[序列化为字符串] C --> D[设置HTTP请求头] D --> E[发送POST请求] E --> F[接收响应] F --> G[解析响应数据] G --> H[结束]