From a52c19837e9960ae01f417488566e554d5031c24 Mon Sep 17 00:00:00 2001 From: SRGDamia1 Date: Tue, 20 Feb 2018 19:23:34 -0500 Subject: [PATCH] Added ESP getRegStatus, fixed same for XBee --- library.json | 2 +- library.properties | 2 +- src/TinyGsmClientESP8266.h | 63 +++++++++++++----------- src/TinyGsmClientXBee.h | 99 +++++++++++++++++++++++++++++--------- 4 files changed, 111 insertions(+), 55 deletions(-) diff --git a/library.json b/library.json index d28877c..bb14e82 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "TinyGSM", - "version": "0.3.5", + "version": "0.3.6", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports GSM modules with AT command interface: SIM800, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900, SIM900A, SIM900D, SIM908, SIM968", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968", "authors": diff --git a/library.properties b/library.properties index 7762874..d9727bd 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=TinyGSM -version=0.3.5 +version=0.3.6 author=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy sentence=A small Arduino library for GPRS modules, that just works. diff --git a/src/TinyGsmClientESP8266.h b/src/TinyGsmClientESP8266.h index cac65fe..8dec021 100644 --- a/src/TinyGsmClientESP8266.h +++ b/src/TinyGsmClientESP8266.h @@ -24,6 +24,15 @@ static const char GSM_OK[] TINY_GSM_PROGMEM = "OK" GSM_NL; static const char GSM_ERROR[] TINY_GSM_PROGMEM = "ERROR" GSM_NL; static unsigned TINY_GSM_TCP_KEEP_ALIVE = 120; +enum RegStatus { + REG_UNREGISTERED = 0, + REG_SEARCHING = 2, + REG_DENIED = 3, + REG_OK_HOME = 1, + REG_OK_ROAMING = 5, + REG_UNKNOWN = 4, +}; + class TinyGsmESP8266 { @@ -234,6 +243,26 @@ public: return true; } + RegStatus getRegistrationStatus() { + sendAT(GF("+CIPSTATUS")); + int res1 = waitResponse(3000, GF("STATUS:")); + int res2 = 0; + if (res1 == 1) { + res2 = waitResponse(GFP(GSM_ERROR), GF("2"), GF("3"), GF("4"), GF("5")); + } + // status of ESP8266 station interface + // 2 : ESP8266 station connected to an AP and has obtained IP + // 3 : ESP8266 station created a TCP or UDP transmission + // 4 : the TCP or UDP transmission of ESP8266 station disconnected + // 5 : ESP8266 station did NOT connect to an AP + waitResponse(); // Returns an OK after the status + if (res2 == 2) return REG_OK_HOME; + if (res2 == 3) return REG_OK_HOME; + if (res2 == 4) return REG_UNREGISTERED; + if (res2 == 5) return REG_DENIED; + else return REG_UNKNOWN; + } + /* * Power functions */ @@ -273,21 +302,9 @@ public: return res2; } - bool isNetworkConnected() { - sendAT(GF("+CIPSTATUS")); - int res1 = waitResponse(3000, GF("STATUS:")); - int res2 = 0; - if (res1 == 1) { - res2 = waitResponse(GFP(GSM_ERROR), GF("2"), GF("3"), GF("4"), GF("5")); - } - // status of ESP8266 station interface - // 2 : ESP8266 station connected to an AP and has obtained IP - // 3 : ESP8266 station created a TCP or UDP transmission - // 4 : the TCP or UDP transmission of ESP8266 station disconnected - // 5 : ESP8266 station did NOT connect to an AP - waitResponse(); // Returns an OK after the status - if (res2 == 2 || res2 == 3) return true; - else return false; + bool isNetworkConnected() { + RegStatus s = getRegistrationStatus(); + return (s == REG_OK_HOME || s == REG_OK_ROAMING); } bool waitForNetwork(unsigned long timeout = 60000L) { @@ -382,20 +399,8 @@ protected: } bool modemGetConnected(uint8_t mux) { - sendAT(GF("+CIPSTATUS="), mux); - int res1 = waitResponse(3000, GF("STATUS:")); - int res2; - if (res1 == 1) { - res2 = waitResponse(GFP(GSM_ERROR), GF("2"), GF("3"), GF("4"), GF("5")); - } - // status of ESP8266 station interface - // 2 : ESP8266 station connected to an AP and has obtained IP - // 3 : ESP8266 station created a TCP or UDP transmission - // 4 : the TCP or UDP transmission of ESP8266 station disconnected - // 5 : ESP8266 station did NOT connect to an AP - waitResponse(); // Returns an OK after the status - if (res2 == 2 || res2 == 3) return true; - else return false; + RegStatus s = getRegistrationStatus(); + return (s == REG_OK_HOME || s == REG_OK_ROAMING); } public: diff --git a/src/TinyGsmClientXBee.h b/src/TinyGsmClientXBee.h index dc88f0c..86124d1 100644 --- a/src/TinyGsmClientXBee.h +++ b/src/TinyGsmClientXBee.h @@ -30,8 +30,8 @@ enum SimStatus { }; enum XBeeType { - CELL = 0, - WIFI = 1, + XBEE_CELL = 0, + XBEE_WIFI = 1, }; enum RegStatus { @@ -232,8 +232,8 @@ public: sendAT(GF("HS")); // Get the "Hardware Series"; 0x601 for S6B (Wifi) int res = waitResponse(GF("601")); - if (res == 1) beeType = WIFI; - else beeType = CELL; + if (res == 1) beeType = XBEE_WIFI; + else beeType = XBEE_CELL; exitCommand(); return ret_val; @@ -291,10 +291,15 @@ public: } bool hasSSL() { - if (beeType == WIFI) return false; + if (beeType == XBEE_WIFI) return false; else return true; } + String getBeeType() { + if (beeType == XBEE_WIFI) return "S6B Wifi"; + else return "Cellular"; + } + /* * Power functions */ @@ -331,7 +336,7 @@ public: if (!commandMode()) return; // Return immediately sendAT(GF("SM"),1); // Pin sleep waitResponse(); - if (beeType == WIFI && !maintainAssociation) { + if (beeType == XBEE_WIFI && !maintainAssociation) { sendAT(GF("SO"),200); // For lowest power, dissassociated deep sleep waitResponse(); } @@ -373,26 +378,72 @@ public: } RegStatus getRegistrationStatus() { - if (!commandMode()) return REG_UNREGISTERED; // Return immediately + if (!commandMode()) return REG_UNKNOWN; // Return immediately sendAT(GF("AI")); String res = readResponse(); - exitCommand(); - - if(res == GF("0")) - return REG_OK_HOME; - - else if(res == GF("13") || res == GF("2A")) - return REG_UNREGISTERED; - - else if(res == GF("FF") || res == GF("22") || res == GF("23") || - res == GF("40") || res == GF("41") || res == GF("42")) - return REG_SEARCHING; - - else if(res == GF("24") || res == GF("25") || res == GF("27")) - return REG_DENIED; + RegStatus stat; + + switch (beeType){ + case XBEE_WIFI: { + if(res == GF("0")) // 0x00 Successfully joined an access point, established IP addresses and IP listening sockets + stat = REG_OK_HOME; + else if(res == GF("1")) // 0x01 Wi-Fi transceiver initialization in progress. + stat = REG_SEARCHING; + else if(res == GF("2")) // 0x02 Wi-Fi transceiver initialized, but not yet scanning for access point. + stat = REG_SEARCHING; + else if(res == GF("13")) { // 0x13 Disconnecting from access point. + sendAT(GF("NR")); // Do a network reset; the S6B tends to get stuck "disconnecting" + writeChanges(); + stat = REG_UNREGISTERED; + } + else if(res == GF("23")) // 0x23 SSID not configured. + stat = REG_UNREGISTERED; + else if(res == GF("24")) // 0x24 Encryption key invalid (either NULL or invalid length for WEP). + stat = REG_DENIED; + else if(res == GF("27")) // 0x27 SSID was found, but join failed. + stat = REG_DENIED; + else if(res == GF("40")) // 0x40 Waiting for WPA or WPA2 Authentication. + stat = REG_SEARCHING; + else if(res == GF("41")) // 0x41 Device joined a network and is waiting for IP configuration to complete + stat = REG_SEARCHING; + else if(res == GF("42")) // 0x42 Device is joined, IP is configured, and listening sockets are being set up. + stat = REG_SEARCHING; + else if(res == GF("FF")) // 0xFF Device is currently scanning for the configured SSID. + stat = REG_SEARCHING; + else stat = REG_UNKNOWN; + break; + } + case XBEE_CELL: { + if(res == GF("0")) // 0x00 Connected to the Internet. + stat = REG_OK_HOME; + else if(res == GF("22")) // 0x22 Registering to cellular network. + stat = REG_SEARCHING; + else if(res == GF("23")) // 0x23 Connecting to the Internet. + stat = REG_SEARCHING; + else if(res == GF("24")) // 0x24 The cellular component is missing, corrupt, or otherwise in error. + stat = REG_UNKNOWN; + else if(res == GF("25")) // 0x25 Cellular network registration denied. + stat = REG_DENIED; + else if(res == GF("2A")) { // 0x2A Airplane mode. + sendAT(GF("AM0")); // Turn off airplane mode + writeChanges(); + stat = REG_UNKNOWN; + } + else if(res == GF("2F")) { // 0x2F Bypass mode active. + sendAT(GF("AP0")); // Set back to transparent mode + writeChanges(); + stat = REG_UNKNOWN; + } + else if(res == GF("FF")) // 0xFF Device is currently scanning for the configured SSID. + stat = REG_SEARCHING; + else stat = REG_UNKNOWN; + break; + } + } - else return REG_UNKNOWN; + exitCommand(); + return stat; } String getOperator() { @@ -409,7 +460,7 @@ public: int getSignalQuality() { if (!commandMode()) return 0; // Return immediately - if (beeType == WIFI) sendAT(GF("LM")); // ask for the "link margin" - the dB above sensitivity + if (beeType == XBEE_WIFI) sendAT(GF("LM")); // ask for the "link margin" - the dB above sensitivity else sendAT(GF("DB")); // ask for the cell strength in dBm // wait for the response unsigned long startMillis = millis(); @@ -420,7 +471,7 @@ public: // DBG(buf[0], buf[1], "\n"); exitCommand(); int intr = strtol(buf, 0, 16); - if (beeType == WIFI) return -93 + intr; // the maximum sensitivity is -93dBm + if (beeType == XBEE_WIFI) return -93 + intr; // the maximum sensitivity is -93dBm else return -1*intr; // need to convert to negative number }