You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266与Google Sheets通过GAS通信:GET请求响应失败求助

ESP8266与Google Sheets通过GAS通信无法接收响应排查

问题详情

  • ESP8266可正常获取其他JSON服务响应,但请求Google Script URL时无法接收响应;
  • 仅在ESP8266开发板版本为2.3.0时,代码可向Google Sheets发送数据,但仍无法接收GAS返回的响应;
  • 已更新证书指纹,GAS已设置为公开且可手动测试。

运行代码

/*
THIS CODE WORKS PARTUALLY! IT CAN SEND VALUES TO SPREADSHEET BUT DOES NOT GET ANY RESPONSE!
 */

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "########";
const char* password = "########";

const char* host = "script.google.com";
const int httpsPort = 443;

// SHA1指纹(通过浏览器查看并复制)
const char* fingerprint = "DC 93 18 4D 42 06 17 7B D3 23 B1 BB 32 CE D4 D0 45 67 EB 10";

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  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());

  // 创建TLS连接
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  if (client.verify(fingerprint, host)) {
    Serial.println("certificate matches");
  } else {
    Serial.println("certificate doesn't match");
  }

  String url = "/macros/s/AKfycbzmdgT4ruH95PMYaXEfqP98hAoLxrElloqXWfov-dqpZ2V5z8yO/exec?tempData=5";
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("esp8266/Arduino CI successfull!");
  } else {
    Serial.println("esp8266/Arduino CI has failed");
  }
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);
  Serial.println("==========");
  Serial.println("closing connection");
}

void loop() {
}

排查与解决建议

  • 修复响应读取逻辑:当前代码仅读取响应的第一行,GAS的响应可能包含多行或完整的JSON结构。修改读取部分的代码,在头部读取完成后,循环读取所有可用数据直到连接断开:
    Serial.println("headers received");
    // 读取完整响应体
    String response = "";
    while(client.available()){
      response += client.readStringUntil('\n');
    }
    Serial.println("reply was:");
    Serial.println("==========");
    Serial.println(response);
    Serial.println("==========");
    
  • 升级ESP8266核心版本:2.3.0版本的WiFiClientSecure对现代TLS协议支持有限,Google可能已不再兼容旧版本的TLS。升级到3.x系列的ESP8266核心,同时重新获取并更新证书指纹(新版本核心可能需要SHA-256指纹,而非SHA-1)。
  • 检查GAS响应格式:确保GAS脚本使用ContentService.createTextOutput()返回纯JSON或文本响应,避免返回HTML内容。示例GAS代码:
    function doGet(e) {
      // 处理数据写入逻辑...
      return ContentService.createTextOutput(JSON.stringify({state:"success"})).setMimeType(ContentService.MimeType.JSON);
    }
    
  • 完善请求头:添加Accept: application/json请求头,明确告知Google返回JSON格式响应:
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "User-Agent: BuildFailureDetectorESP8266\r\n" +
                 "Accept: application/json\r\n" +
                 "Connection: close\r\n\r\n");
    
  • 延长连接超时:在client.connect前设置更长的超时时间,避免因响应延迟导致连接提前断开:
    client.setTimeout(10000); // 设置10秒超时
    

内容的提问来源于stack exchange,提问作者Albi_Ino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19