简体   繁体   English

无法使用 esp32 和 Arduinojson 从 Googlesheet 获取数据

[英]Can't get data from Googlesheet using esp32 and Arduinojson

I'm new to esp32 and now I'm trying to Get data using ArduinoJson, In my googlesheet "A1" have a number and I want to let esp32 to get it, I send my googlesheet to internet and use the url: https://spreadsheets.google.com/feeds/cells/1RICYSv0y0wEEu-PhcCL45jZmh7DlFSAsbW8Bie0inbA/1/public/values?alt=json&range=A1 .我是 esp32 的新手,现在我正在尝试使用 ArduinoJson 获取数据,在我的 googlesheet“A1”中有一个数字,我想让 esp32 获取它,我将我的 googlesheet 发送到互联网并使用以下网址: https: //spreadsheets.google.com/feeds/cells/1RICYSv0y0wEEu-PhcCL45jZmh7DlFSAsbW8Bie0inbA/1/public/values?alt=json&range=A1 and my number is at object > feed > entry > 0 > content > $t.我的号码是对象>提要>条目>0>内容>$t。

Here's a problem:When I use esp32 to get this json data,I can't get it,even my esp32 connected to googlesheet问题来了:当我使用esp32获取这个json数据时,我无法获取,甚至我的esp32连接到googlesheet

Here is my full code if you need:如果您需要,这是我的完整代码:

#include <ArduinoJson.h>
#include <WiFi.h>
#include <SPI.h>

WiFiClient client;

const char* ssid = "wwwwwwwww";
const char* password = "wwwwwwww";
const char* server = "spreadsheets.google.com";
const char* resource = "/feeds/cells/1RICYSv0y0wEEu-PhcCL45jZmh7DlFSAsbW8Bie0inbA/1/public/values?alt=json&range=A1";


const unsigned long HTTP_TIMEOUT = 10000;  // max respone time from server
const size_t MAX_CONTENT_SIZE = 1024;       // max size of the HTTP response

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

struct clientData {
  char item[8];
};


