🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    SSL Socket errors

    Scheduled Pinned Locked Moved Modules
    2 Posts 1 Posters 2.4k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • N Offline
      nemsys
      last edited by nemsys

      Greetings and thank-you for your time.

      I am trying to send camera images from my ESP32 (M5 Stack PoECAM) to my personal google drive.

      following this tutorial :
      https://hobby-it.com/m5timer_gdrive-2/

      I have setup SSLClient with the EthernetLarge library the jpgs arrive and but they are corrupted/incomplete. Any ideas why this might be happening, I have tried different chunk sizes no effect ?

      I don't believe its hardware as the example sketches all work as intended

      errors/warnings

      SSLClient)(SSL_WARN)(connected): Socket was dropped unexpectedly (this can be an alternative to closing the connection)
      
      (SSLClient)(SSL_ERROR)(m_print_ssl_error): SSL_CLIENT_WRITE_FAIL
      (SSLClient)(SSL_ERROR)(available): Cannot operate if the write error is not reset:
      

      The project is on github (https://gitlab.com/ArchNemsys/esp32-poe-cam) the code for the relevant function (sensitive data removed) is posted below apologies I was halfway through refactoring it to use char bufs rather than strings:

      #include <SSLClient.h>
      #include "gdrive_trust.h"
      
      
      #define WRITE_SIZE_MAX   1024 //
      
      
      //#define API_PORT    443
      //#define API_PATH_TOKEN   "/oauth2/v4/token"
      
      
      const char* refreshServer = "oauth2.googleapis.com";
      const char* refreshUri    = "/token";
      const char* apiServer     = "www.googleapis.com";
      const char* apiUri        = "/upload/drive/v3/files?uploadType=multipart";
      char accessToken[2048];   
      
      // ethClient is declared elsewhere but works perfectly outside this funciton
      SSLClient httpsClient(ethClient, gdriveTAs, 1, 25);
      //  SSLClient::write, is buffered does not actually write to the network. you must call SSLClient::available or SSLClient::flush, 
      
      
      int waitingTime      = 10000; // Wait 10 seconds to google response.
      
      
      // Send JPEG by Http POST
      void postGoogleDriveByAPI() {
        Serial.println("Connect to " + String(apiServer));
        if (httpsClient.connect(apiServer, 443)) {
          Serial.println("Connection successful");
      
          // Get Time for save file name
          struct tm timeinfo;
          if(!getLocalTime(&timeinfo)){
            Serial.println("Failed to obtain time 1");
            return;
          } 
          char saveFilename[64];
      
          /*
          char metadata[256];
      
          const char* startBoundry = "--foo_bar_baz\r\n"
                            "Content-Type:image/jpeg\r\n\r\n";
          const char* endBoundry = "\r\n--foo_bar_baz--";
          */
      
          strftime (saveFilename,64,"ALERT_%A_%B_%d_%Y_%Hh%Mm%Ss.jpg",&timeinfo);
      
          Serial.println(saveFilename);
      
      
          /*
          snprintf( metadata, 256, "--foo_bar_baz\r\n"
                            "Content-Type: application/json; charset=UTF-8\r\n\r\n"
                            "{\"name\":\"%s\",\"parents\":[\"%s\"]}\r\n\r\n" , saveFilename, PARENT_ID ); 
          
          unsigned long contentsLength = strlen(metadata) + strlen(startBoundry) + fb->len + strlen(endBoundry);
      
          snprintf(header,256, "POST %s HTTP/1.1\r\n" 
                          "HOST: %s \r\n" 
                          "Connection: close\r\n" 
                          "content-type: multipart/related; boundary=foo_bar_baz\r\n" 
                          "content-length: %u \r\n" 
                          "authorization: Bearer %s \r\n\r\n", apiUri, apiServer, contentsLength, accessToken);
          */
      
          String metadata = "--foo_bar_baz\r\n"
                            "Content-Type: application/json; charset=UTF-8\r\n\r\n"
                            "{\"name\":\"" + String(saveFilename) + "\",\"parents\":[\"" + String(PARENT_ID) + "\"]}\r\n\r\n"; // parents:save folder
                            //"{\"name\":\"" + saveFilename + "\"}\r\n\r\n"; // parerents is Optional
          String startBoundry = "--foo_bar_baz\r\n"
                                "Content-Type:image/jpeg\r\n\r\n";
          String endBoundry   = "\r\n--foo_bar_baz--";
      
          unsigned long contentsLength = metadata.length() + startBoundry.length() + fb->len + endBoundry.length();
          String header = "POST " + String(apiUri) + " HTTP/1.1\r\n" +
                          "HOST: " + String(apiServer) + "\r\n" +
                          "Connection: close\r\n" +
                          "content-type: multipart/related; boundary=foo_bar_baz\r\n" +
                          "content-length: " + String(contentsLength) + "\r\n" +
                          "authorization: Bearer " + accessToken + "\r\n\r\n";
          
          Serial.println("Send JPEG DATA by API");
          httpsClient.print(header);
          httpsClient.print(metadata);
          httpsClient.print(startBoundry);
          // JPEG data is separated into 1000 bytes and POST
      
      
          int chunk = 1000;
          unsigned long dataLength = fb->len;
          uint8_t*      bufAddr    = fb->buf;
          for(unsigned long i = 0; i < dataLength ;i=i+chunk) {
      
            if ( (i + chunk) < dataLength ) {
              httpsClient.write(( bufAddr + i ), chunk);
            } else if (dataLength%chunk != 0) {
              httpsClient.write(( bufAddr + i ), dataLength%chunk);
            }
          }
          httpsClient.print(endBoundry);
      
          Serial.println("Waiting for response.");
          long int StartTime=millis();
          while (!httpsClient.available()) {
            Serial.print(".");
            delay(100);
            if ((StartTime+waitingTime) < millis()) {
              Serial.println();
              Serial.println("No response.");
              break;
            }
          }
      
        } else {
          Serial.println("Connected to " + String(refreshServer) + " failed.");
        }
      
        httpsClient.stop();
      }
      
      1 Reply Last reply Reply Quote 0
      • N Offline
        nemsys
        last edited by

        error found the Framebuffer fb was being freed before the SSLClient could finish writing hence the corrupted drive image.

        1 Reply Last reply Reply Quote 1

        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

        With your input, this post could be even better 💗

        Register Login
        • First post
          Last post