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
相关产品推荐
相关产品推荐

