Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug in GsmSSLWebClient - proposed fix, though not elegant #147

Open
johnedstone opened this issue Dec 26, 2021 · 0 comments
Open

Bug in GsmSSLWebClient - proposed fix, though not elegant #147

johnedstone opened this issue Dec 26, 2021 · 0 comments
Assignees
Labels
topic: documentation Related to documentation for the project type: imperfection Perceived defect in any part of project

Comments

@johnedstone
Copy link

There are two bugs in the GsmSSLWebClient sketch
First: If one uploads this sketch, it never finishes, never gets to lines 91 and 92:

    Serial.println();
    Serial.println("disconnecting.");

Second: If one uses a different server than arduino.cc, e.g google.com, the sketch ends at lines 76-77:

    // if you didn't get a connection to the server:
    Serial.println("connection failed");

The following sketch, Working sketch, which is a modification of the original sketch, fixes both of these bugs, though not in an elegant way.
Is this a bug that you can fix?
Thank you and thanks for this library. This library has been very helpful and compared to some others is awesome
Note: Using a Hologram SIM.

Working sketch

/*
  Web client

 This sketch connects to a website using SSL through a MKR GSM 1400 board. Specifically,
 this example downloads the URL "http://www.arduino.cc/asciilogo.txt" and
 prints it to the Serial monitor.

 Circuit:
 * MKR GSM 1400 board
 * Antenna
 * SIM card with a data plan

 created 8 Mar 2012
 by Tom Igoe

 Modified by [email protected], 26-Dec-2021
 See: https://github.com/johnedstone/mkrgsm1400-post-json-ssl
 Two changes:
    * See SSL hack below
    * Update the file libraries/MKRGSM/src/GSMClient.cpp
      comment out line 125, add line 126
      code:
      #file: libraries/MKRGSM/src/GSMClient.cpp
124     case CLIENT_STATE_MANAGE_SSL_PROFILE: {
125       // MODEM.sendf("AT+USECPRF=0,0,%d",_sslprofile);
126       MODEM.sendf("AT+USECPRF=0");
      
     
 
*/

// libraries
#include <MKRGSM.h>

#include "arduino_secrets.h" 
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
// PIN Number
const char PINNUMBER[]     = SECRET_PINNUMBER;
// APN data
const char GPRS_APN[]      = SECRET_GPRS_APN;
const char GPRS_LOGIN[]    = SECRET_GPRS_LOGIN;
const char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;

// initialize the library instance
GSMSSLClient client;
GPRS gprs;
GSM gsmAccess;

// URL, path and port (for example: arduino.cc)
char server[] = "google.com";
char path[] = "/";
int port = 443; // port 443 is the default for HTTPS

void setup() {
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("Starting Arduino web client.");
  // connection state
  bool connected = false;

  // After starting the modem with GSM.begin()
  // attach the shield to the GPRS network with the APN, login and password
  while (!connected) {
    if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &&
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, port)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.print("GET ");
    client.print(path);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(server);
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // SSL hack: if there is just one byte left, force a stop
  // For SSL client.connected() will not go to false - bug?
  // "A client is considered connected if the connection
  // has been closed but there is still unread data"
  static bool force_client_stop = false;
  if (client.available() == 1 && client.connected()) {
    force_client_stop = true;
  }
  if (force_client_stop && client.available() == 0) {
    client.stop();
  }

  // if the server's disconnected, stop the client:
  if (!client.available() && !client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for (;;)
      ;
  }
}
@per1234 per1234 added topic: documentation Related to documentation for the project type: imperfection Perceived defect in any part of project labels Dec 26, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic: documentation Related to documentation for the project type: imperfection Perceived defect in any part of project
Projects
None yet
Development

No branches or pull requests

3 participants