在Arduino中将HTTP请求发送到Google脚本

时间:2018-10-12 06:16:42

标签: http arduino

我正在使用以下代码,该代码可以毫无问题地发送和接收到自定义网站的HTTP请求。但是,当我尝试将主机更改为以下主机时,会收到失败消息。您只需将该地址放入浏览器即可查看实际响应。

我需要更改const char * host =“ djxmmx.net”;改为const char * host =“ https://script.google.com/macros/s/AKfycby72HRgl874tst5e0FBHDa_VR6luqofn-ojiYF8KUBPmC2E3aiB/exec”;

#include <ESP8266WiFi.h>

const char* ssid     = "Phone";
const char* password = "aa";

const char* host = "djxmmx.net";
const uint16_t port = 17;

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi networkre

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  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() {
  Serial.print("connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    delay(5000);
    return;
  }

  // This will send a string to the server
  Serial.println("sending data to server");
  client.println("hello from ESP8266");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      delay(60000);
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  Serial.println("receiving from remote server");
  while (client.available()) {
    char ch = static_cast<char>(client.read());
    Serial.print(ch);
  }

  // Close the connection
  //Serial.println();
  //Serial.println("closing connection");
 // client.stop();

  //delay(300000); // execute once every 5 minutes, don't flood remote service
}

1 个答案:

答案 0 :(得分:0)

