From dc2d4b588187044fdf652ad2cd5682376d9d77b3 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 23 May 2019 11:14:23 -0400 Subject: [PATCH 01/15] Make examples "wifi-ready" --- .gitignore | 3 +- examples/AllFunctions/AllFunctions.ino | 97 ++++++++++++++------------ examples/BlynkClient/BlynkClient.ino | 2 +- examples/HttpClient/HttpClient.ino | 23 +++--- examples/HttpsClient/HttpsClient.ino | 30 +++++--- examples/MqttClient/MqttClient.ino | 71 ++++++++++++++++--- examples/WebClient/WebClient.ino | 29 ++++---- 7 files changed, 169 insertions(+), 86 deletions(-) diff --git a/.gitignore b/.gitignore index 721a025..f617ccb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,8 +14,7 @@ .cproject .project .settings -.pioenvs -.piolibdeps +.pio/* .clang_complete .gcc-flags.json platformio.ini diff --git a/examples/AllFunctions/AllFunctions.ino b/examples/AllFunctions/AllFunctions.ino index 7447b73..66bd372 100644 --- a/examples/AllFunctions/AllFunctions.ino +++ b/examples/AllFunctions/AllFunctions.ino @@ -28,6 +28,16 @@ // #define TINY_GSM_MODEM_XBEE // #define TINY_GSM_MODEM_SEQUANS_MONARCH +// See all AT commands, if wanted +// #define DUMP_AT_COMMANDS + +// See the debugging, if wanted +#define TINY_GSM_DEBUG SerialMon + +// Range to attempt to autobaud +#define GSM_AUTOBAUD_MIN 9600 +#define GSM_AUTOBAUD_MAX 38400 + // Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial @@ -39,24 +49,15 @@ //#include //SoftwareSerial SerialAT(2, 3); // RX, TX -// See all AT commands, if wanted -//#define DUMP_AT_COMMANDS - -// See the debugging, if wanted -#define TINY_GSM_DEBUG SerialMon - -// Range to attempt to autobaud -#define GSM_AUTOBAUD_MIN 9600 -#define GSM_AUTOBAUD_MAX 38400 - /* * Test enabled */ -#define TINY_GSM_USE_GPRS true -#define TINY_GSM_USE_WIFI false -#define TINY_GSM_USE_CALL true -#define TINY_GSM_USE_SMS true -#define TINY_GSM_USE_USSD true +#define TINY_GSM_TEST_GPRS true +#define TINY_GSM_TEST_WIFI false +#define TINY_GSM_TEST_CALL true +#define TINY_GSM_TEST_SMS true +#define TINY_GSM_TEST_USSD true +#define TINY_GSM_TEST_BATTERY true // powerdown modem after tests #define TINY_GSM_POWERDOWN false @@ -69,11 +70,8 @@ // Your GPRS credentials // Leave empty, if missing user or pass -const char apn[] = "YourAPN"; -const char user[] = ""; -const char pass[] = ""; -const char wifiSSID[] = "YourSSID"; -const char wifiPass[] = "SSIDpw"; +const char gprsUser[] = ""; +const char gprsPass[] = ""; #include @@ -98,11 +96,9 @@ void setup() { digitalWrite(23, HIGH); DBG("Wait..."); - delay(3000); // Set GSM module baud rate - TinyGsmAutoBaud(SerialAT,GSM_AUTOBAUD_MIN,GSM_AUTOBAUD_MAX); - // SerialAT.begin(9600); + delay(3000); } void loop() { @@ -120,26 +116,34 @@ void loop() { return; } + String name = modem.getModemName(); + DBG("Modem Name:", name); + String modemInfo = modem.getModemInfo(); - DBG("Modem:", modemInfo); + DBG("Modem Info:", modemInfo); -#if TINY_GSM_USE_GPRS +#if TINY_GSM_TEST_GPRS // Unlock your SIM card with a PIN if needed if ( GSM_PIN && modem.getSimStatus() != 3 ) { modem.simUnlock(GSM_PIN); } #endif -#if TINY_GSM_USE_WIFI - SerialMon.print(F("Setting SSID/password...")); +#if TINY_GSM_TEST_WIFI + DBG("Setting SSID/password..."); if (!modem.networkConnect(wifiSSID, wifiPass)) { - SerialMon.println(" fail"); + DBG(" fail"); delay(10000); return; } SerialMon.println(" OK"); #endif +#if TINY_GSM_TEST_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif + DBG("Waiting for network..."); if (!modem.waitForNetwork()) { delay(10000); @@ -150,9 +154,9 @@ void loop() { DBG("Network connected"); } -#if TINY_GSM_USE_GPRS +#if TINY_GSM_TEST_GPRS DBG("Connecting to", apn); - if (!modem.gprsConnect(apn, user, pass)) { + if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { delay(10000); return; } @@ -175,17 +179,9 @@ void loop() { int csq = modem.getSignalQuality(); DBG("Signal quality:", csq); - // This is NOT supported on M590 - int battLevel = modem.getBattPercent(); - DBG("Battery lavel:", battLevel); - // This is only supported on SIMxxx series - float battVoltage = modem.getBattVoltage() / 1000.0F; - DBG("Battery voltage:", battVoltage); - - // This is only supported on SIMxxx series - String gsmLoc = modem.getGsmLocation(); - DBG("GSM location:", gsmLoc); + // String gsmLoc = modem.getGsmLocation(); + // DBG("GSM location:", gsmLoc); // This is only supported on SIMxxx series // String gsmTime = modem.getGSMDateTime(DATE_TIME); @@ -207,7 +203,7 @@ void loop() { DBG("GPS raw data:", gps_raw); #endif -#if TINY_GSM_USE_SMS && defined(SMS_TARGET) +#if TINY_GSM_TEST_SMS && defined(SMS_TARGET) res = modem.sendSMS(SMS_TARGET, String("Hello from ") + imei); DBG("SMS:", res ? "OK" : "fail"); @@ -216,7 +212,7 @@ void loop() { DBG("UTF16 SMS:", res ? "OK" : "fail"); #endif -#if TINY_GSM_USE_CALL && defined(CALL_TARGET) +#if TINY_GSM_TEST_CALL && defined(CALL_TARGET) DBG("Calling:", CALL_TARGET); // This is NOT supported on M590 @@ -241,7 +237,20 @@ void loop() { } #endif -#if TINY_GSM_USE_GPRS +#if TINY_GSM_TEST_BATTERY + uint8_t chargeState = -99; + int8_t percent = -99; + uint16_t milliVolts = -9999; + modem.getBattStats(chargeState, percent, milliVolts) + DBG("Battery charge state:", chargeState); + DBG("Battery charge 'percent':", percent); + DBG("Battery voltage:", milliVolts / 1000.0F); + + float temp = modem.getTemperature(); + DBG("Chip temperature:", temp); +#endif + +#if TINY_GSM_TEST_GPRS modem.gprsDisconnect(); if (!modem.isGprsConnected()) { DBG("GPRS disconnected"); @@ -250,7 +259,7 @@ void loop() { } #endif -#if TINY_GSM_USE_WIFI +#if TINY_GSM_TEST_WIFI modem.networkDisconnect(); DBG("WiFi disconnected"); #endif diff --git a/examples/BlynkClient/BlynkClient.ino b/examples/BlynkClient/BlynkClient.ino index 8b17772..1249fd6 100644 --- a/examples/BlynkClient/BlynkClient.ino +++ b/examples/BlynkClient/BlynkClient.ino @@ -48,7 +48,7 @@ // #define TINY_GSM_MODEM_SEQUANS_MONARCH #include -#include +#include // Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial diff --git a/examples/HttpClient/HttpClient.ino b/examples/HttpClient/HttpClient.ino index 9f8d107..304f471 100644 --- a/examples/HttpClient/HttpClient.ino +++ b/examples/HttpClient/HttpClient.ino @@ -12,9 +12,10 @@ * * For more HTTP API examples, see ArduinoHttpClient library * - * NOTE: This example does NOT work with the XBee because the + * NOTE: This example may NOT work with the XBee because the * HttpClient library does not empty to serial buffer fast enough * and the buffer overflow causes the HttpClient library to stall. + * Boards with faster processors may work, 8MHz boards will not. **************************************************************/ // Select your modem: @@ -47,14 +48,11 @@ // See the debugging, if wanted //#define TINY_GSM_DEBUG Serial -//#define LOGGING +//#define LOGGING // <- Logging is for the HTTP library // Add a reception delay, if needed //#define TINY_GSM_YIELD() { delay(1); } -#include -#include - // Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial @@ -85,6 +83,9 @@ const char server[] = "vsh.pp.ua"; const char resource[] = "/TinyGSM/logo.txt"; const int port = 80; +#include +#include + #ifdef DUMP_AT_COMMANDS #include StreamDebugger debugger(SerialAT, SerialMon); @@ -118,6 +119,7 @@ void setup() { // To skip it, call init() instead of restart() SerialMon.println("Initializing modem..."); modem.restart(); + // modem.init(); String modemInfo = modem.getModemInfo(); SerialMon.print("Modem: "); @@ -129,7 +131,7 @@ void setup() { void loop() { -#if TINY_GSM_USE_WIFI +#if defined TINY_GSM_USE_WIFI && defined TINY_GSM_MODEM_HAS_WIFI SerialMon.print(F("Setting SSID/password...")); if (!modem.networkConnect(wifiSSID, wifiPass)) { SerialMon.println(" fail"); @@ -139,6 +141,11 @@ void loop() { SerialMon.println(" OK"); #endif +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif + SerialMon.print("Waiting for network..."); if (!modem.waitForNetwork()) { SerialMon.println(" fail"); @@ -148,10 +155,10 @@ void loop() { SerialMon.println(" OK"); if (modem.isNetworkConnected()) { - SerialMon.print("Network connected"); + SerialMon.println("Network connected"); } -#if TINY_GSM_USE_GPRS +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_HAS_GPRS SerialMon.print(F("Connecting to ")); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { diff --git a/examples/HttpsClient/HttpsClient.ino b/examples/HttpsClient/HttpsClient.ino index 324e5c2..dbe5202 100644 --- a/examples/HttpsClient/HttpsClient.ino +++ b/examples/HttpsClient/HttpsClient.ino @@ -10,19 +10,27 @@ * TinyGSM Getting Started guide: * https://tiny.cc/tinygsm-readme * - * SSL/TLS is currently supported only with: SIM8xx, uBlox, ESP8266 + * SSL/TLS is not yet supported on the Quectel modems + * The A6/A7/A20 and M590 are not capable of SSL/TLS * * For more HTTP API examples, see ArduinoHttpClient library * + * NOTE: This example may NOT work with the XBee because the + * HttpClient library does not empty to serial buffer fast enough + * and the buffer overflow causes the HttpClient library to stall. + * Boards with faster processors may work, 8MHz boards will not. **************************************************************/ // Select your modem: #define TINY_GSM_MODEM_SIM800 // #define TINY_GSM_MODEM_SIM808 // #define TINY_GSM_MODEM_SIM868 +// #define TINY_GSM_MODEM_SIM7000 // #define TINY_GSM_MODEM_UBLOX // #define TINY_GSM_MODEM_SARAR4 // #define TINY_GSM_MODEM_ESP8266 +// #define TINY_GSM_MODEM_XBEE +// #define TINY_GSM_MODEM_SEQUANS_MONARCH // Increase RX buffer to capture the entire response // Chips without internal buffering (ESP8266) @@ -35,14 +43,11 @@ // See the debugging, if wanted //#define TINY_GSM_DEBUG Serial -//#define LOGGING +//#define LOGGING // <- Logging is for the HTTP library // Add a reception delay, if needed //#define TINY_GSM_YIELD() { delay(1); } -#include -#include - // Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial @@ -73,6 +78,9 @@ const char server[] = "vsh.pp.ua"; const char resource[] = "/TinyGSM/logo.txt"; const int port = 443; +#include +#include + #ifdef DUMP_AT_COMMANDS #include StreamDebugger debugger(SerialAT, SerialMon); @@ -106,6 +114,7 @@ void setup() { // To skip it, call init() instead of restart() SerialMon.println("Initializing modem..."); modem.restart(); + // modem.init(); String modemInfo = modem.getModemInfo(); SerialMon.print("Modem: "); @@ -122,7 +131,7 @@ void setup() { void loop() { -#if TINY_GSM_USE_WIFI +#if defined TINY_GSM_USE_WIFI && defined TINY_GSM_MODEM_HAS_WIFI SerialMon.print(F("Setting SSID/password...")); if (!modem.networkConnect(wifiSSID, wifiPass)) { SerialMon.println(" fail"); @@ -132,6 +141,11 @@ void loop() { SerialMon.println(" OK"); #endif +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif + SerialMon.print("Waiting for network..."); if (!modem.waitForNetwork()) { SerialMon.println(" fail"); @@ -141,10 +155,10 @@ void loop() { SerialMon.println(" OK"); if (modem.isNetworkConnected()) { - SerialMon.print("Network connected"); + SerialMon.println("Network connected"); } -#if TINY_GSM_USE_GPRS +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_HAS_GPRS SerialMon.print(F("Connecting to ")); SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { diff --git a/examples/MqttClient/MqttClient.ino b/examples/MqttClient/MqttClient.ino index 1bea009..fb04046 100644 --- a/examples/MqttClient/MqttClient.ino +++ b/examples/MqttClient/MqttClient.ino @@ -46,12 +46,23 @@ // #define TINY_GSM_MODEM_XBEE // #define TINY_GSM_MODEM_SEQUANS_MONARCH -#include -#include +// See all AT commands, if wanted +// #define DUMP_AT_COMMANDS + +// See the debugging, if wanted +#define TINY_GSM_DEBUG SerialMon + +// Range to attempt to autobaud +#define GSM_AUTOBAUD_MIN 9600 +#define GSM_AUTOBAUD_MAX 38400 + +// Add a reception delay, if needed +#define TINY_GSM_YIELD() { delay(2); } // Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial +// Set serial for AT commands (to the module) // Use Hardware Serial on Mega, Leonardo, Micro #define SerialAT Serial1 @@ -73,7 +84,17 @@ const char* topicLed = "GsmClientTest/led"; const char* topicInit = "GsmClientTest/init"; const char* topicLedStatus = "GsmClientTest/ledStatus"; +#include +#include + +#ifdef DUMP_AT_COMMANDS + #include + StreamDebugger debugger(SerialAT, SerialMon); + TinyGsm modem(debugger); +#else + TinyGsm modem(SerialAT); +#endif TinyGsmClient client(modem); PubSubClient mqtt(client); @@ -83,12 +104,22 @@ int ledStatus = LOW; long lastReconnectAttempt = 0; void setup() { - pinMode(LED_PIN, OUTPUT); // Set console baud rate SerialMon.begin(115200); delay(10); + // Set your reset, enable, power pins here + pinMode(LED_PIN, OUTPUT); + + pinMode(20, OUTPUT); + digitalWrite(20, HIGH); + + pinMode(23, OUTPUT); + digitalWrite(23, LOW); + + SerialMon.println("Wait..."); + // Set GSM module baud rate SerialAT.begin(115200); delay(3000); @@ -97,6 +128,7 @@ void setup() { // To skip it, call init() instead of restart() SerialMon.println("Initializing modem..."); modem.restart(); + // modem.init(); String modemInfo = modem.getModemInfo(); SerialMon.print("Modem: "); @@ -105,20 +137,43 @@ void setup() { // Unlock your SIM card with a PIN //modem.simUnlock("1234"); +#if TINY_GSM_USE_WIFI + SerialMon.print(F("Setting SSID/password...")); + if (!modem.networkConnect(wifiSSID, wifiPass)) { + SerialMon.println(" fail"); + delay(10000); + return; + } + SerialMon.println(" OK"); +#endif + +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif + SerialMon.print("Waiting for network..."); - if (!modem.waitForNetwork()) { + if (!modem.waitForNetwork(240000L)) { SerialMon.println(" fail"); - while (true); + delay(10000); + return; } SerialMon.println(" OK"); - SerialMon.print("Connecting to "); + if (modem.isNetworkConnected()) { + SerialMon.println("Network connected"); + } + +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_HAS_GPRS + SerialMon.print(F("Connecting to ")); SerialMon.print(apn); - if (!modem.gprsConnect(apn, user, pass)) { + if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" fail"); - while (true); + delay(10000); + return; } SerialMon.println(" OK"); +#endif // MQTT Broker setup mqtt.setServer(broker, 1883); diff --git a/examples/WebClient/WebClient.ino b/examples/WebClient/WebClient.ino index bf3b843..aa0e156 100644 --- a/examples/WebClient/WebClient.ino +++ b/examples/WebClient/WebClient.ino @@ -47,16 +47,6 @@ //#include //SoftwareSerial SerialAT(2, 3); // RX, TX -// See all AT commands, if wanted -//#define DUMP_AT_COMMANDS - -// See the debugging, if wanted -// #define TINY_GSM_DEBUG SerialMon - -// Range to attempt to autobaud -#define GSM_AUTOBAUD_MIN 9600 -#define GSM_AUTOBAUD_MAX 38400 - #define TINY_GSM_USE_GPRS true #define TINY_GSM_USE_WIFI false @@ -122,9 +112,12 @@ void setup() { SerialMon.print("Modem: "); SerialMon.println(modemInfo); - // Unlock your SIM card with a PIN - //modem.simUnlock("1234"); +#if TINY_GSM_USE_GPRS + // Unlock your SIM card with a PIN if needed + if ( GSM_PIN && modem.getSimStatus() != 3 ) { + modem.simUnlock(GSM_PIN); } +#endif void loop() { @@ -138,6 +131,11 @@ void loop() { SerialMon.println(" OK"); #endif +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif + SerialMon.print("Waiting for network..."); if (!modem.waitForNetwork(240000L)) { SerialMon.println(" fail"); @@ -150,9 +148,9 @@ void loop() { SerialMon.println("Network connected"); } -#if TINY_GSM_USE_GPRS +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_HAS_GPRS SerialMon.print(F("Connecting to ")); - SerialMon.println(apn); + SerialMon.print(apn); if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(" fail"); delay(10000); @@ -172,9 +170,10 @@ void loop() { // Make a HTTP GET request: SerialMon.println("Performing HTTP GET request..."); - client.print(String("GET ") + resource + " HTTP/1.0\r\n"); + client.print(String("GET ") + resource + " HTTP/1.1\r\n"); client.print(String("Host: ") + server + "\r\n"); client.print("Connection: close\r\n\r\n"); + client.println(); unsigned long timeout = millis(); while (client.connected() && millis() - timeout < 10000L) { From 7e314292d4bdeeafe06f4ea5d8086b9a1c64b17f Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 23 May 2019 12:39:04 -0400 Subject: [PATCH 02/15] Another example update --- examples/AllFunctions/AllFunctions.ino | 7 +- examples/HttpClient/HttpClient.ino | 2 +- examples/HttpsClient/HttpsClient.ino | 4 +- examples/MqttClient/MqttClient.ino | 2 +- examples/WebClient/WebClient.ino | 10 +++ tools/Diagnostics/Diagnostics.ino | 106 ++++++++++++++++++++----- 6 files changed, 104 insertions(+), 27 deletions(-) diff --git a/examples/AllFunctions/AllFunctions.ino b/examples/AllFunctions/AllFunctions.ino index 66bd372..718193c 100644 --- a/examples/AllFunctions/AllFunctions.ino +++ b/examples/AllFunctions/AllFunctions.ino @@ -31,7 +31,7 @@ // See all AT commands, if wanted // #define DUMP_AT_COMMANDS -// See the debugging, if wanted +// Define the serial console for debug prints, if needed #define TINY_GSM_DEBUG SerialMon // Range to attempt to autobaud @@ -70,8 +70,11 @@ // Your GPRS credentials // Leave empty, if missing user or pass +const char apn[] = "YourAPN"; const char gprsUser[] = ""; const char gprsPass[] = ""; +const char wifiSSID[] = "YourSSID"; +const char wifiPass[] = "YourWiFiPass"; #include @@ -98,6 +101,8 @@ void setup() { DBG("Wait..."); // Set GSM module baud rate + TinyGsmAutoBaud(SerialAT,GSM_AUTOBAUD_MIN,GSM_AUTOBAUD_MAX); + //SerialAT.begin(9600); delay(3000); } diff --git a/examples/HttpClient/HttpClient.ino b/examples/HttpClient/HttpClient.ino index 304f471..45295b8 100644 --- a/examples/HttpClient/HttpClient.ino +++ b/examples/HttpClient/HttpClient.ino @@ -46,7 +46,7 @@ // See all AT commands, if wanted //#define DUMP_AT_COMMANDS -// See the debugging, if wanted +// Define the serial console for debug prints, if needed //#define TINY_GSM_DEBUG Serial //#define LOGGING // <- Logging is for the HTTP library diff --git a/examples/HttpsClient/HttpsClient.ino b/examples/HttpsClient/HttpsClient.ino index dbe5202..ca61d43 100644 --- a/examples/HttpsClient/HttpsClient.ino +++ b/examples/HttpsClient/HttpsClient.ino @@ -33,7 +33,7 @@ // #define TINY_GSM_MODEM_SEQUANS_MONARCH // Increase RX buffer to capture the entire response -// Chips without internal buffering (ESP8266) +// Chips without internal buffering (A6/A7, ESP8266, M590) // need enough space in the buffer for the entire response // else data will be lost (and the http library will fail). #define TINY_GSM_RX_BUFFER 650 @@ -41,7 +41,7 @@ // See all AT commands, if wanted //#define DUMP_AT_COMMANDS -// See the debugging, if wanted +// Define the serial console for debug prints, if needed //#define TINY_GSM_DEBUG Serial //#define LOGGING // <- Logging is for the HTTP library diff --git a/examples/MqttClient/MqttClient.ino b/examples/MqttClient/MqttClient.ino index fb04046..841be7f 100644 --- a/examples/MqttClient/MqttClient.ino +++ b/examples/MqttClient/MqttClient.ino @@ -49,7 +49,7 @@ // See all AT commands, if wanted // #define DUMP_AT_COMMANDS -// See the debugging, if wanted +// Define the serial console for debug prints, if needed #define TINY_GSM_DEBUG SerialMon // Range to attempt to autobaud diff --git a/examples/WebClient/WebClient.ino b/examples/WebClient/WebClient.ino index aa0e156..e15787b 100644 --- a/examples/WebClient/WebClient.ino +++ b/examples/WebClient/WebClient.ino @@ -30,6 +30,16 @@ // Increase RX buffer if needed // #define TINY_GSM_RX_BUFFER 512 +// See all AT commands, if wanted +// #define DUMP_AT_COMMANDS + +// Define the serial console for debug prints, if needed +#define TINY_GSM_DEBUG SerialMon + +// Range to attempt to autobaud +#define GSM_AUTOBAUD_MIN 9600 +#define GSM_AUTOBAUD_MAX 115200 + // Add a reception delay, if needed // #define TINY_GSM_YIELD() { delay(1); } diff --git a/tools/Diagnostics/Diagnostics.ino b/tools/Diagnostics/Diagnostics.ino index 8283c59..a4ecde7 100644 --- a/tools/Diagnostics/Diagnostics.ino +++ b/tools/Diagnostics/Diagnostics.ino @@ -14,7 +14,10 @@ // #define TINY_GSM_MODEM_SIM900 // #define TINY_GSM_MODEM_SIM808 // #define TINY_GSM_MODEM_SIM868 +// #define TINY_GSM_MODEM_SIM900 +// #define TINY_GSM_MODEM_SIM7000 // #define TINY_GSM_MODEM_UBLOX +// #define TINY_GSM_MODEM_SARAR4 // #define TINY_GSM_MODEM_M95 // #define TINY_GSM_MODEM_BG96 // #define TINY_GSM_MODEM_A6 @@ -24,22 +27,28 @@ // #define TINY_GSM_MODEM_MC60E // #define TINY_GSM_MODEM_ESP8266 // #define TINY_GSM_MODEM_XBEE +// #define TINY_GSM_MODEM_SEQUANS_MONARCH -// Increase the buffer +// Increase RX buffer if needed #define TINY_GSM_RX_BUFFER 512 +// See all AT commands, if wanted +#define DUMP_AT_COMMANDS + // Define the serial console for debug prints, if needed -//#define TINY_GSM_DEBUG Serial +#define TINY_GSM_DEBUG Serial -#include +// Range to attempt to autobaud +#define GSM_AUTOBAUD_MIN 9600 +#define GSM_AUTOBAUD_MAX 115200 -// Your GPRS credentials -// Leave empty, if missing user or pass -const char apn[] = "YourAPN"; -const char user[] = ""; -const char pass[] = ""; +// Add a reception delay, if needed +#define TINY_GSM_YIELD() { delay(2); } -// Set serial for debug console (to the Serial Monitor, speed 115200) +// Uncomment this if you want to use SSL +//#define USE_SSL + +// Set serial for debug console (to the Serial Monitor, default speed 115200) #define SerialMon Serial // Set serial for AT commands (to the module) @@ -50,28 +59,59 @@ const char pass[] = ""; //#include //SoftwareSerial SerialAT(2, 3); // RX, TX +#define TINY_GSM_USE_GPRS true +#define TINY_GSM_USE_WIFI false -#include -StreamDebugger debugger(SerialAT, SerialMon); -TinyGsm modem(debugger); +// set GSM PIN, if any +#define GSM_PIN "" +// Your GPRS credentials +// Leave empty, if missing user or pass +const char apn[] = "YourAPN"; +const char gprsUser[] = ""; +const char gprsPass[] = ""; +const char wifiSSID[] = "YourSSID"; +const char wifiPass[] = "YourWiFiPass"; + +// Server details const char server[] = "vsh.pp.ua"; const char resource[] = "/TinyGSM/logo.txt"; -const int port = 80; -TinyGsmClient client(modem); +#include -// For SSL: -//const int port = 443; -//TinyGsmClientSecure client(modem); +#ifdef DUMP_AT_COMMANDS +#include +StreamDebugger debugger(SerialAT, SerialMon); +TinyGsm modem(debugger); +#else + TinyGsm modem(SerialAT); +#endif + +#ifdef USE_SSL + TinyGsmClientSecure client(modem); + const int port = 443; +#else + TinyGsmClient client(modem); +const int port = 80; +#endif void setup() { // Set console baud rate SerialMon.begin(115200); delay(10); + // Set your reset, enable, power pins here + pinMode(20, OUTPUT); + digitalWrite(20, HIGH); + + pinMode(23, OUTPUT); + digitalWrite(23, HIGH); + + SerialMon.println("Wait..."); + // Set GSM module baud rate - SerialAT.begin(115200); + TinyGsmAutoBaud(SerialAT,GSM_AUTOBAUD_MIN,GSM_AUTOBAUD_MAX); + // SerialAT.begin(115200); delay(3000); } @@ -80,6 +120,7 @@ void loop() { // To skip it, call init() instead of restart() SerialMon.print("Initializing modem..."); if (!modem.restart()) { + // if (!modem.init()) { SerialMon.println(F(" [fail]")); SerialMon.println(F("************************")); SerialMon.println(F(" Is your modem connected properly?")); @@ -97,11 +138,30 @@ void loop() { SerialMon.print("Modem: "); SerialMon.println(modemInfo); - // Unlock your SIM card with a PIN - //modem.simUnlock("1234"); +#if TINY_GSM_USE_GPRS + // Unlock your SIM card with a PIN if needed + if ( GSM_PIN && modem.getSimStatus() != 3 ) { + modem.simUnlock(GSM_PIN); + } +#endif + +#if TINY_GSM_USE_WIFI + SerialMon.print(F("Setting SSID/password...")); + if (!modem.networkConnect(wifiSSID, wifiPass)) { + SerialMon.println(" fail"); + delay(10000); + return; + } + SerialMon.println(" OK"); +#endif + +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_XBEE + // The XBee must run the gprsConnect function BEFORE waiting for network! + modem.gprsConnect(apn, gprsUser, gprsPass); +#endif SerialMon.print("Waiting for network..."); - if (!modem.waitForNetwork()) { + if (!modem.waitForNetwork(240000L)) { // You may need lengthen this in poor service ares SerialMon.println(F(" [fail]")); SerialMon.println(F("************************")); SerialMon.println(F(" Is your sim card locked?")); @@ -114,9 +174,10 @@ void loop() { } SerialMon.println(F(" [OK]")); +#if TINY_GSM_USE_GPRS && defined TINY_GSM_MODEM_HAS_GPRS SerialMon.print("Connecting to "); SerialMon.print(apn); - if (!modem.gprsConnect(apn, user, pass)) { + if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { SerialMon.println(F(" [fail]")); SerialMon.println(F("************************")); SerialMon.println(F(" Is GPRS enabled by network provider?")); @@ -126,6 +187,7 @@ void loop() { return; } SerialMon.println(F(" [OK]")); +#endif IPAddress local = modem.localIP(); SerialMon.print("Local IP: "); From fcb3d5b010e996922cebe0671c0974b4752483d6 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 23 May 2019 15:32:24 -0400 Subject: [PATCH 03/15] De-increment sock available as we read out of sock --- .gitignore | 2 ++ src/TinyGsmClientBG96.h | 2 ++ src/TinyGsmClientM95.h | 2 ++ src/TinyGsmClientMC60.h | 2 ++ src/TinyGsmClientSIM7000.h | 6 ++++-- src/TinyGsmClientSIM800.h | 6 ++++-- src/TinyGsmClientSaraR4.h | 2 ++ src/TinyGsmClientSequansMonarch.h | 4 +++- src/TinyGsmClientUBLOX.h | 2 ++ src/TinyGsmCommon.h | 2 +- 10 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index f617ccb..11753c7 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ .cproject .project .settings +.pioenvs +.piolibdeps .pio/* .clang_complete .gcc-flags.json diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index 66a5058..904403c 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -548,6 +548,8 @@ protected: for (size_t i=0; isock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", len, "from", mux); diff --git a/src/TinyGsmClientM95.h b/src/TinyGsmClientM95.h index 038ec17..7106638 100644 --- a/src/TinyGsmClientM95.h +++ b/src/TinyGsmClientM95.h @@ -615,6 +615,8 @@ protected: for (size_t i=0; isock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", len, "from", mux); diff --git a/src/TinyGsmClientMC60.h b/src/TinyGsmClientMC60.h index 33afb7c..0db5348 100644 --- a/src/TinyGsmClientMC60.h +++ b/src/TinyGsmClientMC60.h @@ -622,6 +622,8 @@ protected: for (size_t i=0; isock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", len, "from", mux); diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index e1c0008..da2060c 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -835,12 +835,12 @@ protected: size_t len_requested = stream.readStringUntil(',').toInt(); // ^^ Requested number of data bytes (1-1460 bytes)to be read size_t len_confirmed = stream.readStringUntil('\n').toInt(); + // ^^ Confirmed number of data bytes to be read, which may be less than requested. + // 0 indicates that no data can be read. if (len_confirmed < len_requested) { DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); } sockets[mux]->sock_available = len_confirmed; - // ^^ Confirmed number of data bytes to be read, which may be less than requested. - // 0 indicates that no data can be read. for (size_t i=0; irx.put(c); + sockets[mux]->sock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", TinyGsmMin(len_confirmed, len_requested), "from", mux); diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index c6f72c0..3f38587 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -765,12 +765,12 @@ protected: size_t len_requested = stream.readStringUntil(',').toInt(); // ^^ Requested number of data bytes (1-1460 bytes)to be read size_t len_confirmed = stream.readStringUntil('\n').toInt(); + // ^^ Confirmed number of data bytes to be read, which may be less than requested. + // 0 indicates that no data can be read. if (len_confirmed < len_requested) { DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); } sockets[mux]->sock_available = len_confirmed; - // ^^ Confirmed number of data bytes to be read, which may be less than requested. - // 0 indicates that no data can be read. for (size_t i=0; irx.put(c); + sockets[mux]->sock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", TinyGsmMin(len_confirmed, len_requested), "from", mux); diff --git a/src/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index d06ec78..8a11245 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -610,6 +610,8 @@ protected: for (size_t i=0; isock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } streamSkipUntil('\"'); waitResponse(); diff --git a/src/TinyGsmClientSequansMonarch.h b/src/TinyGsmClientSequansMonarch.h index e48bcde..ad79062 100644 --- a/src/TinyGsmClientSequansMonarch.h +++ b/src/TinyGsmClientSequansMonarch.h @@ -621,10 +621,12 @@ protected: while (!stream.available() && ((millis() - startMillis) < sockets[mux % TINY_GSM_MUX_COUNT]->_timeout)) { TINY_GSM_YIELD(); } \ char c = stream.read(); \ sockets[mux % TINY_GSM_MUX_COUNT]->rx.put(c); + sockets[mux % TINY_GSM_MUX_COUNT]->sock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } // DBG("### Read:", len, "from", mux); waitResponse(); - sockets[mux % TINY_GSM_MUX_COUNT]->sock_available = modemGetAvailable(mux); + // sockets[mux % TINY_GSM_MUX_COUNT]->sock_available = modemGetAvailable(mux); return len; } diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index 5c56f9f..a9f0cb1 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -598,6 +598,8 @@ protected: for (size_t i=0; isock_available--; + // ^^ One less character available after moving from modem's FIFO to our FIFO } streamSkipUntil('\"'); waitResponse(); diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index a92c08e..5ddefe6 100644 --- a/src/TinyGsmCommon.h +++ b/src/TinyGsmCommon.h @@ -100,7 +100,7 @@ uint32_t TinyGsmAutoBaud(T& SerialAT, uint32_t minimum = 9600, uint32_t maximum DBG("Trying baud rate", rate, "..."); SerialAT.begin(rate); delay(10); - for (int i=0; i<3; i++) { + for (int i=0; i<10; i++) { SerialAT.print("AT\r\n"); String input = SerialAT.readString(); if (input.indexOf("OK") >= 0) { From fa5ca6e67ceea821c931cf131776a0d9951e194f Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 23 May 2019 15:59:59 -0400 Subject: [PATCH 04/15] Version bump and debug print --- library.json | 2 +- library.properties | 2 +- src/TinyGsmClientSIM800.h | 1 + src/TinyGsmClientSequansMonarch.h | 4 ++-- src/TinyGsmCommon.h | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/library.json b/library.json index 78289ec..8156329 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TinyGSM", - "version": "0.7.4", + "version": "0.7.5", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports many GSM, LTE, and WiFi modules with AT command interfaces.", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM7000, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox, Quectel, SIMCOM, AI Thinker, LTE, LTE-M", "authors": diff --git a/library.properties b/library.properties index 28c2c75..3180b11 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TinyGSM -version=0.7.4 +version=0.7.5 author=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy sentence=A small Arduino library for GPRS modules, that just works. diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index 3f38587..6325fcf 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -802,6 +802,7 @@ protected: result = stream.readStringUntil('\n').toInt(); waitResponse(); } + DBG("### Available:", result, "on", mux); if (!result) { sockets[mux]->sock_connected = modemGetConnected(mux); } diff --git a/src/TinyGsmClientSequansMonarch.h b/src/TinyGsmClientSequansMonarch.h index ad79062..7277ca4 100644 --- a/src/TinyGsmClientSequansMonarch.h +++ b/src/TinyGsmClientSequansMonarch.h @@ -624,7 +624,7 @@ protected: sockets[mux % TINY_GSM_MUX_COUNT]->sock_available--; // ^^ One less character available after moving from modem's FIFO to our FIFO } - // DBG("### Read:", len, "from", mux); + DBG("### Read:", len, "from", mux); waitResponse(); // sockets[mux % TINY_GSM_MUX_COUNT]->sock_available = modemGetAvailable(mux); return len; @@ -640,7 +640,7 @@ protected: result = stream.readStringUntil(',').toInt(); // keep data not yet read waitResponse(); } - // DBG("### Available:", result, "on", mux); + DBG("### Available:", result, "on", mux); return result; } diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index 5ddefe6..68024ac 100644 --- a/src/TinyGsmCommon.h +++ b/src/TinyGsmCommon.h @@ -10,7 +10,7 @@ #define TinyGsmCommon_h // The current library version number -#define TINYGSM_VERSION "0.7.4" +#define TINYGSM_VERSION "0.7.5" #if defined(SPARK) || defined(PARTICLE) #include "Particle.h" From 98bee318ade40125b922300e6a9e4f731bdf9607 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 23 May 2019 18:20:51 -0400 Subject: [PATCH 05/15] Correct SSL on XBee --- src/TinyGsmClientSIM800.h | 2 +- src/TinyGsmClientXBee.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index 6325fcf..f3396a0 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -768,7 +768,7 @@ protected: // ^^ Confirmed number of data bytes to be read, which may be less than requested. // 0 indicates that no data can be read. if (len_confirmed < len_requested) { - DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); + DBG("WARNING:", len_requested - len_confirmed, "fewer bytes confirmed readable than requested!"); } sockets[mux]->sock_available = len_confirmed; diff --git a/src/TinyGsmClientXBee.h b/src/TinyGsmClientXBee.h index eaa1d47..02aa2b4 100644 --- a/src/TinyGsmClientXBee.h +++ b/src/TinyGsmClientXBee.h @@ -109,7 +109,7 @@ public: virtual int connect(IPAddress ip, uint16_t port, int timeout_s) { // NOTE: Not caling stop() or yeild() here at->streamClear(); // Empty anything in the buffer before starting - sock_connected = at->modemConnect(ip, port, mux, timeout_s); + sock_connected = at->modemConnect(ip, port, mux, false, timeout_s); return sock_connected; } virtual int connect(IPAddress ip, uint16_t port) { @@ -247,7 +247,7 @@ public: virtual int connect(IPAddress ip, uint16_t port, int timeout_s) { // NOTE: Not caling stop() or yeild() here at->streamClear(); // Empty anything in the buffer before starting - sock_connected = at->modemConnect(ip, port, mux, timeout_s); + sock_connected = at->modemConnect(ip, port, mux, true, timeout_s); return sock_connected; } }; From 344bacd73e8ec15aaedbce1c64572a220ad3dbe3 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 14:40:09 -0400 Subject: [PATCH 06/15] Fixed SIM800 issue --- src/TinyGsmClientSIM800.h | 29 ++++++++++++++++------------- src/TinyGsmCommon.h | 4 ++-- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index f3396a0..c62f282 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -308,7 +308,7 @@ TINY_GSM_MODEM_GET_IMEI_GSN() delay(1000); continue; } - int status = waitResponse(GF("READY"), GF("SIM PIN"), GF("SIM PUK"), GF("NOT INSERTED")); + int status = waitResponse(GF("READY"), GF("SIM PIN"), GF("SIM PUK"), GF("NOT INSERTED"), GF("NOT READY")); waitResponse(); switch (status) { case 2: @@ -767,12 +767,10 @@ protected: size_t len_confirmed = stream.readStringUntil('\n').toInt(); // ^^ Confirmed number of data bytes to be read, which may be less than requested. // 0 indicates that no data can be read. - if (len_confirmed < len_requested) { - DBG("WARNING:", len_requested - len_confirmed, "fewer bytes confirmed readable than requested!"); - } - sockets[mux]->sock_available = len_confirmed; - - for (size_t i=0; i_timeout)) { TINY_GSM_YIELD(); } @@ -784,13 +782,16 @@ protected: while (!stream.available() && (millis() - startMillis < sockets[mux]->_timeout)) { TINY_GSM_YIELD(); } char c = stream.read(); #endif - sockets[mux]->rx.put(c); - sockets[mux]->sock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO + if (c > 0) { + sockets[mux]->rx.put(c); + len_read++; + } } + DBG("### READ:", len_read, "from", mux); + // sockets[mux]->sock_available = modemGetAvailable(mux); + sockets[mux]->sock_available = len_confirmed; waitResponse(); - DBG("### READ:", TinyGsmMin(len_confirmed, len_requested), "from", mux); - return TinyGsmMin(len_confirmed, len_requested); + return len_read; } size_t modemGetAvailable(uint8_t mux) { @@ -811,7 +812,9 @@ protected: bool modemGetConnected(uint8_t mux) { sendAT(GF("+CIPSTATUS="), mux); - int res = waitResponse(GF(",\"CONNECTED\""), GF(",\"CLOSED\""), GF(",\"CLOSING\""), GF(",\"INITIAL\"")); + waitResponse(GF("+CIPSTATUS")); + int res = waitResponse(GF(",\"CONNECTED\""), GF(",\"CLOSED\""), GF(",\"CLOSING\""), + GF(",\"REMOTE CLOSING\""), GF(",\"INITIAL\"")); waitResponse(); return 1 == res; } diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index 68024ac..0876c51 100644 --- a/src/TinyGsmCommon.h +++ b/src/TinyGsmCommon.h @@ -249,7 +249,7 @@ String TinyGsmDecodeHex16bit(String &instr) { /* Workaround: sometimes module forgets to notify about data arrival. TODO: Currently we ping the module periodically, but maybe there's a better indicator that we need to poll */ \ - if (millis() - prev_check > 250) { \ + if (millis() - prev_check > 500) { \ got_data = true; \ prev_check = millis(); \ } \ @@ -311,7 +311,7 @@ String TinyGsmDecodeHex16bit(String &instr) { /* Workaround: sometimes module forgets to notify about data arrival. TODO: Currently we ping the module periodically, but maybe there's a better indicator that we need to poll */ \ - if (millis() - prev_check > 250) { \ + if (millis() - prev_check > 500) { \ got_data = true; \ prev_check = millis(); \ } \ From eeef8e3c6937c8a6245e6de66e3cceb111b02c1d Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 14:47:08 -0400 Subject: [PATCH 07/15] Version bump --- library.json | 2 +- library.properties | 2 +- src/TinyGsmCommon.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library.json b/library.json index 8156329..4aef743 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TinyGSM", - "version": "0.7.5", + "version": "0.7.6", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports many GSM, LTE, and WiFi modules with AT command interfaces.", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM7000, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox, Quectel, SIMCOM, AI Thinker, LTE, LTE-M", "authors": diff --git a/library.properties b/library.properties index 3180b11..74be952 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TinyGSM -version=0.7.5 +version=0.7.6 author=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy sentence=A small Arduino library for GPRS modules, that just works. diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index 0876c51..c696d04 100644 --- a/src/TinyGsmCommon.h +++ b/src/TinyGsmCommon.h @@ -10,7 +10,7 @@ #define TinyGsmCommon_h // The current library version number -#define TINYGSM_VERSION "0.7.5" +#define TINYGSM_VERSION "0.7.6" #if defined(SPARK) || defined(PARTICLE) #include "Particle.h" From 3fee997934f3a6e81b8ca798e9973b272ae56789 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 16:29:11 -0400 Subject: [PATCH 08/15] Fixed webclient 's lost bracket --- examples/WebClient/WebClient.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/WebClient/WebClient.ino b/examples/WebClient/WebClient.ino index e15787b..af26650 100644 --- a/examples/WebClient/WebClient.ino +++ b/examples/WebClient/WebClient.ino @@ -128,6 +128,7 @@ void setup() { modem.simUnlock(GSM_PIN); } #endif +} void loop() { From 9e3e67473a594887e0fa8c8062281d34a785f4dd Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 16:49:05 -0400 Subject: [PATCH 09/15] Need to read negative bytes --- src/TinyGsmClientSIM800.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index c62f282..c0252bb 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -768,8 +768,6 @@ protected: // ^^ Confirmed number of data bytes to be read, which may be less than requested. // 0 indicates that no data can be read. // This is actually be the number of bytes that will be remaining after the read - size_t len_read = 0; - // Attempt to read the full amount we requested, even if that quantity was not confirmed for (size_t i=0; i_timeout)) { TINY_GSM_YIELD(); } char c = stream.read(); #endif - if (c > 0) { - sockets[mux]->rx.put(c); - len_read++; - } + sockets[mux]->rx.put(c); } - DBG("### READ:", len_read, "from", mux); + DBG("### READ:", len_requested, "from", mux); // sockets[mux]->sock_available = modemGetAvailable(mux); sockets[mux]->sock_available = len_confirmed; waitResponse(); - return len_read; + return len_requested; } size_t modemGetAvailable(uint8_t mux) { From d55b5e6ed622a682c27c6fbaf8e6c493e066fdee Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 17:52:19 -0400 Subject: [PATCH 10/15] Re-Fix SIM7000 --- src/TinyGsmClientSIM7000.h | 22 ++++++++++------------ src/TinyGsmClientSIM800.h | 1 - 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index da2060c..458a05b 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -481,7 +481,6 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() return TinyGsmIpFromString(getLocalIP()); } - /* * Phone Call functions */ @@ -726,7 +725,7 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() } /* - * Battery functions + * Battery & temperature functions */ // Use: float vBatt = modem.getBattVoltage() / 1000.0; @@ -739,6 +738,7 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() streamSkipUntil(','); // Skip battery charge level // return voltage in mV uint16_t res = stream.readStringUntil(',').toInt(); + // Wait for final OK waitResponse(); return res; } @@ -751,6 +751,7 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() streamSkipUntil(','); // Skip battery charge status // Read battery charge level int res = stream.readStringUntil(',').toInt(); + // Wait for final OK waitResponse(); return res; } @@ -837,12 +838,8 @@ protected: size_t len_confirmed = stream.readStringUntil('\n').toInt(); // ^^ Confirmed number of data bytes to be read, which may be less than requested. // 0 indicates that no data can be read. - if (len_confirmed < len_requested) { - DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); - } - sockets[mux]->sock_available = len_confirmed; - - for (size_t i=0; i_timeout)) { TINY_GSM_YIELD(); } @@ -855,12 +852,12 @@ protected: char c = stream.read(); #endif sockets[mux]->rx.put(c); - sockets[mux]->sock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO } + DBG("### READ:", len_requested, "from", mux); + // sockets[mux]->sock_available = modemGetAvailable(mux); + sockets[mux]->sock_available = len_confirmed; waitResponse(); - DBG("### READ:", TinyGsmMin(len_confirmed, len_requested), "from", mux); - return TinyGsmMin(len_confirmed, len_requested); + return len_requested; } size_t modemGetAvailable(uint8_t mux) { @@ -872,6 +869,7 @@ protected: result = stream.readStringUntil('\n').toInt(); waitResponse(); } + DBG("### Available:", result, "on", mux); if (!result) { sockets[mux]->sock_connected = modemGetConnected(mux); } diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index c0252bb..f2030dd 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -459,7 +459,6 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() return true; } - /* * IP Address functions */ From 0cfb730dce6e1280c4a965845f90699173e1cb34 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 19:04:13 -0400 Subject: [PATCH 11/15] Re-align Quectel 2G with manuals --- src/TinyGsmClientM95.h | 36 +++++++++++++++--------------------- src/TinyGsmClientMC60.h | 34 ++++++++++++++-------------------- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/TinyGsmClientM95.h b/src/TinyGsmClientM95.h index 7106638..3921fa7 100644 --- a/src/TinyGsmClientM95.h +++ b/src/TinyGsmClientM95.h @@ -186,7 +186,7 @@ TINY_GSM_MODEM_SET_BAUD_IPR() TINY_GSM_MODEM_TEST_AT() -TINY_GSM_MODEM_MAINTAIN_CHECK_SOCKS() +TINY_GSM_MODEM_MAINTAIN_LISTEN() bool factoryDefault() { sendAT(GF("&FZE0&W")); // Factory + Reset + Echo Off + Write @@ -606,11 +606,21 @@ protected: } size_t modemRead(size_t size, uint8_t mux) { - sendAT(GF("+QIRD="), mux, ',', size); + // TODO: Does this work???? + // AT+QIRD=,,, + // id = GPRS context number - 0, set in GPRS connect + // sc = roll in connection - 1, client of connection + // sid = index of connection - mux + // len = maximum length of data to send + sendAT(GF("+QIRD=0,1,"), mux, ',', size); + // sendAT(GF("+QIRD="), mux, ',', size); if (waitResponse(GF("+QIRD:")) != 1) { return 0; } - size_t len = stream.readStringUntil('\n').toInt(); + streamSkipUntil(':'); // skip IP address + streamSkipUntil(','); // skip port + streamSkipUntil(','); // skip connection type (TCP/UDP) + size_t len = stream.readStringUntil('\n').toInt(); // read length sockets[mux]->sock_available = len; for (size_t i=0; isock_available--; // ^^ One less character available after moving from modem's FIFO to our FIFO } - waitResponse(); + waitResponse(); // ends with an OK DBG("### READ:", len, "from", mux); return len; } - size_t modemGetAvailable(uint8_t mux) { - sendAT(GF("+QIRD="), mux, GF(",0")); - size_t result = 0; - if (waitResponse(GF("+QIRD:")) == 1) { - streamSkipUntil(','); // Skip total received - streamSkipUntil(','); // Skip have read - result = stream.readStringUntil('\n').toInt(); - if (result) DBG("### DATA AVAILABLE:", result, "on", mux); - waitResponse(); - } - if (!result) { - sockets[mux]->sock_connected = modemGetConnected(mux); - } - return result; - } - bool modemGetConnected(uint8_t mux) { sendAT(GF("+QISTATE=1,"), mux); //+QISTATE: 0,"TCP","151.139.237.11",80,5087,4,1,0,0,"uart1" @@ -702,7 +696,7 @@ TINY_GSM_MODEM_STREAM_UTILITIES() } else if (r5 && data.endsWith(r5)) { index = 5; goto finish; - } else if (data.endsWith(GF(GSM_NL "+QIRD:"))) { + } else if (data.endsWith(GF(GSM_NL "+QIRD:"))) { // TODO: QIRD? or QIRDI? streamSkipUntil(','); // Skip the context streamSkipUntil(','); // Skip the role int mux = stream.readStringUntil('\n').toInt(); diff --git a/src/TinyGsmClientMC60.h b/src/TinyGsmClientMC60.h index 0db5348..667d6eb 100644 --- a/src/TinyGsmClientMC60.h +++ b/src/TinyGsmClientMC60.h @@ -193,7 +193,7 @@ TINY_GSM_MODEM_SET_BAUD_IPR() TINY_GSM_MODEM_TEST_AT() -TINY_GSM_MODEM_MAINTAIN_CHECK_SOCKS() +TINY_GSM_MODEM_MAINTAIN_LISTEN() bool factoryDefault() { sendAT(GF("&FZE0&W")); // Factory + Reset + Echo Off + Write @@ -613,11 +613,21 @@ protected: } size_t modemRead(size_t size, uint8_t mux) { - sendAT(GF("+QIRD="), mux, ',', size); + // TODO: Does this work???? + // AT+QIRD=,,, + // id = GPRS context number - 0, set in GPRS connect + // sc = roll in connection - 1, client of connection + // sid = index of connection - mux + // len = maximum length of data to send + sendAT(GF("+QIRD=0,1,"), mux, ',', size); + // sendAT(GF("+QIRD="), mux, ',', size); if (waitResponse(GF("+QIRD:")) != 1) { return 0; } - size_t len = stream.readStringUntil('\n').toInt(); + streamSkipUntil(':'); // skip IP address + streamSkipUntil(','); // skip port + streamSkipUntil(','); // skip connection type (TCP/UDP) + size_t len = stream.readStringUntil('\n').toInt(); // read length sockets[mux]->sock_available = len; for (size_t i=0; isock_connected = modemGetConnected(mux); - } - return result; - } - bool modemGetConnected(uint8_t mux) { sendAT(GF("+QISTATE=1,"), mux); //+QISTATE: 0,"TCP","151.139.237.11",80,5087,4,1,0,0,"uart1" @@ -713,7 +707,7 @@ TINY_GSM_MODEM_STREAM_UTILITIES() } else if (r6 && data.endsWith(r6)) { index = 6; goto finish; - } else if (data.endsWith(GF(GSM_NL "+QIRD:"))) { + } else if (data.endsWith(GF(GSM_NL "+QIRD:"))) { // TODO: QIRD? or QIRDI? streamSkipUntil(','); // Skip the context streamSkipUntil(','); // Skip the role int mux = stream.readStringUntil('\n').toInt(); From 6e550e566acba5385892fb8f0338e396c930336a Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 19:14:23 -0400 Subject: [PATCH 12/15] Just assume we'll miss URC's on BG96 --- src/TinyGsmClientBG96.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index 904403c..d3434ef 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -102,9 +102,9 @@ TINY_GSM_CLIENT_CONNECT_OVERLOADS() TINY_GSM_CLIENT_WRITE() -TINY_GSM_CLIENT_AVAILABLE_NO_BUFFER_CHECK() +TINY_GSM_CLIENT_AVAILABLE_WITH_BUFFER_CHECK() -TINY_GSM_CLIENT_READ_NO_BUFFER_CHECK() +TINY_GSM_CLIENT_READ_WITH_BUFFER_CHECK() TINY_GSM_CLIENT_PEEK_FLUSH_CONNECTED() @@ -115,7 +115,7 @@ TINY_GSM_CLIENT_PEEK_FLUSH_CONNECTED() String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmBG96* at; + TinyGsmBG96* at; uint8_t mux; uint16_t sock_available; bool sock_connected; From 52e19b73ff8246d5d55ecb6f8778800f6bf5c157 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 19:15:56 -0400 Subject: [PATCH 13/15] don't set sock_available just to count it back to 0 --- src/TinyGsmClientBG96.h | 3 --- src/TinyGsmClientSaraR4.h | 3 --- src/TinyGsmClientSequansMonarch.h | 2 -- src/TinyGsmClientUBLOX.h | 3 --- 4 files changed, 11 deletions(-) diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index d3434ef..7632c45 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -544,12 +544,9 @@ protected: return 0; } size_t len = stream.readStringUntil('\n').toInt(); - sockets[mux]->sock_available = len; for (size_t i=0; isock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO } waitResponse(); DBG("### READ:", len, "from", mux); diff --git a/src/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index 8a11245..a4763cd 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -605,13 +605,10 @@ protected: } streamSkipUntil(','); // Skip mux size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = len; streamSkipUntil('\"'); for (size_t i=0; isock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO } streamSkipUntil('\"'); waitResponse(); diff --git a/src/TinyGsmClientSequansMonarch.h b/src/TinyGsmClientSequansMonarch.h index 7277ca4..1c145e1 100644 --- a/src/TinyGsmClientSequansMonarch.h +++ b/src/TinyGsmClientSequansMonarch.h @@ -621,8 +621,6 @@ protected: while (!stream.available() && ((millis() - startMillis) < sockets[mux % TINY_GSM_MUX_COUNT]->_timeout)) { TINY_GSM_YIELD(); } \ char c = stream.read(); \ sockets[mux % TINY_GSM_MUX_COUNT]->rx.put(c); - sockets[mux % TINY_GSM_MUX_COUNT]->sock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO } DBG("### Read:", len, "from", mux); waitResponse(); diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index a9f0cb1..b232db3 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -593,13 +593,10 @@ protected: } streamSkipUntil(','); // Skip mux size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = len; streamSkipUntil('\"'); for (size_t i=0; isock_available--; - // ^^ One less character available after moving from modem's FIFO to our FIFO } streamSkipUntil('\"'); waitResponse(); From 66a65e2686362f32c63cd3751a258b69c012fe49 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 19:26:47 -0400 Subject: [PATCH 14/15] Add prev_check variable for BG96 --- src/TinyGsmClientBG96.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index 7632c45..132b993 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -62,6 +62,7 @@ public: this->at = modem; this->mux = mux; sock_available = 0; + prev_check = 0; sock_connected = false; got_data = false; @@ -118,6 +119,7 @@ private: TinyGsmBG96* at; uint8_t mux; uint16_t sock_available; + uint32_t prev_check; bool sock_connected; bool got_data; RxFifo rx; From c22efc53271fc8063430b2b916d733e76f14a649 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 24 May 2019 19:30:54 -0400 Subject: [PATCH 15/15] Typo, version bump --- library.json | 2 +- library.properties | 2 +- src/TinyGsmCommon.h | 2 +- tools/Diagnostics/Diagnostics.ino | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/library.json b/library.json index 4aef743..6d859aa 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TinyGSM", - "version": "0.7.6", + "version": "0.7.7", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports many GSM, LTE, and WiFi modules with AT command interfaces.", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM7000, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox, Quectel, SIMCOM, AI Thinker, LTE, LTE-M", "authors": diff --git a/library.properties b/library.properties index 74be952..14c6576 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TinyGSM -version=0.7.6 +version=0.7.7 author=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy sentence=A small Arduino library for GPRS modules, that just works. diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index c696d04..3c66d9c 100644 --- a/src/TinyGsmCommon.h +++ b/src/TinyGsmCommon.h @@ -10,7 +10,7 @@ #define TinyGsmCommon_h // The current library version number -#define TINYGSM_VERSION "0.7.6" +#define TINYGSM_VERSION "0.7.7" #if defined(SPARK) || defined(PARTICLE) #include "Particle.h" diff --git a/tools/Diagnostics/Diagnostics.ino b/tools/Diagnostics/Diagnostics.ino index a4ecde7..ac22e48 100644 --- a/tools/Diagnostics/Diagnostics.ino +++ b/tools/Diagnostics/Diagnostics.ino @@ -161,7 +161,7 @@ void loop() { #endif SerialMon.print("Waiting for network..."); - if (!modem.waitForNetwork(240000L)) { // You may need lengthen this in poor service ares + if (!modem.waitForNetwork(600000L)) { // You may need lengthen this in poor service areas SerialMon.println(F(" [fail]")); SerialMon.println(F("************************")); SerialMon.println(F(" Is your sim card locked?"));