diff --git a/.gitignore b/.gitignore index 721a025..11753c7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ .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..718193c 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 + +// 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 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 @@ -70,10 +71,10 @@ // Your GPRS credentials // Leave empty, if missing user or pass const char apn[] = "YourAPN"; -const char user[] = ""; -const char pass[] = ""; +const char gprsUser[] = ""; +const char gprsPass[] = ""; const char wifiSSID[] = "YourSSID"; -const char wifiPass[] = "SSIDpw"; +const char wifiPass[] = "YourWiFiPass"; #include @@ -98,11 +99,11 @@ 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); + //SerialAT.begin(9600); + delay(3000); } void loop() { @@ -120,26 +121,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 +159,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 +184,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 +208,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 +217,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 +242,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 +264,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..45295b8 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: @@ -45,16 +46,13 @@ // 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 +//#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..ca61d43 100644 --- a/examples/HttpsClient/HttpsClient.ino +++ b/examples/HttpsClient/HttpsClient.ino @@ -10,22 +10,30 @@ * 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) +// 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 @@ -33,16 +41,13 @@ // 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 +//#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..841be7f 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 + +// 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 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..af26650 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); } @@ -47,16 +57,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,8 +122,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 +142,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 +159,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 +181,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) { diff --git a/library.json b/library.json index d928d35..96291af 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TinyGSM", - "version": "0.7.4", + "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 28c2c75..14c6576 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TinyGSM -version=0.7.4 +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/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index 66a5058..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; @@ -102,9 +103,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,9 +116,10 @@ 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; + uint32_t prev_check; bool sock_connected; bool got_data; RxFifo rx; @@ -544,7 +546,6 @@ protected: return 0; } size_t len = stream.readStringUntil('\n').toInt(); - sockets[mux]->sock_available = len; for (size_t i=0; isock_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" @@ -700,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 33afb7c..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,37 +613,33 @@ 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(); 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" @@ -711,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(); diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index e1c0008..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; } @@ -835,14 +836,10 @@ 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(); - 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; i_timeout)) { TINY_GSM_YIELD(); } @@ -856,9 +853,11 @@ protected: #endif sockets[mux]->rx.put(c); } + 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) { @@ -870,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 c6f72c0..f2030dd 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: @@ -459,7 +459,6 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() return true; } - /* * IP Address functions */ @@ -765,14 +764,10 @@ 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(); - 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; i_timeout)) { TINY_GSM_YIELD(); } @@ -786,9 +781,11 @@ protected: #endif sockets[mux]->rx.put(c); } + 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) { @@ -800,6 +797,7 @@ protected: result = stream.readStringUntil('\n').toInt(); waitResponse(); } + DBG("### Available:", result, "on", mux); if (!result) { sockets[mux]->sock_connected = modemGetConnected(mux); } @@ -808,7 +806,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/TinyGsmClientSaraR4.h b/src/TinyGsmClientSaraR4.h index d06ec78..a4763cd 100644 --- a/src/TinyGsmClientSaraR4.h +++ b/src/TinyGsmClientSaraR4.h @@ -605,7 +605,6 @@ protected: } streamSkipUntil(','); // Skip mux size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = len; streamSkipUntil('\"'); for (size_t i=0; irx.put(c); } - // DBG("### Read:", len, "from", mux); + 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; } @@ -638,7 +638,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/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index 5c56f9f..b232db3 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -593,7 +593,6 @@ protected: } streamSkipUntil(','); // Skip mux size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = len; streamSkipUntil('\"'); for (size_t i=0; istreamClear(); // 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; } }; diff --git a/src/TinyGsmCommon.h b/src/TinyGsmCommon.h index a92c08e..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.4" +#define TINYGSM_VERSION "0.7.7" #if defined(SPARK) || defined(PARTICLE) #include "Particle.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) { @@ -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(); \ } \ diff --git a/tools/Diagnostics/Diagnostics.ino b/tools/Diagnostics/Diagnostics.ino index 8283c59..ac22e48 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(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?")); @@ -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: ");