您可以使用如上所述的一些帮助以这种方式进行操作。这需要在此链接GoogleSheetScript中在Google应用中设置数据服务器。请注意“ name = Amir”如何传输您的数据。

    /*  HTTPS on ESP8266 with follow redirects, chunked encoding support
     *  Version 2.1
     *  Author: Sujay Phadke
     *  Github: @electronicsguy
     *  Copyright (C) 2017 Sujay Phadke <electronicsguy123@gmail.com>
     *  All rights reserved.
     *
     *  Example Arduino program
     */

    #include <ESP8266WiFi.h>
    #include "HTTPSRedirect.h"
    #include "DebugMacros.h"

    // Fill ssid and password with your network credentials
    const char* ssid = "AmirPhone";
    const char* password = "aa112233";

    const char* host = "script.google.com";
    // Replace with your own script id to make server side changes
    const char *GScriptId = "AKfycby72HRgl874tst5e0FBHDa_VR6luqofn-ojiYF8KUBPmC2E3aiB";

    const int httpsPort = 443;

    // echo | openssl s_client -connect script.google.com:443 |& openssl x509 -fingerprint -noout
    const char* fingerprint = "";

    // Write to Google Spreadsheet
    String url = String("/macros/s/") + GScriptId + "/exec?name=Amir";
    // Fetch Google Calendar events for 1 week ahead
    String url2 = String("/macros/s/") + GScriptId + "/exec?cal";
    // Read from Google Spreadsheet
    String url3 = String("/macros/s/") + GScriptId + "/exec?read";

    String payload_base =  "";
    String payload = "";

    HTTPSRedirect* client = nullptr;
    // used to store the values of free stack and heap
    // before the HTTPSRedirect object is instantiated
    // so that they can be written to Google sheets
    // upon instantiation
    unsigned int free_heap_before = 0;
    unsigned int free_stack_before = 0;

    void setup() {
      Serial.begin(115200);
      Serial.flush();

      //free_heap_before = ESP.getFreeHeap();
      //free_stack_before = cont_get_free_stack(&g_cont);
      Serial.printf("Free heap before: %u\n", free_heap_before);
      Serial.printf("unmodified stack   = %4d\n", free_stack_before);

      Serial.println();
      Serial.print("Connecting to wifi: ");
      Serial.println(ssid);
      // flush() is needed to print the above (connecting...) message reliably, 
      // in case the wireless connection doesn't go through
      Serial.flush();

      WiFi.mode(WIFI_STA);
      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());

      // Use HTTPSRedirect class to create a new TLS connection
      client = new HTTPSRedirect(httpsPort);
      client->setPrintResponseBody(true);
      client->setContentTypeHeader("application/json");

      Serial.print("Connecting to ");
      Serial.println(host);

      // Try to connect for a maximum of 5 times
      bool flag = false;
      for (int i=0; i<5; i++){
        int retval = client->connect(host, httpsPort);
        if (retval == 1) {
           flag = true;
           break;
        }
        else
          Serial.println("Connection failed. Retrying...");
      }

      if (!flag){
        Serial.print("Could not connect to server: ");
        Serial.println(host);
        Serial.println("Exiting...");
        return;
      }

      if (client->verify(fingerprint, host)) {
        Serial.println("Certificate match.");
      } else {
        Serial.println("Certificate mis-match");
      }

      // Send memory data to Google Sheets
      payload = payload_base + "\"" + free_heap_before + "," + free_stack_before + "\"}";
      client->POST(url2, host, payload, false);
      payload = payload_base;// + "\"" + ESP.getFreeHeap() + "," + cont_get_free_stack(&g_cont) + "\"}";
      client->POST(url2, host, payload, false);

      // Note: setup() must finish within approx. 1s, or the the watchdog timer
      // will reset the chip. Hence don't put too many requests in setup()
      // ref: https://github.com/esp8266/Arduino/issues/34

      Serial.println("\nGET: Write into cell 'A1'");
      Serial.println("=========================");

      // fetch spreadsheet data
      client->GET(url, host);

      // Send memory data to Google Sheets
      payload = payload_base;// + "\"" + ESP.getFreeHeap() + "," + cont_get_free_stack(&g_cont) + "\"}";
      client->POST(url2, host, payload, false);

      Serial.println("\nGET: Fetch Google Calendar Data:");
      Serial.println("================================");

      // fetch spreadsheet data
      client->GET(url2, host);

      // Send memory data to Google Sheets
      payload = payload_base;// + "\"" + ESP.getFreeHeap() + "," + cont_get_free_stack(&g_cont) + "\"}";
      client->POST(url2, host, payload, false);

      Serial.println("\nSeries of GET and POST requests");
      Serial.println("===============================");

      Serial.printf("Free heap: %u\n", ESP.getFreeHeap());
      Serial.printf("unmodified stack   = %4d\n");//, cont_get_free_stack(&g_cont));

      // delete HTTPSRedirect object
      delete client;
      client = nullptr;
    }

    void loop() {
      static int error_count = 0;
      static int connect_count = 0;
      const unsigned int MAX_CONNECT = 20;
      static bool flag = false;
      //Serial.printf("Free heap: %u\n", ESP.getFreeHeap());
      //Serial.printf("unmodified stack   = %4d\n", cont_get_free_stack(&g_cont));

      if (!flag){
        //free_heap_before = ESP.getFreeHeap();
       // free_stack_before = cont_get_free_stack(&g_cont);
        client = new HTTPSRedirect(httpsPort);
        flag = true;
        client->setPrintResponseBody(true);
        client->setContentTypeHeader("application/json");
      }

      if (client != nullptr){
        if (!client->connected()){
          client->connect(host, httpsPort);
          payload = payload_base + "\"" + free_heap_before + "," + free_stack_before + "\"}";
          client->POST(url2, host, payload, false);
        }
      }
      else{
        DPRINTLN("Error creating client object!");
        error_count = 5;
      }

      if (connect_count > MAX_CONNECT){
        //error_count = 5;
        connect_count = 0;
        flag = false;
        delete client;
        return;
      }

      Serial.println("GET Data from cell 'A1':");
      if (client->GET(url3, host)){
        ++connect_count;
      }
      else{
        ++error_count;
        DPRINT("Error-count while connecting: ");
        DPRINTLN(error_count);
      }

      Serial.println("POST append memory data to spreadsheet:");
      payload = payload_base;// + "\"" + ESP.getFreeHeap() + "," + cont_get_free_stack(&g_cont) + "\"}";
      if(client->POST(url2, host, payload)){
        ;
      }
      else{
        ++error_count;
        DPRINT("Error-count while connecting: ");
        DPRINTLN(error_count);
      }

      /*
      if (!(client.reConnectFinalEndpoint())){
        ++error_count;
        DPRINT("Error-count while connecting: ");
        DPRINTLN(error_count);
      }
      else
        error_count = 0;
      */

      if (error_count > 3){
        Serial.println("Halting processor..."); 
        delete client;
        client = nullptr;
        Serial.printf("Final free heap: %u\n", ESP.getFreeHeap());
        Serial.printf("Final unmodified stack   = %4d\n");//, cont_get_free_stack(&g_cont));
        Serial.flush();
        ESP.deepSleep(0);
      }

      // In my testing on a ESP-01, a delay of less than 1500 resulted 
      // in a crash and reboot after about 50 loop runs.
      delay(4000);

    }


  [1]: https://github.com/electronicsguy/ESP8266/blob/master/HTTPSRedirect/GoogleScript.gs