mirror of
				https://github.com/KevinMidboe/TinyGSM.git
				synced 2025-10-29 18:00:18 +00:00 
			
		
		
		
	Implement connect with timeout, XBee improvements
This commit is contained in:
		
							
								
								
									
										40
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -18,33 +18,19 @@ env: | |||||||
|     - PLATFORMIO_CI_SRC=tools/FactoryReset |     - PLATFORMIO_CI_SRC=tools/FactoryReset | ||||||
|  |  | ||||||
|     # Arduino test |     # Arduino test | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_A6'      --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_A6'      --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_BG96'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_BG96'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_ESP8266' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_ESP8266' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M95'     --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M95'     --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M590'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M590'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_MC60'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_MC60'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM800'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM800'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM808'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM808'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM7000' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM7000' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_UBLOX'   --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_UBLOX'   --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SARAR4'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SARAR4'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_XBEE'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_XBEE'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|     # - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SEQUANS_MONARCH'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SEQUANS_MONARCH'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32 --board=esp01 --board=nodemcuv2 --board=esp32dev" | ||||||
|  |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_A6'      --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_BG96'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_ESP8266' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M95'     --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_M590'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_MC60'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM800'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM808'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SIM7000' --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_UBLOX'   --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SARAR4'  --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_XBEE'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_SEQUANS_MONARCH'    --project-option='framework=arduino' --board=uno --board=leonardo --board=yun --board=megaatmega2560 --board=genuino101 --board=mkr1000USB --board=zero --board=teensy31 --board=bluepill_f103c8 --board=uno_pic32" |  | ||||||
|  |  | ||||||
|     # Energia test |     # Energia test | ||||||
|     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_A6'      --project-option='framework=energia' --board=lplm4f120h5qr" |     - PLATFORMIO_CI_SRC=tools/test_build PLATFORMIO_CI_ARGS="--project-option='build_flags=-D TINY_GSM_MODEM_A6'      --project-option='framework=energia' --board=lplm4f120h5qr" | ||||||
|   | |||||||
| @@ -66,12 +66,12 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     uint8_t newMux = -1; |     uint8_t newMux = -1; | ||||||
|     sock_connected = at->modemConnect(host, port, &newMux); |     sock_connected = at->modemConnect(host, port, &newMux, timeout) | ||||||
|     if (sock_connected) { |     if (sock_connected) { | ||||||
|       mux = newMux; |       mux = newMux; | ||||||
|       at->sockets[mux] = this; |       at->sockets[mux] = this; | ||||||
| @@ -79,7 +79,7 @@ public: | |||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -504,15 +504,16 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t* mux) { |   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, int timeout = 75000L) { | ||||||
|     sendAT(GF("+CIPSTART="),  GF("\"TCP"), GF("\",\""), host, GF("\","), port); |     unsigned long startMillis = millis(); | ||||||
|  |  | ||||||
|     if (waitResponse(75000L, GF(GSM_NL "+CIPNUM:")) != 1) { |     sendAT(GF("+CIPSTART="),  GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||||
|  |     if (waitResponse(timeout, GF(GSM_NL "+CIPNUM:")) != 1) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|     int newMux = stream.readStringUntil('\n').toInt(); |     int newMux = stream.readStringUntil('\n').toInt(); | ||||||
|  |  | ||||||
|     int rsp = waitResponse(75000L, |     int rsp = waitResponse((timeout - (millis() - startMillis)), | ||||||
|                            GF("CONNECT OK" GSM_NL), |                            GF("CONNECT OK" GSM_NL), | ||||||
|                            GF("CONNECT FAIL" GSM_NL), |                            GF("CONNECT FAIL" GSM_NL), | ||||||
|                            GF("ALREADY CONNECT" GSM_NL)); |                            GF("ALREADY CONNECT" GSM_NL)); | ||||||
|   | |||||||
| @@ -71,15 +71,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -134,11 +134,11 @@ private: | |||||||
| //   {} | //   {} | ||||||
| // | // | ||||||
| // public: | // public: | ||||||
| //   virtual int connect(const char *host, uint16_t port) { | //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
| //     stop(); | //     stop(); | ||||||
| //     TINY_GSM_YIELD(); | //     TINY_GSM_YIELD(); | ||||||
| //     rx.clear(); | //     rx.clear(); | ||||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
| //     return sock_connected; | //     return sock_connected; | ||||||
| //   } | //   } | ||||||
| // }; | // }; | ||||||
| @@ -470,14 +470,16 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 20000L) | ||||||
|  |  { | ||||||
|     int rsp; |     int rsp; | ||||||
|     // <PDPcontextID>(1-16), <connectID>(0-11),"TCP/UDP/TCP LISTENER/UDP SERVICE", |     // <PDPcontextID>(1-16), <connectID>(0-11),"TCP/UDP/TCP LISTENER/UDP SERVICE", | ||||||
|     // "<IP_address>/<domain_name>",<remote_port>,<local_port>,<access_mode>(0-2 0=buffer) |     // "<IP_address>/<domain_name>",<remote_port>,<local_port>,<access_mode>(0-2 0=buffer) | ||||||
|     sendAT(GF("+QIOPEN=1,"), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port, GF(",0,0")); |     sendAT(GF("+QIOPEN=1,"), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port, GF(",0,0")); | ||||||
|     rsp = waitResponse(); |     rsp = waitResponse(); | ||||||
|  |  | ||||||
|     if (waitResponse(20000L, GF(GSM_NL "+QIOPEN:")) != 1) { |     if (waitResponse(timeout, GF(GSM_NL "+QIOPEN:")) != 1) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -68,15 +68,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -118,11 +118,11 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux, true); |     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| @@ -331,14 +331,17 @@ TINY_GSM_MODEM_MAINTAIN_LISTEN() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     if (ssl) { |     if (ssl) { | ||||||
|       sendAT(GF("+CIPSSLSIZE=4096")); |       sendAT(GF("+CIPSSLSIZE=4096")); | ||||||
|       waitResponse(); |       waitResponse(); | ||||||
|     } |     } | ||||||
|     sendAT(GF("+CIPSTART="), mux, ',', ssl ? GF("\"SSL") : GF("\"TCP"), GF("\",\""), host, GF("\","), port, GF(","), TINY_GSM_TCP_KEEP_ALIVE); |     sendAT(GF("+CIPSTART="), mux, ',', ssl ? GF("\"SSL") : GF("\"TCP"), | ||||||
|  |            GF("\",\""), host, GF("\","), port, GF(","), TINY_GSM_TCP_KEEP_ALIVE); | ||||||
|     // TODO: Check mux |     // TODO: Check mux | ||||||
|     int rsp = waitResponse(75000L, |     int rsp = waitResponse(timeout, | ||||||
|                            GFP(GSM_OK), |                            GFP(GSM_OK), | ||||||
|                            GFP(GSM_ERROR), |                            GFP(GSM_ERROR), | ||||||
|                            GF("ALREADY CONNECT")); |                            GF("ALREADY CONNECT")); | ||||||
|   | |||||||
| @@ -68,16 +68,16 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|  |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -413,12 +413,12 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, int timeout = 75000L) { | ||||||
|     for (int i=0; i<3; i++) { // TODO: no need for loop? |     for (int i=0; i<3; i++) { // TODO: no need for loop? | ||||||
|       String ip = dnsIpQuery(host); |       String ip = dnsIpQuery(host); | ||||||
|  |  | ||||||
|       sendAT(GF("+TCPSETUP="), mux, GF(","), ip, GF(","), port); |       sendAT(GF("+TCPSETUP="), mux, GF(","), ip, GF(","), port); | ||||||
|       int rsp = waitResponse(75000L, |       int rsp = waitResponse(timeout, | ||||||
|                             GF(",OK" GSM_NL), |                             GF(",OK" GSM_NL), | ||||||
|                             GF(",FAIL" GSM_NL), |                             GF(",FAIL" GSM_NL), | ||||||
|                             GF("+TCPSETUP:Error" GSM_NL)); |                             GF("+TCPSETUP:Error" GSM_NL)); | ||||||
|   | |||||||
| @@ -71,15 +71,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -134,11 +134,11 @@ private: | |||||||
| //   {} | //   {} | ||||||
| // | // | ||||||
| // public: | // public: | ||||||
| //   virtual int connect(const char *host, uint16_t port) { | //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
| //     stop(); | //     stop(); | ||||||
| //     TINY_GSM_YIELD(); | //     TINY_GSM_YIELD(); | ||||||
| //     rx.clear(); | //     rx.clear(); | ||||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
| //     return sock_connected; | //     return sock_connected; | ||||||
| //   } | //   } | ||||||
| // }; | // }; | ||||||
| @@ -518,9 +518,11 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     sendAT(GF("+QIOPEN="), mux, GF("\"TCP"), GF("\",\""), host, GF("\","), port); |     sendAT(GF("+QIOPEN="), mux, GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||||
|     int rsp = waitResponse(75000L, |     int rsp = waitResponse(timeout, | ||||||
|                            GF("CONNECT OK" GSM_NL), |                            GF("CONNECT OK" GSM_NL), | ||||||
|                            GF("CONNECT FAIL" GSM_NL), |                            GF("CONNECT FAIL" GSM_NL), | ||||||
|                            GF("ALREADY CONNECT" GSM_NL)); |                            GF("ALREADY CONNECT" GSM_NL)); | ||||||
|   | |||||||
| @@ -75,15 +75,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -138,11 +138,11 @@ private: | |||||||
| //   {} | //   {} | ||||||
| // | // | ||||||
| // public: | // public: | ||||||
| //   virtual int connect(const char *host, uint16_t port) { | //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
| //     stop(); | //     stop(); | ||||||
| //     TINY_GSM_YIELD(); | //     TINY_GSM_YIELD(); | ||||||
| //     rx.clear(); | //     rx.clear(); | ||||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
| //     return sock_connected; | //     return sock_connected; | ||||||
| //   } | //   } | ||||||
| // }; | // }; | ||||||
| @@ -537,9 +537,11 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     sendAT(GF("+QIOPEN="), mux, GF("\"TCP"), GF("\",\""), host, GF("\","), port); |     sendAT(GF("+QIOPEN="), mux, GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||||
|     int rsp = waitResponse(75000L, |     int rsp = waitResponse(timeout, | ||||||
|                            GF("CONNECT OK" GSM_NL), |                            GF("CONNECT OK" GSM_NL), | ||||||
|                            GF("CONNECT FAIL" GSM_NL), |                            GF("CONNECT FAIL" GSM_NL), | ||||||
|                            GF("ALREADY CONNECT" GSM_NL)); |                            GF("ALREADY CONNECT" GSM_NL)); | ||||||
|   | |||||||
| @@ -76,15 +76,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -140,11 +140,11 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux, true); |     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| @@ -760,10 +760,12 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     int rsp; |     int rsp; | ||||||
|     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); |     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||||
|     rsp = waitResponse(75000L, |     rsp = waitResponse(timeout, | ||||||
|                        GF("CONNECT OK" GSM_NL), |                        GF("CONNECT OK" GSM_NL), | ||||||
|                        GF("CONNECT FAIL" GSM_NL), |                        GF("CONNECT FAIL" GSM_NL), | ||||||
|                        GF("ALREADY CONNECT" GSM_NL), |                        GF("ALREADY CONNECT" GSM_NL), | ||||||
|   | |||||||
| @@ -77,15 +77,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -141,11 +141,11 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux, true); |     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| @@ -681,7 +681,9 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     int rsp; |     int rsp; | ||||||
| #if !defined(TINY_GSM_MODEM_SIM900) | #if !defined(TINY_GSM_MODEM_SIM900) | ||||||
|     sendAT(GF("+CIPSSL="), ssl); |     sendAT(GF("+CIPSSL="), ssl); | ||||||
| @@ -691,7 +693,7 @@ protected: | |||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); |     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||||
|     rsp = waitResponse(75000L, |     rsp = waitResponse(timeout, | ||||||
|                        GF("CONNECT OK" GSM_NL), |                        GF("CONNECT OK" GSM_NL), | ||||||
|                        GF("CONNECT FAIL" GSM_NL), |                        GF("CONNECT FAIL" GSM_NL), | ||||||
|                        GF("ALREADY CONNECT" GSM_NL), |                        GF("ALREADY CONNECT" GSM_NL), | ||||||
|   | |||||||
| @@ -72,7 +72,7 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     // If we're creating a new connection on the same client, we need to wait |     // 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. |     // until the async close has finished on Cat-M modems. | ||||||
| @@ -94,7 +94,7 @@ public: | |||||||
|     rx.clear(); |     rx.clear(); | ||||||
|  |  | ||||||
|     uint8_t oldMux = mux; |     uint8_t oldMux = mux; | ||||||
|     sock_connected = at->modemConnect(host, port, &mux); |     sock_connected = at->modemConnect(host, port, &mux, timeout); | ||||||
|     if (mux != oldMux) { |     if (mux != oldMux) { | ||||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); |         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||||
|         at->sockets[oldMux] = NULL; |         at->sockets[oldMux] = NULL; | ||||||
| @@ -105,7 +105,7 @@ public: | |||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -159,12 +159,12 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     uint8_t oldMux = mux; |     uint8_t oldMux = mux; | ||||||
|     sock_connected = at->modemConnect(host, port, &mux, true); |     sock_connected = at->modemConnect(host, port, &mux, true, timeout); | ||||||
|     if (mux != oldMux) { |     if (mux != oldMux) { | ||||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); |         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||||
|         at->sockets[oldMux] = NULL; |         at->sockets[oldMux] = NULL; | ||||||
| @@ -528,7 +528,9 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, | ||||||
|  |                     bool ssl = false, int timeout = 120000L) | ||||||
|  |   { | ||||||
|     sendAT(GF("+USOCR=6"));  // create a socket |     sendAT(GF("+USOCR=6"));  // create a socket | ||||||
|     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created |     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created | ||||||
|       return false; |       return false; | ||||||
| @@ -553,7 +555,7 @@ protected: | |||||||
|     // TODO:  Use faster "asynchronous" connection? |     // TODO:  Use faster "asynchronous" connection? | ||||||
|     // We would have to wait for the +UUSOCO URC to verify connection |     // We would have to wait for the +UUSOCO URC to verify connection | ||||||
|     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); |     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); | ||||||
|     int rsp = waitResponse(120000L); |     int rsp = waitResponse(timeout); | ||||||
|     return (1 == rsp); |     return (1 == rsp); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -83,15 +83,15 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     if (sock_connected) stop(); |     if (sock_connected) stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     sock_connected = at->modemConnect(host, port, mux); |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -150,7 +150,7 @@ protected: | |||||||
|   bool          strictSSL = false; |   bool          strictSSL = false; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
| @@ -172,7 +172,7 @@ public: | |||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     sock_connected = at->modemConnect(host, port, mux, true); |     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -477,8 +477,11 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux, | ||||||
|  |                     bool ssl = false, int timeout = 75000L) | ||||||
|  |  { | ||||||
|     int rsp; |     int rsp; | ||||||
|  |     unsigned long startMillis = millis(); | ||||||
|  |  | ||||||
|     if (ssl) { |     if (ssl) { | ||||||
|       // enable SSl and use security profile 1 |       // enable SSl and use security profile 1 | ||||||
| @@ -496,7 +499,7 @@ protected: | |||||||
|     waitResponse(); |     waitResponse(); | ||||||
|  |  | ||||||
|     sendAT(GF("+SQNSD="), mux, ",0,", port, ',', GF("\""), host, GF("\""), ",0,0,1"); |     sendAT(GF("+SQNSD="), mux, ",0,", port, ',', GF("\""), host, GF("\""), ",0,0,1"); | ||||||
|     rsp = waitResponse(75000L, |     rsp = waitResponse((timeout - (millis() - startMillis)), | ||||||
|                       GF("OK" GSM_NL), |                       GF("OK" GSM_NL), | ||||||
|                       GF("NO CARRIER" GSM_NL) |                       GF("NO CARRIER" GSM_NL) | ||||||
|                       ); |                       ); | ||||||
| @@ -505,19 +508,10 @@ protected: | |||||||
|     if (rsp != 1) return rsp; |     if (rsp != 1) return rsp; | ||||||
|  |  | ||||||
|     // wait until we get a good status |     // wait until we get a good status | ||||||
|     unsigned long timeout = 5000; |  | ||||||
|     unsigned long startMillis = millis(); |  | ||||||
|     bool connected = false; |     bool connected = false; | ||||||
|     while (!connected) { |     while (!connected && ((millis() - startMillis) < timeout)) { | ||||||
|       connected = modemGetConnected(mux); |       connected = modemGetConnected(mux); | ||||||
|       if (connected) { |  | ||||||
|         delay(50); |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|       delay(100); // socket may be in opening state |       delay(100); // socket may be in opening state | ||||||
|       if (millis() - startMillis < timeout) { |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|     return connected; |     return connected; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -72,13 +72,13 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|  |  | ||||||
|     uint8_t oldMux = mux; |     uint8_t oldMux = mux; | ||||||
|     sock_connected = at->modemConnect(host, port, &mux); |     sock_connected = at->modemConnect(host, port, &mux, timeout); | ||||||
|     if (mux != oldMux) { |     if (mux != oldMux) { | ||||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); |         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||||
|         at->sockets[oldMux] = NULL; |         at->sockets[oldMux] = NULL; | ||||||
| @@ -89,7 +89,7 @@ public: | |||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
| @@ -143,12 +143,12 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|     stop(); |     stop(); | ||||||
|     TINY_GSM_YIELD(); |     TINY_GSM_YIELD(); | ||||||
|     rx.clear(); |     rx.clear(); | ||||||
|     uint8_t oldMux = mux; |     uint8_t oldMux = mux; | ||||||
|     sock_connected = at->modemConnect(host, port, &mux, true); |     sock_connected = at->modemConnect(host, port, &mux, true, timeout); | ||||||
|     if (mux != oldMux) { |     if (mux != oldMux) { | ||||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); |         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||||
|         at->sockets[oldMux] = NULL; |         at->sockets[oldMux] = NULL; | ||||||
| @@ -511,7 +511,9 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, | ||||||
|  |                     bool ssl = false, int timeout = 120000L) | ||||||
|  |   { | ||||||
|     sendAT(GF("+USOCR=6"));  // create a socket |     sendAT(GF("+USOCR=6"));  // create a socket | ||||||
|     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created |     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created | ||||||
|       return false; |       return false; | ||||||
| @@ -536,7 +538,7 @@ protected: | |||||||
|     // TODO:  Use faster "asynchronous" connection? |     // TODO:  Use faster "asynchronous" connection? | ||||||
|     // We would have to wait for the +UUSOCO URC to verify connection |     // We would have to wait for the +UUSOCO URC to verify connection | ||||||
|     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); |     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); | ||||||
|     int rsp = waitResponse(120000L); |     int rsp = waitResponse(timeout); | ||||||
|     return (1 == rsp); |     return (1 == rsp); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -24,6 +24,20 @@ | |||||||
| static const char GSM_OK[] TINY_GSM_PROGMEM = "OK" GSM_NL; | static const char GSM_OK[] TINY_GSM_PROGMEM = "OK" GSM_NL; | ||||||
| static const char GSM_ERROR[] TINY_GSM_PROGMEM = "ERROR" GSM_NL; | static const char GSM_ERROR[] TINY_GSM_PROGMEM = "ERROR" GSM_NL; | ||||||
|  |  | ||||||
|  | // Use this to avoid too many entrances and exits from command mode. | ||||||
|  | // The cellular Bee's often freeze up and won't respond when attempting | ||||||
|  | // to enter command mode too many times. | ||||||
|  | #define XBEE_COMMAND_START_DECORATOR(nAttempts, failureReturn) \ | ||||||
|  |   bool wasInCommandMode = inCommandMode; \ | ||||||
|  |   if (!wasInCommandMode) {  /* don't re-enter command mode if already in it */ \ | ||||||
|  |     if (!commandMode(nAttempts)) return failureReturn;  /* Return immediately if fails */ \ | ||||||
|  |   } | ||||||
|  | #define XBEE_COMMAND_END_DECORATOR \ | ||||||
|  |   if (!wasInCommandMode) {  /* only exit if we weren't in command mode */ \ | ||||||
|  |     exitCommand(); \ | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
| enum SimStatus { | enum SimStatus { | ||||||
|   SIM_ERROR = 0, |   SIM_ERROR = 0, | ||||||
|   SIM_READY = 1, |   SIM_READY = 1, | ||||||
| @@ -77,31 +91,30 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   // NOTE:  The XBee saves all paramter information in flash.  When you turn it |   // NOTE:  The XBee saves all connection information (ssid/pwd or apn AND last used IP address) | ||||||
|   // on it immediately prepares to re-connect to whatever was last connected to. |   // in flash (NVM).  When you turn it on it immediately prepares to re-connect to whatever was | ||||||
|   // All the modemConnect() function does is tell it the paramters to put into |   // last set.  The TCP connection itself is not opened until you attempt to send data. | ||||||
|   // flash.  The connection itself is not opened until you attempt to send data. |  | ||||||
|   // Because all settings are saved to flash, it is possible (or likely) that |   // Because all settings are saved to flash, it is possible (or likely) that | ||||||
|   // you could send out data even if you haven't "made" any connection. |   // you could send data even if you haven't "made" any connection. | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|  |     // NOTE:  Not caling stop() or yeild() here | ||||||
|     at->streamClear();  // Empty anything in the buffer before starting |     at->streamClear();  // Empty anything in the buffer before starting | ||||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode |     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||||
|       sock_connected = at->modemConnect(host, port, mux, false); |  | ||||||
|       at->writeChanges(); |  | ||||||
|       at->exitCommand(); |  | ||||||
|     } |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |   virtual int connect(const char *host, uint16_t port) { | ||||||
|  |     return connect(host, port, 75000L); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   virtual int connect(IPAddress ip, uint16_t port) { |   virtual int connect(IPAddress ip, uint16_t port, int timeout) { | ||||||
|  |     // NOTE:  Not caling stop() or yeild() here | ||||||
|     at->streamClear();  // Empty anything in the buffer before starting |     at->streamClear();  // Empty anything in the buffer before starting | ||||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode |     sock_connected = at->modemConnect(ip, port, mux, timeout); | ||||||
|       sock_connected = at->modemConnect(ip, port, mux, false); |  | ||||||
|       at->writeChanges(); |  | ||||||
|       at->exitCommand(); |  | ||||||
|     } |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |   virtual int connect(IPAddress ip, uint16_t port) { | ||||||
|  |     return connect(ip, port, 75000L); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   virtual void stop() { |   virtual void stop() { | ||||||
|     at->streamClear();  // Empty anything in the buffer |     at->streamClear();  // Empty anything in the buffer | ||||||
| @@ -196,12 +209,6 @@ public: | |||||||
|     if (available()) { |     if (available()) { | ||||||
|       return true; |       return true; | ||||||
|     } |     } | ||||||
|     // Double check that we don't know it's closed |  | ||||||
|     // NOTE:  modemGetConnected() is likely to return a "false" true because |  | ||||||
|     // it will return unknown until after data is sent over the connection. |  | ||||||
|     // If the socket is definitely closed, modemGetConnected() will set |  | ||||||
|     // sock_connected to false; |  | ||||||
|     at->modemGetConnected(); |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|   virtual operator bool() { return connected(); } |   virtual operator bool() { return connected(); } | ||||||
| @@ -230,23 +237,17 @@ public: | |||||||
|   {} |   {} | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   virtual int connect(const char *host, uint16_t port) { |   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||||
|  |     // NOTE:  Not caling stop() or yeild() here | ||||||
|     at->streamClear();  // Empty anything in the buffer before starting |     at->streamClear();  // Empty anything in the buffer before starting | ||||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode |     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||||
|       sock_connected = at->modemConnect(host, port, mux, true); |  | ||||||
|       at->writeChanges(); |  | ||||||
|       at->exitCommand(); |  | ||||||
|     } |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   virtual int connect(IPAddress ip, uint16_t port) { |   virtual int connect(IPAddress ip, uint16_t port, int timeout) { | ||||||
|  |     // NOTE:  Not caling stop() or yeild() here | ||||||
|     at->streamClear();  // Empty anything in the buffer before starting |     at->streamClear();  // Empty anything in the buffer before starting | ||||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode |     sock_connected = at->modemConnect(ip, port, mux, timeout); | ||||||
|       sock_connected = at->modemConnect(ip, port, mux, false); |  | ||||||
|       at->writeChanges(); |  | ||||||
|       at->exitCommand(); |  | ||||||
|     } |  | ||||||
|     return sock_connected; |     return sock_connected; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| @@ -294,20 +295,26 @@ public: | |||||||
|       digitalWrite(resetPin, HIGH); |       digitalWrite(resetPin, HIGH); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!commandMode(10)) return false;  // Try up to 10 times for the init |     XBEE_COMMAND_START_DECORATOR(10, false) | ||||||
|  |  | ||||||
|     sendAT(GF("AP0"));  // Put in transparent mode |     sendAT(GF("AP0"));  // Put in transparent mode | ||||||
|     bool ret_val = waitResponse() == 1; |     bool ret_val = waitResponse() == 1; | ||||||
|     ret_val &= writeChanges(); |  | ||||||
|  |  | ||||||
|     sendAT(GF("GT64")); // shorten the guard time to 100ms |     sendAT(GF("GT64")); // shorten the guard time to 100ms | ||||||
|     ret_val &= waitResponse(); |     ret_val &= waitResponse() == 1; | ||||||
|     ret_val &= writeChanges(); |  | ||||||
|     if (ret_val) guardTime = 110; |     if (ret_val) guardTime = 110; | ||||||
|  |  | ||||||
|  |    // Make sure the command mode drop-out time is long enough that we won't fall | ||||||
|  |    // out of command mode without intentionally leaving it.  This is the default | ||||||
|  |    // drop out time of 0x64 x 100ms (10 seconds) | ||||||
|  |     sendAT(GF("CT64")); | ||||||
|  |     ret_val &= waitResponse() == 1; | ||||||
|  |     ret_val &= writeChanges(); | ||||||
|  |  | ||||||
|     getSeries();  // Get the "Hardware Series"; |     getSeries();  // Get the "Hardware Series"; | ||||||
|  |  | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|     return ret_val; |     return ret_val; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -316,7 +323,7 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   void setBaud(unsigned long baud) { |   void setBaud(unsigned long baud) { | ||||||
|     if (!commandMode()) return; |     XBEE_COMMAND_START_DECORATOR(5, ) | ||||||
|     switch(baud) |     switch(baud) | ||||||
|     { |     { | ||||||
|       case 2400: sendAT(GF("BD1")); break; |       case 2400: sendAT(GF("BD1")); break; | ||||||
| @@ -337,7 +344,7 @@ public: | |||||||
|     } |     } | ||||||
|     waitResponse(); |     waitResponse(); | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool testAT(unsigned long timeout = 10000L) { |   bool testAT(unsigned long timeout = 10000L) { | ||||||
| @@ -352,9 +359,8 @@ public: | |||||||
|           sendAT(); |           sendAT(); | ||||||
|           if (waitResponse(200) == 1) { |           if (waitResponse(200) == 1) { | ||||||
|               success =  true; |               success =  true; | ||||||
|               exitCommand(); |  | ||||||
|           } |           } | ||||||
|           // if we didn't respond to the AT, must not be in command mode |           // if we didn't respond to the AT, assume we're not in command mode | ||||||
|           else inCommandMode = false; |           else inCommandMode = false; | ||||||
|       } |       } | ||||||
|       delay(250); |       delay(250); | ||||||
| @@ -375,11 +381,11 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool factoryDefault() { |   bool factoryDefault() { | ||||||
|     if (!commandMode()) return false;  // Return immediately |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     sendAT(GF("RE")); |     sendAT(GF("RE")); | ||||||
|     bool ret_val = waitResponse() == 1; |     bool ret_val = waitResponse() == 1; | ||||||
|     ret_val &= writeChanges(); |     ret_val &= writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     // Make sure the guard time for the modem object is set back to default |     // Make sure the guard time for the modem object is set back to default | ||||||
|     // otherwise communication would fail after the reset |     // otherwise communication would fail after the reset | ||||||
|     guardTime = 1010; |     guardTime = 1010; | ||||||
| @@ -387,14 +393,7 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   String getModemInfo() { |   String getModemInfo() { | ||||||
|     String modemInf = ""; |     return sendATGetString(GF("HS")); | ||||||
|     if (!commandMode()) return modemInf;  // Try up to 10 times for the init |  | ||||||
|  |  | ||||||
|     sendAT(GF("HS"));  // Get the "Hardware Series" |  | ||||||
|     modemInf += readResponseString(); |  | ||||||
|  |  | ||||||
|     exitCommand(); |  | ||||||
|     return modemInf; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool hasSSL() { |   bool hasSSL() { | ||||||
| @@ -443,7 +442,9 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool restart() { |   bool restart() { | ||||||
|  |  | ||||||
|     if (!commandMode()) return false;  // Return immediately |     if (!commandMode()) return false;  // Return immediately | ||||||
|  |  | ||||||
|     if (beeType == XBEE_UNKNOWN) getSeries();  // how we restart depends on this |     if (beeType == XBEE_UNKNOWN) getSeries();  // how we restart depends on this | ||||||
|  |  | ||||||
|     if (beeType != XBEE_S6B_WIFI) { |     if (beeType != XBEE_S6B_WIFI) { | ||||||
| @@ -455,9 +456,10 @@ public: | |||||||
|  |  | ||||||
|     sendAT(GF("FR")); |     sendAT(GF("FR")); | ||||||
|     if (waitResponse() != 1) return exitAndFail(); |     if (waitResponse() != 1) return exitAndFail(); | ||||||
|  |     else inCommandMode = false;  // Reset effectively exits command mode | ||||||
|  |  | ||||||
|     if (beeType == XBEE_S6B_WIFI) delay(2000);  // Wifi module actually resets about 2 seconds later |     if (beeType == XBEE_S6B_WIFI) delay(2000);  // Wifi module actually resets about 2 seconds later | ||||||
|     else delay(100);  // cellular modules wait 100ms before reset happes |     else delay(100);  // cellular modules wait 100ms before reset happens | ||||||
|  |  | ||||||
|     // Wait until reboot complete and responds to command mode call again |     // Wait until reboot complete and responds to command mode call again | ||||||
|     for (unsigned long start = millis(); millis() - start < 60000L; ) { |     for (unsigned long start = millis(); millis() - start < 60000L; ) { | ||||||
| @@ -477,7 +479,7 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   void setupPinSleep(bool maintainAssociation = false) { |   void setupPinSleep(bool maintainAssociation = false) { | ||||||
|     if (!commandMode()) return;  // Return immediately |     XBEE_COMMAND_START_DECORATOR(5, ) | ||||||
|  |  | ||||||
|     if (beeType == XBEE_UNKNOWN) getSeries();  // Command depends on series |     if (beeType == XBEE_UNKNOWN) getSeries();  // Command depends on series | ||||||
|  |  | ||||||
| @@ -496,7 +498,7 @@ public: | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool poweroff() {  // Not supported |   bool poweroff() {  // Not supported | ||||||
| @@ -516,19 +518,11 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   String getSimCCID() { |   String getSimCCID() { | ||||||
|     if (!commandMode()) return "";  // Return immediately |     return sendATGetString(GF("S#")); | ||||||
|     sendAT(GF("S#")); |  | ||||||
|     String res = readResponseString(); |  | ||||||
|     exitCommand(); |  | ||||||
|     return res; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   String getIMEI() { |   String getIMEI() { | ||||||
|     if (!commandMode()) return "";  // Return immediately |     return sendATGetString(GF("IM")); | ||||||
|     sendAT(GF("IM")); |  | ||||||
|     String res = readResponseString(); |  | ||||||
|     exitCommand(); |  | ||||||
|     return res; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SimStatus getSimStatus(unsigned long timeout = 10000L) { |   SimStatus getSimStatus(unsigned long timeout = 10000L) { | ||||||
| @@ -537,10 +531,7 @@ public: | |||||||
|  |  | ||||||
|   RegStatus getRegistrationStatus() { |   RegStatus getRegistrationStatus() { | ||||||
|  |  | ||||||
|     bool wasInCommandMode = inCommandMode; |     XBEE_COMMAND_START_DECORATOR(5, REG_UNKNOWN) | ||||||
|     if (!wasInCommandMode) {  // don't re-enter command mode if already in it |  | ||||||
|       commandMode(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (!inCommandMode) return REG_UNKNOWN;  // Return immediately |     if (!inCommandMode) return REG_UNKNOWN;  // Return immediately | ||||||
|  |  | ||||||
| @@ -619,18 +610,12 @@ public: | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!wasInCommandMode) {  // only exit if we weren't in command mode |     XBEE_COMMAND_END_DECORATOR | ||||||
|       exitCommand(); |  | ||||||
|     } |  | ||||||
|     return stat; |     return stat; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   String getOperator() { |   String getOperator() { | ||||||
|     if (!commandMode()) return "";  // Return immediately |     return sendATGetString(GF("MN")); | ||||||
|     sendAT(GF("MN")); |  | ||||||
|     String res = readResponseString(); |  | ||||||
|     exitCommand(); |  | ||||||
|     return res; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  /* |  /* | ||||||
| @@ -638,12 +623,17 @@ public: | |||||||
|   */ |   */ | ||||||
|  |  | ||||||
|   int16_t getSignalQuality() { |   int16_t getSignalQuality() { | ||||||
|     if (!commandMode()) return 0;  // Return immediately |  | ||||||
|  |     XBEE_COMMAND_START_DECORATOR(5, 0); | ||||||
|  |  | ||||||
|     if (beeType == XBEE_UNKNOWN) getSeries();  // Need to know what type of bee so we know how to ask |     if (beeType == XBEE_UNKNOWN) getSeries();  // Need to know what type of bee so we know how to ask | ||||||
|  |  | ||||||
|     if (beeType == XBEE_S6B_WIFI) sendAT(GF("LM"));  // ask for the "link margin" - the dB above sensitivity |     if (beeType == XBEE_S6B_WIFI) sendAT(GF("LM"));  // ask for the "link margin" - the dB above sensitivity | ||||||
|     else sendAT(GF("DB"));  // ask for the cell strength in dBm |     else sendAT(GF("DB"));  // ask for the cell strength in dBm | ||||||
|     int16_t intRes = readResponseInt(); |     int16_t intRes = readResponseInt(); | ||||||
|     exitCommand(); |  | ||||||
|  |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|     if (beeType == XBEE3_LTEM_ATT && intRes == 105) intRes = 0;  // tends to reply with "69" when signal is unknown |     if (beeType == XBEE3_LTEM_ATT && intRes == 105) intRes = 0;  // tends to reply with "69" when signal is unknown | ||||||
|     if (beeType == XBEE_S6B_WIFI) return -93 + intRes;  // the maximum sensitivity is -93dBm |     if (beeType == XBEE_S6B_WIFI) return -93 + intRes;  // the maximum sensitivity is -93dBm | ||||||
|     else return -1*intRes; // need to convert to negative number |     else return -1*intRes; // need to convert to negative number | ||||||
| @@ -655,17 +645,14 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool waitForNetwork(unsigned long timeout = 60000L) { |   bool waitForNetwork(unsigned long timeout = 60000L) { | ||||||
|     // Enter command mode at the start so we don't have to go in and out of it |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     // The cellular Bee's often freeze up and won't respond when attempting |  | ||||||
|     // to enter command mode too many times. |  | ||||||
|     commandMode(); |  | ||||||
|     for (unsigned long start = millis(); millis() - start < timeout; ) { |     for (unsigned long start = millis(); millis() - start < timeout; ) { | ||||||
|       if (isNetworkConnected()) { |       if (isNetworkConnected()) { | ||||||
|         return true; |         return true; | ||||||
|       } |       } | ||||||
|       delay(250);  // per Neil H. - more stable with delay |       delay(250);  // per Neil H. - more stable with delay | ||||||
|     } |     } | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -675,7 +662,8 @@ public: | |||||||
|  |  | ||||||
|   bool networkConnect(const char* ssid, const char* pwd) { |   bool networkConnect(const char* ssid, const char* pwd) { | ||||||
|  |  | ||||||
|     if (!commandMode()) return false;  // return immediately |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|  |  | ||||||
|     //nh For no pwd don't set setscurity or pwd |     //nh For no pwd don't set setscurity or pwd | ||||||
|     if (NULL == ssid ) return exitAndFail(); |     if (NULL == ssid ) return exitAndFail(); | ||||||
|  |  | ||||||
| @@ -693,19 +681,19 @@ public: | |||||||
|     if (waitResponse() != 1) return exitAndFail(); |     if (waitResponse() != 1) return exitAndFail(); | ||||||
|  |  | ||||||
|     if (!writeChanges()) return exitAndFail(); |     if (!writeChanges()) return exitAndFail(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool networkDisconnect() { |   bool networkDisconnect() { | ||||||
|     if (!commandMode()) return false;  // return immediately |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     sendAT(GF("NR0"));  // Do a network reset in order to disconnect |     sendAT(GF("NR0"));  // Do a network reset in order to disconnect | ||||||
|     // NOTE:  On wifi modules, using a network reset will not |     // WARNING:  On wifi modules, using a network reset will not | ||||||
|     // allow the same ssid to re-join without rebooting the module. |     // allow the same ssid to re-join without rebooting the module. | ||||||
|     int8_t res = (1 == waitResponse(5000)); |     int8_t res = (1 == waitResponse(5000)); | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     return res; |     return res; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -714,12 +702,12 @@ public: | |||||||
|    */ |    */ | ||||||
|  |  | ||||||
|   String getLocalIP() { |   String getLocalIP() { | ||||||
|     if (!commandMode()) return "";  // Return immediately |     XBEE_COMMAND_START_DECORATOR(5, "") | ||||||
|     sendAT(GF("MY")); |     sendAT(GF("MY")); | ||||||
|     String IPaddr; IPaddr.reserve(16); |     String IPaddr; IPaddr.reserve(16); | ||||||
|     // wait for the response - this response can be very slow |     // wait for the response - this response can be very slow | ||||||
|     IPaddr = readResponseString(30000); |     IPaddr = readResponseString(30000); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     IPaddr.trim(); |     IPaddr.trim(); | ||||||
|     return IPaddr; |     return IPaddr; | ||||||
|   } |   } | ||||||
| @@ -733,23 +721,23 @@ public: | |||||||
|    */ |    */ | ||||||
|  |  | ||||||
|   bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) { |   bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) { | ||||||
|     if (!commandMode()) return false;  // Return immediately |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     sendAT(GF("AN"), apn);  // Set the APN |     sendAT(GF("AN"), apn);  // Set the APN | ||||||
|     waitResponse(); |     bool success = waitResponse() == 1; | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     return true; |     return success; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool gprsDisconnect() { |   bool gprsDisconnect() { | ||||||
|     if (!commandMode()) return false;  // return immediately |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     sendAT(GF("AM1"));  // Cheating and disconnecting by turning on airplane mode |     sendAT(GF("AM1"));  // Cheating and disconnecting by turning on airplane mode | ||||||
|     int8_t res = (1 == waitResponse(5000)); |     int8_t res = (1 == waitResponse(5000)); | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     sendAT(GF("AM0"));  // Airplane mode off |     sendAT(GF("AM0"));  // Airplane mode off | ||||||
|     waitResponse(5000); |     waitResponse(5000); | ||||||
|     writeChanges(); |     writeChanges(); | ||||||
|     exitCommand(); |     XBEE_COMMAND_END_DECORATOR | ||||||
|     return res; |     return res; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -772,11 +760,14 @@ public: | |||||||
|     if (waitResponse() !=1) return exitAndFail(); |     if (waitResponse() !=1) return exitAndFail(); | ||||||
|     sendAT(GF("TDD"));  // Set the text delimiter to the standard 0x0D (carriage return) |     sendAT(GF("TDD"));  // Set the text delimiter to the standard 0x0D (carriage return) | ||||||
|     if (waitResponse() !=1) return exitAndFail(); |     if (waitResponse() !=1) return exitAndFail(); | ||||||
|     if (!writeChanges()) return exitAndFail(); |  | ||||||
|  |  | ||||||
|  |     if (!writeChanges()) return exitAndFail(); | ||||||
|  |     // Get out of command mode to actually send the text | ||||||
|     exitCommand(); |     exitCommand(); | ||||||
|  |  | ||||||
|     streamWrite(text); |     streamWrite(text); | ||||||
|     stream.write((char)0x0D);  // close off with the carriage return |     stream.write((char)0x0D);  // close off with the carriage return | ||||||
|  |  | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -800,16 +791,17 @@ public: | |||||||
|  |  | ||||||
| protected: | protected: | ||||||
|  |  | ||||||
|   IPAddress getHostIP(const char* host) { |   IPAddress getHostIP(const char* host, int timeout = 45000L) { | ||||||
|     String strIP; strIP.reserve(16); |     String strIP; strIP.reserve(16); | ||||||
|     unsigned long startMillis = millis(); |     unsigned long startMillis = millis(); | ||||||
|     bool gotIP = false; |     bool gotIP = false; | ||||||
|  |     XBEE_COMMAND_START_DECORATOR(5, IPAddress(0,0,0,0)) | ||||||
|     // XBee's require a numeric IP address for connection, but do provide the |     // XBee's require a numeric IP address for connection, but do provide the | ||||||
|     // functionality to look up the IP address from a fully qualified domain name |     // functionality to look up the IP address from a fully qualified domain name | ||||||
|     while (millis() - startMillis < 45000L)  // the lookup can take a while |     while (millis() - startMillis < timeout)  // the lookup can take a while | ||||||
|     { |     { | ||||||
|       sendAT(GF("LA"), host); |       sendAT(GF("LA"), host); | ||||||
|       while (stream.available() < 4 && (millis() - startMillis < 45000L)) {};  // wait for any response |       while (stream.available() < 4 && (millis() - startMillis < timeout)) {};  // wait for any response | ||||||
|       strIP = stream.readStringUntil('\r');  // read result |       strIP = stream.readStringUntil('\r');  // read result | ||||||
|       strIP.trim(); |       strIP.trim(); | ||||||
|       if (!strIP.endsWith(GF("ERROR"))) { |       if (!strIP.endsWith(GF("ERROR"))) { | ||||||
| @@ -818,33 +810,44 @@ protected: | |||||||
|       } |       } | ||||||
|       delay(2500);  // wait a bit before trying again |       delay(2500);  // wait a bit before trying again | ||||||
|     } |     } | ||||||
|     if (gotIP) {  // No reason to continue if we don't know the IP address |  | ||||||
|  |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|  |     if (gotIP) { | ||||||
|       return TinyGsmIpFromString(strIP); |       return TinyGsmIpFromString(strIP); | ||||||
|     } |     } | ||||||
|     else return IPAddress(0,0,0,0); |     else return IPAddress(0,0,0,0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux = 0, bool ssl = false) { |   bool modemConnect(const char* host, uint16_t port, uint8_t mux = 0, | ||||||
|     // If requested host is the same as the previous one and we already |                     bool ssl = false, int timeout = 75000L) | ||||||
|     // have a valid IP address, we don't have to do anything. |   { | ||||||
|     if (this->savedHost == String(host) && savedIP != IPAddress(0,0,0,0)) { |     unsigned long startMillis = millis(); | ||||||
|       return true; |     bool retVal = false; | ||||||
|     } |      XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|  |  | ||||||
|     // Otherwise, set the new host and mark the IP as invalid |     // If it's a new host or we dont' have a good IP, we need to do a DNS | ||||||
|     this->savedHost = String(host); |     // search for the IP to connect to | ||||||
|     savedIP = getHostIP(host);  // This will return 0.0.0.0 if lookup fails |     if (this->savedHost != String(host) || savedIP == IPAddress(0,0,0,0)) { | ||||||
|  |       this->savedHost = String(host); | ||||||
|  |       savedIP = getHostIP(host, timeout);  // This will return 0.0.0.0 if lookup fails | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // If we now have a valid IP address, use it to connect |     // If we now have a valid IP address, use it to connect | ||||||
|     if (savedIP != IPAddress(0,0,0,0)) {  // Only re-set connection information if we have an IP address |     if (savedIP != IPAddress(0,0,0,0)) {  // Only re-set connection information if we have an IP address | ||||||
|       return modemConnect(savedIP, port, mux, ssl); |       retVal = modemConnect(savedIP, port, mux, ssl, timeout - (millis() - startMillis)); | ||||||
|     } |     } | ||||||
|     else return false; |  | ||||||
|  |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|  |     return retVal; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool modemConnect(IPAddress ip, uint16_t port, uint8_t mux = 0, bool ssl = false) { |   bool modemConnect(IPAddress ip, uint16_t port, uint8_t mux = 0, bool ssl = false, int timeout = 75000L) { | ||||||
|  |  | ||||||
|     savedIP = ip;  // Set the newly requested IP address |     savedIP = ip;  // Set the newly requested IP address | ||||||
|     bool success = true; |     bool success = true; | ||||||
|  |     XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|     String host; host.reserve(16); |     String host; host.reserve(16); | ||||||
|     host += ip[0]; |     host += ip[0]; | ||||||
|     host += "."; |     host += "."; | ||||||
| @@ -853,6 +856,7 @@ protected: | |||||||
|     host += ip[2]; |     host += ip[2]; | ||||||
|     host += "."; |     host += "."; | ||||||
|     host += ip[3]; |     host += ip[3]; | ||||||
|  |  | ||||||
|     if (ssl) { |     if (ssl) { | ||||||
|       sendAT(GF("IP"), 4);  // Put in SSL over TCP communication mode |       sendAT(GF("IP"), 4);  // Put in SSL over TCP communication mode | ||||||
|       success &= (1 == waitResponse()); |       success &= (1 == waitResponse()); | ||||||
| @@ -860,10 +864,21 @@ protected: | |||||||
|       sendAT(GF("IP"), 1);  // Put in TCP mode |       sendAT(GF("IP"), 1);  // Put in TCP mode | ||||||
|       success &= (1 == waitResponse()); |       success &= (1 == waitResponse()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     sendAT(GF("DL"), host);  // Set the "Destination Address Low" |     sendAT(GF("DL"), host);  // Set the "Destination Address Low" | ||||||
|     success &= (1 == waitResponse()); |     success &= (1 == waitResponse()); | ||||||
|     sendAT(GF("DE"), String(port, HEX));  // Set the destination port |     sendAT(GF("DE"), String(port, HEX));  // Set the destination port | ||||||
|     success &= (1 == waitResponse()); |     success &= (1 == waitResponse()); | ||||||
|  |  | ||||||
|  |     for (unsigned long start = millis(); millis() - start < timeout; ) { | ||||||
|  |       if (modemGetConnected()) { | ||||||
|  |         sockets[mux]->sock_connected = true; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |  | ||||||
|     return success; |     return success; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -879,7 +894,7 @@ protected: | |||||||
|   // as true so there's a possibility it's wrong. |   // as true so there's a possibility it's wrong. | ||||||
|   bool modemGetConnected() { |   bool modemGetConnected() { | ||||||
|  |  | ||||||
|     if (!commandMode()) return false;  // Return immediately |      XBEE_COMMAND_START_DECORATOR(5, false) | ||||||
|  |  | ||||||
|     // If the IP address is 0, it's not valid so we can't be connected |     // If the IP address is 0, it's not valid so we can't be connected | ||||||
|     if (savedIP == IPAddress(0,0,0,0)) return false; |     if (savedIP == IPAddress(0,0,0,0)) return false; | ||||||
| @@ -898,14 +913,14 @@ protected: | |||||||
|       case XBEE_S6B_WIFI: { |       case XBEE_S6B_WIFI: { | ||||||
|         RegStatus s = getRegistrationStatus(); |         RegStatus s = getRegistrationStatus(); | ||||||
|         if (s != REG_OK) { |         if (s != REG_OK) { | ||||||
|           sockets[0]->sock_connected = false; |           sockets[0]->sock_connected = false;  // no multiplex | ||||||
|         } |         } | ||||||
|         return (s == REG_OK);  // if it's connected, we hope the sockets are too |         return (s == REG_OK);  // if it's connected, we hope the sockets are too | ||||||
|       } |       } | ||||||
|       default: {  // Cellular XBee's |       default: {  // Cellular XBee's | ||||||
|         sendAT(GF("CI")); |         sendAT(GF("CI")); | ||||||
|         int16_t intRes = readResponseInt(); |         int16_t intRes = readResponseInt(); | ||||||
|         exitCommand(); |         XBEE_COMMAND_END_DECORATOR | ||||||
|         switch(intRes) { |         switch(intRes) { | ||||||
|           case 0x00:  // 0x00 = The socket is definitely open |           case 0x00:  // 0x00 = The socket is definitely open | ||||||
|           case 0xFF:  // 0xFF = No known status - this is always returned prior to sending data |           case 0xFF:  // 0xFF = No known status - this is always returned prior to sending data | ||||||
| @@ -1014,10 +1029,15 @@ finish: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool commandMode(uint8_t retries = 5) { |   bool commandMode(uint8_t retries = 5) { | ||||||
|  |  | ||||||
|  |     // If we're already in command mode, move on | ||||||
|  |     if (inCommandMode && (millis() - lastCommandModeMillis) < 10000L) return true; | ||||||
|  |  | ||||||
|     uint8_t triesMade = 0; |     uint8_t triesMade = 0; | ||||||
|     uint8_t triesUntilReset = 4;  // only reset after 4 failures |     uint8_t triesUntilReset = 4;  // only reset after 4 failures | ||||||
|     bool success = false; |     bool success = false; | ||||||
|     streamClear();  // Empty everything in the buffer before starting |     streamClear();  // Empty everything in the buffer before starting | ||||||
|  |  | ||||||
|     while (!success and triesMade < retries) { |     while (!success and triesMade < retries) { | ||||||
|       // Cannot send anything for 1 "guard time" before entering command mode |       // Cannot send anything for 1 "guard time" before entering command mode | ||||||
|       // Default guard time is 1s, but the init fxn decreases it to 100 ms |       // Default guard time is 1s, but the init fxn decreases it to 100 ms | ||||||
| @@ -1036,7 +1056,11 @@ finish: | |||||||
|       } |       } | ||||||
|       triesMade ++; |       triesMade ++; | ||||||
|     } |     } | ||||||
|     if (success) inCommandMode = true; |  | ||||||
|  |     if (success) { | ||||||
|  |       inCommandMode = true; | ||||||
|  |       lastCommandModeMillis = millis(); | ||||||
|  |     } | ||||||
|     return success; |     return success; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -1049,6 +1073,8 @@ finish: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   void exitCommand(void) { |   void exitCommand(void) { | ||||||
|  |     // NOTE:  Here we explicitely try to exit command mode | ||||||
|  |     // even if the internal flag inCommandMode was already false | ||||||
|     sendAT(GF("CN"));  // Exit command mode |     sendAT(GF("CN"));  // Exit command mode | ||||||
|     waitResponse(); |     waitResponse(); | ||||||
|     inCommandMode = false; |     inCommandMode = false; | ||||||
| @@ -1083,6 +1109,14 @@ finish: | |||||||
|     return intRes; |     return intRes; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   String sendATGetString(GsmConstStr cmd) { | ||||||
|  |     XBEE_COMMAND_START_DECORATOR(5, "") | ||||||
|  |     sendAT(cmd); | ||||||
|  |     String res = readResponseString(); | ||||||
|  |     XBEE_COMMAND_END_DECORATOR | ||||||
|  |     return res; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   bool gotIPforSavedHost() { |   bool gotIPforSavedHost() { | ||||||
|     if (savedHost != "" && savedIP != IPAddress(0,0,0,0)) return true; |     if (savedHost != "" && savedIP != IPAddress(0,0,0,0)) return true; | ||||||
|     else return false; |     else return false; | ||||||
| @@ -1098,6 +1132,7 @@ protected: | |||||||
|   IPAddress     savedIP; |   IPAddress     savedIP; | ||||||
|   String        savedHost; |   String        savedHost; | ||||||
|   bool          inCommandMode; |   bool          inCommandMode; | ||||||
|  |   uint32_t      lastCommandModeMillis; | ||||||
|   GsmClient*    sockets[TINY_GSM_MUX_COUNT]; |   GsmClient*    sockets[TINY_GSM_MUX_COUNT]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -201,8 +201,8 @@ String TinyGsmDecodeHex16bit(String &instr) { | |||||||
|  |  | ||||||
| // Connect to a IP address given as an IPAddress object by | // Connect to a IP address given as an IPAddress object by | ||||||
| // converting said IP address to text | // converting said IP address to text | ||||||
| #define TINY_GSM_CLIENT_CONNECT_TO_IP() \ | #define TINY_GSM_CLIENT_CONNECT_OVERLOADS() \ | ||||||
|   virtual int connect(IPAddress ip, uint16_t port) { \ |   virtual int connect(IPAddress ip, uint16_t port, int timeout) { \ | ||||||
|     String host; host.reserve(16); \ |     String host; host.reserve(16); \ | ||||||
|     host += ip[0]; \ |     host += ip[0]; \ | ||||||
|     host += "."; \ |     host += "."; \ | ||||||
| @@ -211,7 +211,13 @@ String TinyGsmDecodeHex16bit(String &instr) { | |||||||
|     host += ip[2]; \ |     host += ip[2]; \ | ||||||
|     host += "."; \ |     host += "."; \ | ||||||
|     host += ip[3]; \ |     host += ip[3]; \ | ||||||
|     return connect(host.c_str(), port); \ |     return connect(host.c_str(), port, timeout); \ | ||||||
|  |   } \ | ||||||
|  |   virtual int connect(const char *host, uint16_t port) \ | ||||||
|  |     return connect(host, port, 75000L); \ | ||||||
|  |   } \ | ||||||
|  |   virtual int connect(IPAddress ip, uint16_t port) \ | ||||||
|  |     return connect(ip, port, 75000L); \ | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user