mirror of
				https://github.com/KevinMidboe/TinyGSM.git
				synced 2025-10-29 18:00:18 +00:00 
			
		
		
		
	Async close for LTE-M ublox
This commit is contained in:
		| @@ -66,7 +66,19 @@ public: | |||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port) { | ||||||
|     if (sock_connected) stop(); |     if (sock_connected) { | ||||||
|  |       stop(); | ||||||
|  |       // If we're creating a new connection on the same client, we need to wait | ||||||
|  |       // until the async close has finished on Cat-M modems. | ||||||
|  |       // After close has completed, the +UUSOCL should appear. | ||||||
|  |       if (at->isCatM) { | ||||||
|  |         DBG("Waiting for +UUSOCL URC on", mux); | ||||||
|  |         for (unsigned long start = millis(); millis() - start < 120000L; ) { | ||||||
|  |           at->maintain(); | ||||||
|  |           if (!sock_connected) break; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, &mux); |     sock_connected = at->modemConnect(host, port, &mux); | ||||||
| @@ -102,7 +114,9 @@ public: | |||||||
|       at->maintain(); |       at->maintain(); | ||||||
|     } |     } | ||||||
|     at->modemDisconnect(mux); |     at->modemDisconnect(mux); | ||||||
|     sock_connected = false; |     // We don't actually know if the CatM modem has finished closing because | ||||||
|  |     // we're using an "asynchronous" close | ||||||
|  |     if (!at->isCatM) sock_connected = false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   virtual size_t write(const uint8_t *buf, size_t size) { |   virtual size_t write(const uint8_t *buf, size_t size) { | ||||||
| @@ -309,7 +323,7 @@ public: | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     while (stream.available()) { |     while (stream.available()) { | ||||||
|       waitResponse(10, NULL, NULL); |       waitResponse(15, NULL, NULL); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -716,19 +730,15 @@ protected: | |||||||
|  |  | ||||||
|   bool modemDisconnect(uint8_t mux) { |   bool modemDisconnect(uint8_t mux) { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     // TODO:  Use faster "asynchronous" close for LTE-M modems? |     if (isCatM) {  //  These modems allow a faster "asynchronous" close | ||||||
|     // We would have to wait for the +UUSOCL URC to verify dis-connection |  | ||||||
|     // This also can create a nightmare if attempting to use a single client object |  | ||||||
|     // because the modem automatically reallocates a new client if the previous |  | ||||||
|     // close hasn't finished. |  | ||||||
|     /*if (isCatM) {  //  These modems allow a faster "asynchronous" close |  | ||||||
|       sendAT(GF("+USOCL="), mux, GF(",1")); |       sendAT(GF("+USOCL="), mux, GF(",1")); | ||||||
|       return (1 == waitResponse(120000L));  // but it still can take up to 120s to get a response |       int rsp = waitResponse(120000L); | ||||||
|  |       return (1 == rsp);  // but it still can take up to 120s to get a response | ||||||
|     } |     } | ||||||
|     else {*/  // no async close |     else {  // no async close | ||||||
|       sendAT(GF("+USOCL="), mux); |       sendAT(GF("+USOCL="), mux); | ||||||
|       return (1 == waitResponse(120000L));  // it can take up to 120s to get a response on LTE-M models |       return (1 == waitResponse()); | ||||||
|     /*}*/ |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   int16_t modemSend(const void* buff, size_t len, uint8_t mux) { |   int16_t modemSend(const void* buff, size_t len, uint8_t mux) { | ||||||
| @@ -772,13 +782,15 @@ protected: | |||||||
|   size_t modemGetAvailable(uint8_t mux) { |   size_t modemGetAvailable(uint8_t mux) { | ||||||
|     sendAT(GF("+USORD="), mux, ",0"); |     sendAT(GF("+USORD="), mux, ",0"); | ||||||
|     size_t result = 0; |     size_t result = 0; | ||||||
|     uint8_t res = waitResponse(GF(GSM_NL "+USORD:"), GF(GSM_NL "ERROR"), GF(GSM_NL "+CME ERROR: Operation not allowed")); |     uint8_t res = waitResponse(GF(GSM_NL "+USORD:")); | ||||||
|  |     // Will give error "operation not allowed" when attempting to read a socket | ||||||
|  |     // that you have already told to close | ||||||
|     if (res == 1) { |     if (res == 1) { | ||||||
|       streamSkipUntil(','); // Skip mux |       streamSkipUntil(','); // Skip mux | ||||||
|       result = stream.readStringUntil('\n').toInt(); |       result = stream.readStringUntil('\n').toInt(); | ||||||
|       waitResponse(); |       waitResponse(); | ||||||
|     } |     } | ||||||
|     if (!result) { |     if (!result && res != 2 && res != 3) {  // Don't check modemGetConnected after an error | ||||||
|       sockets[mux]->sock_connected = modemGetConnected(mux); |       sockets[mux]->sock_connected = modemGetConnected(mux); | ||||||
|     } |     } | ||||||
|     return result; |     return result; | ||||||
| @@ -786,7 +798,7 @@ protected: | |||||||
|  |  | ||||||
|   bool modemGetConnected(uint8_t mux) { |   bool modemGetConnected(uint8_t mux) { | ||||||
|     sendAT(GF("+USOCTL="), mux, ",10"); |     sendAT(GF("+USOCTL="), mux, ",10"); | ||||||
|     uint8_t res = waitResponse(GF(GSM_NL "+USOCTL:"), GF(GSM_NL "ERROR"), GF(GSM_NL "+CME ERROR: Operation not allowed")); |     uint8_t res = waitResponse(GF(GSM_NL "+USOCTL:")); | ||||||
|     if (res != 1) |     if (res != 1) | ||||||
|       return false; |       return false; | ||||||
|  |  | ||||||
| @@ -806,7 +818,7 @@ protected: | |||||||
|     // 9: the socket is in LAST_ACK status |     // 9: the socket is in LAST_ACK status | ||||||
|     // 10: the socket is in TIME_WAIT status |     // 10: the socket is in TIME_WAIT status | ||||||
|     waitResponse(); |     waitResponse(); | ||||||
|     return (result != 0 && result != 7 && result != 8); |     return (result != 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user