mirror of
				https://github.com/KevinMidboe/TinyGSM.git
				synced 2025-10-29 18:00:18 +00:00 
			
		
		
		
	No PSD profile-type commands for LTE-M/NB-IoT
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "TinyGSM", | ||||
|   "version": "0.4.6", | ||||
|   "version": "0.4.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 and wifi modules with AT command interfaces.", | ||||
|   "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox", | ||||
|   "authors": | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| name=TinyGSM | ||||
| version=0.4.6 | ||||
| version=0.4.7 | ||||
| author=Volodymyr Shymanskyy | ||||
| maintainer=Volodymyr Shymanskyy | ||||
| sentence=A small Arduino library for GPRS modules, that just works. | ||||
|   | ||||
| @@ -201,6 +201,7 @@ public: | ||||
|     : TinyGsmModem(stream), stream(stream) | ||||
|   { | ||||
|     memset(sockets, 0, sizeof(sockets)); | ||||
|     isCatM_NBIoT = false; | ||||
|   } | ||||
|  | ||||
|   /* | ||||
| @@ -215,7 +216,19 @@ public: | ||||
|     if (waitResponse() != 1) { | ||||
|       return false; | ||||
|     } | ||||
|     DBG(GF("### Modem:"), getModemName()); | ||||
|  | ||||
| #ifdef TINY_GSM_DEBUG | ||||
|     sendAT(GF("+CMEE=2"));  // turn on verbose error codes | ||||
| #else | ||||
|     sendAT(GF("+CMEE=0"));  // turn off error codes | ||||
| #endif | ||||
|     waitResponse(); | ||||
|  | ||||
|     String name = getModemName(); | ||||
|     DBG(GF("### Modem:"), name); | ||||
|     if (name.startsWith("u-blox SARA-R") or name.startsWith("u-blox SARA-N")) { | ||||
|       isCatM_NBIoT = true; | ||||
|     } | ||||
|     int ret = getSimStatus(); | ||||
|     if (ret != SIM_READY && pin != NULL && strlen(pin) > 0) { | ||||
|       simUnlock(pin); | ||||
| @@ -230,7 +243,6 @@ public: | ||||
|       return "u-blox Cellular Modem"; | ||||
|     } | ||||
|     res1.replace(GSM_NL "OK" GSM_NL, ""); | ||||
|     res1.replace(GSM_NL, " "); | ||||
|     res1.trim(); | ||||
|  | ||||
|     sendAT(GF("+GMM")); | ||||
| @@ -239,7 +251,6 @@ public: | ||||
|       return "u-blox Cellular Modem"; | ||||
|     } | ||||
|     res2.replace(GSM_NL "OK" GSM_NL, ""); | ||||
|     res2.replace(GSM_NL, " "); | ||||
|     res2.trim(); | ||||
|  | ||||
|     return res1 + String(' ') + res2; | ||||
| @@ -440,37 +451,49 @@ public: | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     // NOTE:  Setting up the PSD profile/PDP context with the UPSD commands | ||||
|     // sets up an "internal" PDP context, i.e. a data connection using the | ||||
|     // internal IP stack and related AT commands for sockets. | ||||
|     // Using CGDCONT sets up an "external" PCP context, i.e. a data connection | ||||
|     // using the external IP stack (e.g. Windows dial up) and PPP link over the | ||||
|     // serial interface.  This is the only command set supported by the LTE-M | ||||
|     // and LTE NB-IoT modules (SARA-R4x, SARA-N4X, SARA-N2x) | ||||
|  | ||||
|     // Using CGDCONT would set up an "external" PCP context, i.e. a data | ||||
|     // connection using the external IP stack (e.g. Windows dial up) and PPP | ||||
|     // link over the serial interface. | ||||
|     // Setting up the PSD profile/PDP context with the UPSD commands sets up an | ||||
|     // "internal" PDP context, i.e. a data connection using the internal IP | ||||
|     // stack and related AT commands for sockets. This is what we're using for | ||||
|     // all of the other modules. | ||||
|  | ||||
|     sendAT(GF("+UPSD=0,1,\""), apn, '"');  // Set APN for PSD profile 0 | ||||
|     waitResponse(); | ||||
|     if (isCatM_NBIoT) { | ||||
|       if (user && strlen(user) > 0) { | ||||
|         sendAT(GF("+CGAUTH=1,0,\""), user, GF("\",\""), pwd, '"');  // Set the authentication | ||||
|         waitResponse(); | ||||
|       } | ||||
|  | ||||
|     if (user && strlen(user) > 0) { | ||||
|       sendAT(GF("+UPSD=0,2,\""), user, '"');  // Set user for PSD profile 0 | ||||
|       sendAT(GF("+CGDCONT=1,\"IP\",\""), apn, '"');  // Define the PDP context | ||||
|       waitResponse(); | ||||
|     } | ||||
|     if (pwd && strlen(pwd) > 0) { | ||||
|       sendAT(GF("+UPSD=0,3,\""), pwd, '"');  // Set password for PSD profile 0 | ||||
|       waitResponse(); | ||||
|     } | ||||
|  | ||||
|     sendAT(GF("+UPSD=0,7,\"0.0.0.0\"")); // Dynamic IP on PSD profile 0 | ||||
|     waitResponse(); | ||||
|  | ||||
|     // LTE modules do not support UPSDA and UPSND commands, even for "internal" contexts | ||||
|     if (getModemName().startsWith(GF("SARA-R")) or getModemName().startsWith(GF("SARA-N"))) | ||||
|       sendAT(GF("+CGACT=0,1"));  // activate PDP profile/context 0 | ||||
|       sendAT(GF("+CGACT=1,1"));  // activate PDP profile/context 1 | ||||
|       if (waitResponse(150000L) != 1) { | ||||
|         return false; | ||||
|       } | ||||
|  | ||||
|       return true; | ||||
|     } | ||||
|  | ||||
|     else { | ||||
|       sendAT(GF("+UPSD=0,1,\""), apn, '"');  // Set APN for PSD profile 0 | ||||
|       waitResponse(); | ||||
|  | ||||
|       if (user && strlen(user) > 0) { | ||||
|         sendAT(GF("+UPSD=0,2,\""), user, '"');  // Set user for PSD profile 0 | ||||
|         waitResponse(); | ||||
|       } | ||||
|       if (pwd && strlen(pwd) > 0) { | ||||
|         sendAT(GF("+UPSD=0,3,\""), pwd, '"');  // Set password for PSD profile 0 | ||||
|         waitResponse(); | ||||
|       } | ||||
|  | ||||
|       sendAT(GF("+UPSD=0,7,\"0.0.0.0\"")); // Dynamic IP on PSD profile 0 | ||||
|       waitResponse(); | ||||
|  | ||||
|       sendAT(GF("+UPSDA=0,3")); // Activate the PDP context associated with profile 0 | ||||
|       if (waitResponse(360000L) != 1) { | ||||
|         return false; | ||||
| @@ -481,19 +504,19 @@ public: | ||||
|         return false; | ||||
|       } | ||||
|       waitResponse(); | ||||
|  | ||||
|       return true; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   bool gprsDisconnect() { | ||||
|  | ||||
|     // LTE modules do not support UPSDA and UPSND commands, even for "internal" contexts | ||||
|     if (getModemName().startsWith(GF("SARA-R")) or getModemName().startsWith(GF("SARA-N"))) | ||||
|       sendAT(GF("+CGACT=0,0"));  // activate PDP profile/context 0 | ||||
|     // LTE-M and NB-IoT modules do not support UPSx commands | ||||
|     if (isCatM_NBIoT) { | ||||
|       sendAT(GF("+CGACT=1,0"));  // Deactivate PDP context 0 | ||||
|       if (waitResponse(40000L) != 1) { | ||||
|         return false; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     else { | ||||
| @@ -527,14 +550,14 @@ public: | ||||
|    */ | ||||
|  | ||||
|   String getLocalIP() { | ||||
|     // LTE modules do not support UPSDA and UPSND commands, even for "internal" contexts | ||||
|     if (getModemName().startsWith(GF("SARA-R")) or getModemName().startsWith(GF("SARA-N"))) { | ||||
|       sendAT(GF("+CGPADDR?")); | ||||
|     // LTE-M and NB-IoT modules do not support UPSx commands | ||||
|     if (isCatM_NBIoT) { | ||||
|       sendAT(GF("+CGPADDR")); | ||||
|       if (waitResponse(GF(GSM_NL "+CGPADDR:")) != 1) { | ||||
|         return ""; | ||||
|       } | ||||
|       streamSkipUntil('\"');  // Skip context id | ||||
|       String res = stream.readStringUntil('\"'); | ||||
|       streamSkipUntil(',');  // Skip context id | ||||
|       String res = stream.readStringUntil('\r'); | ||||
|       if (waitResponse() != 1) { | ||||
|         return ""; | ||||
|       } | ||||
| @@ -815,6 +838,7 @@ public: | ||||
|  | ||||
| protected: | ||||
|   GsmClient*    sockets[TINY_GSM_MUX_COUNT]; | ||||
|   bool          isCatM_NBIoT; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user