void setup() {
  Serial.begin(9600);
  while (!Serial) {

  }
  Serial.println("Serial ready");
  Serial.print("Connecting to wifi: ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void loop() {
  if(connect(server)) {
    if(sendRequest(server, resource) && skipResponseHeaders()) {
      clientData clientData;
      if(readReponseContent(&clientData)) {
        printclientData(&clientData);
      }
    }
  }
  disconnect();
  wait();
}


bool connect(const char* hostName) {
  Serial.print("Connect to ");
  Serial.println(hostName);

  bool ok = client.connect(hostName, 80);

  Serial.println(ok ? "Connected" : "Connection Failed!");
  return ok;
}


bool sendRequest(const char* host, const char* resource) {
  Serial.print("GET ");
  Serial.println(resource);

  client.print("GET ");
  client.print(resource);
  client.println(" HTTP/1.1");
  client.print("Host: ");
  client.println(host);
  client.println("Connection: close");
  client.println();

  return true;
}

bool skipResponseHeaders() {
  // HTTP headers end with an empty line
  char endOfHeaders[] = "\r\n\r\n";

  client.setTimeout(HTTP_TIMEOUT);
  bool ok = client.find(endOfHeaders);

  if (!ok) {
    Serial.println("No response or invalid response!");
  }
  return ok;
}


bool readReponseContent(struct clientData* clientData) {
  const size_t bufferSize = 5*JSON_ARRAY_SIZE(1) + 
  JSON_ARRAY_SIZE(5) + 10*JSON_OBJECT_SIZE(1) + 
  6*JSON_OBJECT_SIZE(2) + 7*JSON_OBJECT_SIZE(3) + 
  JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(7) + JSON_OBJECT_SIZE(15);
  DynamicJsonBuffer jsonBuffer(bufferSize);

  JsonObject& root = jsonBuffer.parseObject(client);

  if (!root.success()) {
    Serial.println("JSON parsing failed!");
    return false;
  }

  strcpy(clientData->item, root["feed"]["entry"][0]["content"]["$t"]);

  return true;
}


void printclientData(const struct clientData* clientData) {
  Serial.print("Time = ");
  Serial.println(clientData->item);

}

void disconnect() {
  Serial.println("Disconnect");
  client.stop();
}

void wait() {
  Serial.println("Wait 20 seconds");
  delay(20000);
}

Serial Output:串行输出:

Connecting to wifi: wwwwwwwwww
..
WiFi connected
IP address: 
xxx.xxx.x.xx
Connect to spreadsheets.google.com
Connected
GET /feeds/cells/1RICYSv0y0wEEu-PhcCL45jZmh7DlFSAsbW8Bie0inbA/1/public/values?alt=json&range=A1
JSON parsing failed!
Disconnect
Wait 20 seconds

If I based on your json output and calculate the bufferSize using ArduinoJson Assistant , I get this:如果我基于您的 json 输出并使用ArduinoJson Assistant计算 bufferSize,我会得到:

const size_t capacity = 5*JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(5) + 10*JSON_OBJECT_SIZE(1) + 6*JSON_OBJECT_SIZE(2) + 7*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(7) + JSON_OBJECT_SIZE(15) + 2270;

Noticed the + 2270 at the end?注意到最后的+ 2270了吗? Your parsing json failed because your are short of 2270 bytes in bufferSize (ie your bufferSize is too small).您解析 json 失败,因为您在 bufferSize 中缺少 2270 个字节(即您的 bufferSize 太小)。

Updte更新

I didn't try to debug your code, but I have my web client code handy with me so I just run and it works for me.我没有尝试调试您的代码,但我手头有我的 Web 客户端代码,所以我只需运行它就可以了。

My code is based on HTTPClient which is part of ESP32 Arduino Core that you can further read about it at ESP-Arduino github .我的代码基于 HTTPClient,它是 ESP32 Arduino Core 的一部分,您可以在 ESP-Arduino github 上进一步阅读。 It is based on Arduino WifiClient that you used but with much simpler and easy to use API, especially for getting response payload.它基于您使用的 Arduino WifiClient,但具有更简单易用的 API,尤其是用于获取响应负载。 I would recommend you take a look.我建议你看看。

I add ArduinoJson to my code to see if there is any issue on parsing the received json, but mines is based on v6 syntax, you can convert it to v5 syntax if you still feel it is easier for you to use v5.我将 ArduinoJson 添加到我的代码中,以查看解析接收到的 json 是否有任何问题,但 mines 是基于 v6 语法的,如果您仍然觉得使用 v5 更容易,则可以将其转换为 v5 语法。 BTW, the json document contains Unicode, I have to add #define ARDUINOJSON_DECODE_UNICODE 1 on the top of the program in oder to make it work, otherwise I will get an deserialization error: NotSupported .顺便说一句,json 文档包含 Unicode,我必须在程序顶部添加#define ARDUINOJSON_DECODE_UNICODE 1才能使其工作,否则我会得到一个deserialization error: NotSupported

#define ARDUINOJSON_DECODE_UNICODE 1
#include <ArduinoJson.h>
#include <WiFi.h>
#include <HTTPClient.h>

HTTPClient http;

const char* ssid = "your_SSID";
const char* password = "your_password";

const char* url = "https://spreadsheets.google.com/feeds/cells/1RICYSv0y0wEEu-PhcCL45jZmh7DlFSAsbW8Bie0inbA/1/public/values?alt=json&range=A1";

void setup() {
  Serial.begin(115200);
  while (!Serial) {}

  Serial.print("Connecting to wifi: "); Serial.print(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("IP address: "); Serial.println(WiFi.localIP());

  http.begin(url); 
  int httpCode = http.GET();  //send GET request

  if (httpCode != 200) {
    Serial.print("Error on HTTP request: ");
    Serial.println(httpCode);
  } else {
    String payload = http.getString();
    Serial.println(payload);

    // the following is based on ArduinoJson v6 API
    StaticJsonDocument<4000> doc;
    DeserializationError err = deserializeJson(doc, payload);
    if (err) {
      Serial.print("deserialization error ");
      Serial.println(err.c_str());
    }

    JsonObject feed = doc["feed"];
    const char* clientData = feed["entry"][0]["content"]["$t"];
    Serial.println(clientData);
  }

  http.end(); //Free the resources

}


void loop() {

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM