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 | ||||
|  | ||||
|     # 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_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_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_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_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_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_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_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" | ||||
|     - 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_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_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_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_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_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_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" | ||||
|  | ||||
|     # 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" | ||||
|   | ||||
| @@ -66,12 +66,12 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     uint8_t newMux = -1; | ||||
|     sock_connected = at->modemConnect(host, port, &newMux); | ||||
|     sock_connected = at->modemConnect(host, port, &newMux, timeout) | ||||
|     if (sock_connected) { | ||||
|       mux = newMux; | ||||
|       at->sockets[mux] = this; | ||||
| @@ -79,7 +79,7 @@ public: | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -504,15 +504,16 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | ||||
|  | ||||
| protected: | ||||
|  | ||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t* mux) { | ||||
|     sendAT(GF("+CIPSTART="),  GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t* mux, int timeout = 75000L) { | ||||
|     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; | ||||
|     } | ||||
|     int newMux = stream.readStringUntil('\n').toInt(); | ||||
|  | ||||
|     int rsp = waitResponse(75000L, | ||||
|     int rsp = waitResponse((timeout - (millis() - startMillis)), | ||||
|                            GF("CONNECT OK" GSM_NL), | ||||
|                            GF("CONNECT FAIL" GSM_NL), | ||||
|                            GF("ALREADY CONNECT" GSM_NL)); | ||||
|   | ||||
| @@ -71,15 +71,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -134,11 +134,11 @@ private: | ||||
| //   {} | ||||
| // | ||||
| // public: | ||||
| //   virtual int connect(const char *host, uint16_t port) { | ||||
| //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
| //     stop(); | ||||
| //     TINY_GSM_YIELD(); | ||||
| //     rx.clear(); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
| //     return sock_connected; | ||||
| //   } | ||||
| // }; | ||||
| @@ -470,14 +470,16 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | ||||
|  | ||||
| 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; | ||||
|     // <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) | ||||
|     sendAT(GF("+QIOPEN=1,"), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port, GF(",0,0")); | ||||
|     rsp = waitResponse(); | ||||
|  | ||||
|     if (waitResponse(20000L, GF(GSM_NL "+QIOPEN:")) != 1) { | ||||
|     if (waitResponse(timeout, GF(GSM_NL "+QIOPEN:")) != 1) { | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -68,15 +68,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -118,11 +118,11 @@ public: | ||||
|   {} | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
| }; | ||||
| @@ -331,14 +331,17 @@ TINY_GSM_MODEM_MAINTAIN_LISTEN() | ||||
|  | ||||
| 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) { | ||||
|       sendAT(GF("+CIPSSLSIZE=4096")); | ||||
|       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 | ||||
|     int rsp = waitResponse(75000L, | ||||
|     int rsp = waitResponse(timeout, | ||||
|                            GFP(GSM_OK), | ||||
|                            GFP(GSM_ERROR), | ||||
|                            GF("ALREADY CONNECT")); | ||||
|   | ||||
| @@ -68,16 +68,16 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|  | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -413,12 +413,12 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | ||||
|  | ||||
| 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? | ||||
|       String ip = dnsIpQuery(host); | ||||
|  | ||||
|       sendAT(GF("+TCPSETUP="), mux, GF(","), ip, GF(","), port); | ||||
|       int rsp = waitResponse(75000L, | ||||
|       int rsp = waitResponse(timeout, | ||||
|                             GF(",OK" GSM_NL), | ||||
|                             GF(",FAIL" GSM_NL), | ||||
|                             GF("+TCPSETUP:Error" GSM_NL)); | ||||
|   | ||||
| @@ -71,15 +71,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -134,11 +134,11 @@ private: | ||||
| //   {} | ||||
| // | ||||
| // public: | ||||
| //   virtual int connect(const char *host, uint16_t port) { | ||||
| //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
| //     stop(); | ||||
| //     TINY_GSM_YIELD(); | ||||
| //     rx.clear(); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
| //     return sock_connected; | ||||
| //   } | ||||
| // }; | ||||
| @@ -518,9 +518,11 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | ||||
|  | ||||
| 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); | ||||
|     int rsp = waitResponse(75000L, | ||||
|     int rsp = waitResponse(timeout, | ||||
|                            GF("CONNECT OK" GSM_NL), | ||||
|                            GF("CONNECT FAIL" GSM_NL), | ||||
|                            GF("ALREADY CONNECT" GSM_NL)); | ||||
|   | ||||
| @@ -75,15 +75,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -138,11 +138,11 @@ private: | ||||
| //   {} | ||||
| // | ||||
| // public: | ||||
| //   virtual int connect(const char *host, uint16_t port) { | ||||
| //   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
| //     stop(); | ||||
| //     TINY_GSM_YIELD(); | ||||
| //     rx.clear(); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true); | ||||
| //     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
| //     return sock_connected; | ||||
| //   } | ||||
| // }; | ||||
| @@ -537,9 +537,11 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | ||||
|  | ||||
| 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); | ||||
|     int rsp = waitResponse(75000L, | ||||
|     int rsp = waitResponse(timeout, | ||||
|                            GF("CONNECT OK" GSM_NL), | ||||
|                            GF("CONNECT FAIL" GSM_NL), | ||||
|                            GF("ALREADY CONNECT" GSM_NL)); | ||||
|   | ||||
| @@ -76,15 +76,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -140,11 +140,11 @@ public: | ||||
|   {} | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
| }; | ||||
| @@ -760,10 +760,12 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | ||||
|  | ||||
| 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; | ||||
|     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||
|     rsp = waitResponse(75000L, | ||||
|     rsp = waitResponse(timeout, | ||||
|                        GF("CONNECT OK" GSM_NL), | ||||
|                        GF("CONNECT FAIL" GSM_NL), | ||||
|                        GF("ALREADY CONNECT" GSM_NL), | ||||
|   | ||||
| @@ -77,15 +77,15 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -141,11 +141,11 @@ public: | ||||
|   {} | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
| }; | ||||
| @@ -681,7 +681,9 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | ||||
|  | ||||
| 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; | ||||
| #if !defined(TINY_GSM_MODEM_SIM900) | ||||
|     sendAT(GF("+CIPSSL="), ssl); | ||||
| @@ -691,7 +693,7 @@ protected: | ||||
|     } | ||||
| #endif | ||||
|     sendAT(GF("+CIPSTART="), mux, ',', GF("\"TCP"), GF("\",\""), host, GF("\","), port); | ||||
|     rsp = waitResponse(75000L, | ||||
|     rsp = waitResponse(timeout, | ||||
|                        GF("CONNECT OK" GSM_NL), | ||||
|                        GF("CONNECT FAIL" GSM_NL), | ||||
|                        GF("ALREADY CONNECT" GSM_NL), | ||||
|   | ||||
| @@ -72,7 +72,7 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     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. | ||||
| @@ -94,7 +94,7 @@ public: | ||||
|     rx.clear(); | ||||
|  | ||||
|     uint8_t oldMux = mux; | ||||
|     sock_connected = at->modemConnect(host, port, &mux); | ||||
|     sock_connected = at->modemConnect(host, port, &mux, timeout); | ||||
|     if (mux != oldMux) { | ||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||
|         at->sockets[oldMux] = NULL; | ||||
| @@ -105,7 +105,7 @@ public: | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -159,12 +159,12 @@ public: | ||||
|   {} | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     uint8_t oldMux = mux; | ||||
|     sock_connected = at->modemConnect(host, port, &mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, &mux, true, timeout); | ||||
|     if (mux != oldMux) { | ||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||
|         at->sockets[oldMux] = NULL; | ||||
| @@ -528,7 +528,9 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | ||||
|  | ||||
| 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 | ||||
|     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created | ||||
|       return false; | ||||
| @@ -553,7 +555,7 @@ protected: | ||||
|     // TODO:  Use faster "asynchronous" connection? | ||||
|     // We would have to wait for the +UUSOCO URC to verify connection | ||||
|     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); | ||||
|     int rsp = waitResponse(120000L); | ||||
|     int rsp = waitResponse(timeout); | ||||
|     return (1 == rsp); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -83,15 +83,15 @@ 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(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     sock_connected = at->modemConnect(host, port, mux); | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -150,7 +150,7 @@ protected: | ||||
|   bool          strictSSL = false; | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
| @@ -172,7 +172,7 @@ public: | ||||
|       return false; | ||||
|     } | ||||
|  | ||||
|     sock_connected = at->modemConnect(host, port, mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| @@ -477,8 +477,11 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK() | ||||
|  | ||||
| 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; | ||||
|     unsigned long startMillis = millis(); | ||||
|  | ||||
|     if (ssl) { | ||||
|       // enable SSl and use security profile 1 | ||||
| @@ -496,7 +499,7 @@ protected: | ||||
|     waitResponse(); | ||||
|  | ||||
|     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("NO CARRIER" GSM_NL) | ||||
|                       ); | ||||
| @@ -505,19 +508,10 @@ protected: | ||||
|     if (rsp != 1) return rsp; | ||||
|  | ||||
|     // wait until we get a good status | ||||
|     unsigned long timeout = 5000; | ||||
|     unsigned long startMillis = millis(); | ||||
|     bool connected = false; | ||||
|     while (!connected) { | ||||
|     while (!connected && ((millis() - startMillis) < timeout)) { | ||||
|       connected = modemGetConnected(mux); | ||||
|       if (connected) { | ||||
|         delay(50); | ||||
|         break; | ||||
|       } | ||||
|       delay(100); // socket may be in opening state | ||||
|       if (millis() - startMillis < timeout) { | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|     return connected; | ||||
|   } | ||||
|   | ||||
| @@ -72,13 +72,13 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|  | ||||
|     uint8_t oldMux = mux; | ||||
|     sock_connected = at->modemConnect(host, port, &mux); | ||||
|     sock_connected = at->modemConnect(host, port, &mux, timeout); | ||||
|     if (mux != oldMux) { | ||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||
|         at->sockets[oldMux] = NULL; | ||||
| @@ -89,7 +89,7 @@ public: | ||||
|     return sock_connected; | ||||
|   } | ||||
|  | ||||
| TINY_GSM_CLIENT_CONNECT_TO_IP() | ||||
| TINY_GSM_CLIENT_CONNECT_OVERLOADS() | ||||
|  | ||||
|   virtual void stop() { | ||||
|     TINY_GSM_YIELD(); | ||||
| @@ -143,12 +143,12 @@ public: | ||||
|   {} | ||||
|  | ||||
| public: | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   virtual int connect(const char *host, uint16_t port, int timeout) { | ||||
|     stop(); | ||||
|     TINY_GSM_YIELD(); | ||||
|     rx.clear(); | ||||
|     uint8_t oldMux = mux; | ||||
|     sock_connected = at->modemConnect(host, port, &mux, true); | ||||
|     sock_connected = at->modemConnect(host, port, &mux, true, timeout); | ||||
|     if (mux != oldMux) { | ||||
|         DBG("WARNING:  Mux number changed from", oldMux, "to", mux); | ||||
|         at->sockets[oldMux] = NULL; | ||||
| @@ -511,7 +511,9 @@ TINY_GSP_MODEM_GET_GPRS_IP_CONNECTED() | ||||
|  | ||||
| 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 | ||||
|     if (waitResponse(GF(GSM_NL "+USOCR:")) != 1) {  // reply is +USOCR: ## of socket created | ||||
|       return false; | ||||
| @@ -536,7 +538,7 @@ protected: | ||||
|     // TODO:  Use faster "asynchronous" connection? | ||||
|     // We would have to wait for the +UUSOCO URC to verify connection | ||||
|     sendAT(GF("+USOCO="), *mux, ",\"", host, "\",", port); | ||||
|     int rsp = waitResponse(120000L); | ||||
|     int rsp = waitResponse(timeout); | ||||
|     return (1 == rsp); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -24,6 +24,20 @@ | ||||
| static const char GSM_OK[] TINY_GSM_PROGMEM = "OK" 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 { | ||||
|   SIM_ERROR = 0, | ||||
|   SIM_READY = 1, | ||||
| @@ -77,31 +91,30 @@ public: | ||||
|   } | ||||
|  | ||||
| public: | ||||
|   // NOTE:  The XBee saves all paramter information in flash.  When you turn it | ||||
|   // on it immediately prepares to re-connect to whatever was last connected to. | ||||
|   // All the modemConnect() function does is tell it the paramters to put into | ||||
|   // flash.  The connection itself is not opened until you attempt to send data. | ||||
|   // NOTE:  The XBee saves all connection information (ssid/pwd or apn AND last used IP address) | ||||
|   // in flash (NVM).  When you turn it on it immediately prepares to re-connect to whatever was | ||||
|   // last set.  The TCP connection itself is not opened until you attempt to send data. | ||||
|   // 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. | ||||
|   virtual int connect(const char *host, uint16_t port) { | ||||
|   // you could send data even if you haven't "made" any connection. | ||||
|   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 | ||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode | ||||
|       sock_connected = at->modemConnect(host, port, mux, false); | ||||
|       at->writeChanges(); | ||||
|       at->exitCommand(); | ||||
|     } | ||||
|     sock_connected = at->modemConnect(host, port, mux, timeout); | ||||
|     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 | ||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode | ||||
|       sock_connected = at->modemConnect(ip, port, mux, false); | ||||
|       at->writeChanges(); | ||||
|       at->exitCommand(); | ||||
|     } | ||||
|     sock_connected = at->modemConnect(ip, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
|   virtual int connect(IPAddress ip, uint16_t port) { | ||||
|     return connect(ip, port, 75000L); | ||||
|   } | ||||
|  | ||||
|   virtual void stop() { | ||||
|     at->streamClear();  // Empty anything in the buffer | ||||
| @@ -196,12 +209,6 @@ public: | ||||
|     if (available()) { | ||||
|       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; | ||||
|   } | ||||
|   virtual operator bool() { return connected(); } | ||||
| @@ -230,23 +237,17 @@ 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 | ||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode | ||||
|       sock_connected = at->modemConnect(host, port, mux, true); | ||||
|       at->writeChanges(); | ||||
|       at->exitCommand(); | ||||
|     } | ||||
|     sock_connected = at->modemConnect(host, port, mux, true, timeout); | ||||
|     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 | ||||
|     if (at->commandMode())  {  // Don't try if we didn't successfully get into command mode | ||||
|       sock_connected = at->modemConnect(ip, port, mux, false); | ||||
|       at->writeChanges(); | ||||
|       at->exitCommand(); | ||||
|     } | ||||
|     sock_connected = at->modemConnect(ip, port, mux, timeout); | ||||
|     return sock_connected; | ||||
|   } | ||||
| }; | ||||
| @@ -294,20 +295,26 @@ public: | ||||
|       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 | ||||
|     bool ret_val = waitResponse() == 1; | ||||
|     ret_val &= writeChanges(); | ||||
|  | ||||
|     sendAT(GF("GT64")); // shorten the guard time to 100ms | ||||
|     ret_val &= waitResponse(); | ||||
|     ret_val &= writeChanges(); | ||||
|     ret_val &= waitResponse() == 1; | ||||
|     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"; | ||||
|  | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|  | ||||
|     return ret_val; | ||||
|   } | ||||
|  | ||||
| @@ -316,7 +323,7 @@ public: | ||||
|   } | ||||
|  | ||||
|   void setBaud(unsigned long baud) { | ||||
|     if (!commandMode()) return; | ||||
|     XBEE_COMMAND_START_DECORATOR(5, ) | ||||
|     switch(baud) | ||||
|     { | ||||
|       case 2400: sendAT(GF("BD1")); break; | ||||
| @@ -337,7 +344,7 @@ public: | ||||
|     } | ||||
|     waitResponse(); | ||||
|     writeChanges(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|   } | ||||
|  | ||||
|   bool testAT(unsigned long timeout = 10000L) { | ||||
| @@ -352,9 +359,8 @@ public: | ||||
|           sendAT(); | ||||
|           if (waitResponse(200) == 1) { | ||||
|               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; | ||||
|       } | ||||
|       delay(250); | ||||
| @@ -375,11 +381,11 @@ public: | ||||
|   } | ||||
|  | ||||
|   bool factoryDefault() { | ||||
|     if (!commandMode()) return false;  // Return immediately | ||||
|     XBEE_COMMAND_START_DECORATOR(5, false) | ||||
|     sendAT(GF("RE")); | ||||
|     bool ret_val = waitResponse() == 1; | ||||
|     ret_val &= writeChanges(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     // Make sure the guard time for the modem object is set back to default | ||||
|     // otherwise communication would fail after the reset | ||||
|     guardTime = 1010; | ||||
| @@ -387,14 +393,7 @@ public: | ||||
|   } | ||||
|  | ||||
|   String getModemInfo() { | ||||
|     String modemInf = ""; | ||||
|     if (!commandMode()) return modemInf;  // Try up to 10 times for the init | ||||
|  | ||||
|     sendAT(GF("HS"));  // Get the "Hardware Series" | ||||
|     modemInf += readResponseString(); | ||||
|  | ||||
|     exitCommand(); | ||||
|     return modemInf; | ||||
|     return sendATGetString(GF("HS")); | ||||
|   } | ||||
|  | ||||
|   bool hasSSL() { | ||||
| @@ -443,7 +442,9 @@ public: | ||||
|   } | ||||
|  | ||||
|   bool restart() { | ||||
|  | ||||
|     if (!commandMode()) return false;  // Return immediately | ||||
|  | ||||
|     if (beeType == XBEE_UNKNOWN) getSeries();  // how we restart depends on this | ||||
|  | ||||
|     if (beeType != XBEE_S6B_WIFI) { | ||||
| @@ -455,9 +456,10 @@ public: | ||||
|  | ||||
|     sendAT(GF("FR")); | ||||
|     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 | ||||
|     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 | ||||
|     for (unsigned long start = millis(); millis() - start < 60000L; ) { | ||||
| @@ -477,7 +479,7 @@ public: | ||||
|   } | ||||
|  | ||||
|   void setupPinSleep(bool maintainAssociation = false) { | ||||
|     if (!commandMode()) return;  // Return immediately | ||||
|     XBEE_COMMAND_START_DECORATOR(5, ) | ||||
|  | ||||
|     if (beeType == XBEE_UNKNOWN) getSeries();  // Command depends on series | ||||
|  | ||||
| @@ -496,7 +498,7 @@ public: | ||||
|     } | ||||
|  | ||||
|     writeChanges(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|   } | ||||
|  | ||||
|   bool poweroff() {  // Not supported | ||||
| @@ -516,19 +518,11 @@ public: | ||||
|   } | ||||
|  | ||||
|   String getSimCCID() { | ||||
|     if (!commandMode()) return "";  // Return immediately | ||||
|     sendAT(GF("S#")); | ||||
|     String res = readResponseString(); | ||||
|     exitCommand(); | ||||
|     return res; | ||||
|     return sendATGetString(GF("S#")); | ||||
|   } | ||||
|  | ||||
|   String getIMEI() { | ||||
|     if (!commandMode()) return "";  // Return immediately | ||||
|     sendAT(GF("IM")); | ||||
|     String res = readResponseString(); | ||||
|     exitCommand(); | ||||
|     return res; | ||||
|     return sendATGetString(GF("IM")); | ||||
|   } | ||||
|  | ||||
|   SimStatus getSimStatus(unsigned long timeout = 10000L) { | ||||
| @@ -537,10 +531,7 @@ public: | ||||
|  | ||||
|   RegStatus getRegistrationStatus() { | ||||
|  | ||||
|     bool wasInCommandMode = inCommandMode; | ||||
|     if (!wasInCommandMode) {  // don't re-enter command mode if already in it | ||||
|       commandMode(); | ||||
|     } | ||||
|     XBEE_COMMAND_START_DECORATOR(5, REG_UNKNOWN) | ||||
|  | ||||
|     if (!inCommandMode) return REG_UNKNOWN;  // Return immediately | ||||
|  | ||||
| @@ -619,18 +610,12 @@ public: | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (!wasInCommandMode) {  // only exit if we weren't in command mode | ||||
|       exitCommand(); | ||||
|     } | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return stat; | ||||
|   } | ||||
|  | ||||
|   String getOperator() { | ||||
|     if (!commandMode()) return "";  // Return immediately | ||||
|     sendAT(GF("MN")); | ||||
|     String res = readResponseString(); | ||||
|     exitCommand(); | ||||
|     return res; | ||||
|     return sendATGetString(GF("MN")); | ||||
|   } | ||||
|  | ||||
|  /* | ||||
| @@ -638,12 +623,17 @@ public: | ||||
|   */ | ||||
|  | ||||
|   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_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 | ||||
|     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 == XBEE_S6B_WIFI) return -93 + intRes;  // the maximum sensitivity is -93dBm | ||||
|     else return -1*intRes; // need to convert to negative number | ||||
| @@ -655,17 +645,14 @@ public: | ||||
|   } | ||||
|  | ||||
|   bool waitForNetwork(unsigned long timeout = 60000L) { | ||||
|     // Enter command mode at the start so we don't have to go in and out of it | ||||
|     // The cellular Bee's often freeze up and won't respond when attempting | ||||
|     // to enter command mode too many times. | ||||
|     commandMode(); | ||||
|     XBEE_COMMAND_START_DECORATOR(5, false) | ||||
|     for (unsigned long start = millis(); millis() - start < timeout; ) { | ||||
|       if (isNetworkConnected()) { | ||||
|         return true; | ||||
|       } | ||||
|       delay(250);  // per Neil H. - more stable with delay | ||||
|     } | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| @@ -675,7 +662,8 @@ public: | ||||
|  | ||||
|   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 | ||||
|     if (NULL == ssid ) return exitAndFail(); | ||||
|  | ||||
| @@ -693,19 +681,19 @@ public: | ||||
|     if (waitResponse() != 1) return exitAndFail(); | ||||
|  | ||||
|     if (!writeChanges()) return exitAndFail(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|  | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|   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 | ||||
|     // 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. | ||||
|     int8_t res = (1 == waitResponse(5000)); | ||||
|     writeChanges(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
| @@ -714,12 +702,12 @@ public: | ||||
|    */ | ||||
|  | ||||
|   String getLocalIP() { | ||||
|     if (!commandMode()) return "";  // Return immediately | ||||
|     XBEE_COMMAND_START_DECORATOR(5, "") | ||||
|     sendAT(GF("MY")); | ||||
|     String IPaddr; IPaddr.reserve(16); | ||||
|     // wait for the response - this response can be very slow | ||||
|     IPaddr = readResponseString(30000); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     IPaddr.trim(); | ||||
|     return IPaddr; | ||||
|   } | ||||
| @@ -733,23 +721,23 @@ public: | ||||
|    */ | ||||
|  | ||||
|   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 | ||||
|     waitResponse(); | ||||
|     bool success = waitResponse() == 1; | ||||
|     writeChanges(); | ||||
|     exitCommand(); | ||||
|     return true; | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return success; | ||||
|   } | ||||
|  | ||||
|   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 | ||||
|     int8_t res = (1 == waitResponse(5000)); | ||||
|     writeChanges(); | ||||
|     sendAT(GF("AM0"));  // Airplane mode off | ||||
|     waitResponse(5000); | ||||
|     writeChanges(); | ||||
|     exitCommand(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
| @@ -772,11 +760,14 @@ public: | ||||
|     if (waitResponse() !=1) return exitAndFail(); | ||||
|     sendAT(GF("TDD"));  // Set the text delimiter to the standard 0x0D (carriage return) | ||||
|     if (waitResponse() !=1) return exitAndFail(); | ||||
|     if (!writeChanges()) return exitAndFail(); | ||||
|  | ||||
|     if (!writeChanges()) return exitAndFail(); | ||||
|     // Get out of command mode to actually send the text | ||||
|     exitCommand(); | ||||
|  | ||||
|     streamWrite(text); | ||||
|     stream.write((char)0x0D);  // close off with the carriage return | ||||
|  | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
| @@ -800,16 +791,17 @@ public: | ||||
|  | ||||
| protected: | ||||
|  | ||||
|   IPAddress getHostIP(const char* host) { | ||||
|   IPAddress getHostIP(const char* host, int timeout = 45000L) { | ||||
|     String strIP; strIP.reserve(16); | ||||
|     unsigned long startMillis = millis(); | ||||
|     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 | ||||
|     // 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); | ||||
|       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.trim(); | ||||
|       if (!strIP.endsWith(GF("ERROR"))) { | ||||
| @@ -818,33 +810,44 @@ protected: | ||||
|       } | ||||
|       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); | ||||
|     } | ||||
|     else return IPAddress(0,0,0,0); | ||||
|   } | ||||
|  | ||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux = 0, bool ssl = false) { | ||||
|     // If requested host is the same as the previous one and we already | ||||
|     // have a valid IP address, we don't have to do anything. | ||||
|     if (this->savedHost == String(host) && savedIP != IPAddress(0,0,0,0)) { | ||||
|       return true; | ||||
|     } | ||||
|   bool modemConnect(const char* host, uint16_t port, uint8_t mux = 0, | ||||
|                     bool ssl = false, int timeout = 75000L) | ||||
|   { | ||||
|     unsigned long startMillis = millis(); | ||||
|     bool retVal = false; | ||||
|      XBEE_COMMAND_START_DECORATOR(5, false) | ||||
|  | ||||
|     // Otherwise, set the new host and mark the IP as invalid | ||||
|     this->savedHost = String(host); | ||||
|     savedIP = getHostIP(host);  // This will return 0.0.0.0 if lookup fails | ||||
|     // If it's a new host or we dont' have a good IP, we need to do a DNS | ||||
|     // search for the IP to connect to | ||||
|     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 (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 | ||||
|     bool success = true; | ||||
|     XBEE_COMMAND_START_DECORATOR(5, false) | ||||
|     String host; host.reserve(16); | ||||
|     host += ip[0]; | ||||
|     host += "."; | ||||
| @@ -853,6 +856,7 @@ protected: | ||||
|     host += ip[2]; | ||||
|     host += "."; | ||||
|     host += ip[3]; | ||||
|  | ||||
|     if (ssl) { | ||||
|       sendAT(GF("IP"), 4);  // Put in SSL over TCP communication mode | ||||
|       success &= (1 == waitResponse()); | ||||
| @@ -860,10 +864,21 @@ protected: | ||||
|       sendAT(GF("IP"), 1);  // Put in TCP mode | ||||
|       success &= (1 == waitResponse()); | ||||
|     } | ||||
|  | ||||
|     sendAT(GF("DL"), host);  // Set the "Destination Address Low" | ||||
|     success &= (1 == waitResponse()); | ||||
|     sendAT(GF("DE"), String(port, HEX));  // Set the destination port | ||||
|     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; | ||||
|   } | ||||
|  | ||||
| @@ -879,7 +894,7 @@ protected: | ||||
|   // as true so there's a possibility it's wrong. | ||||
|   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 (savedIP == IPAddress(0,0,0,0)) return false; | ||||
| @@ -898,14 +913,14 @@ protected: | ||||
|       case XBEE_S6B_WIFI: { | ||||
|         RegStatus s = getRegistrationStatus(); | ||||
|         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 | ||||
|       } | ||||
|       default: {  // Cellular XBee's | ||||
|         sendAT(GF("CI")); | ||||
|         int16_t intRes = readResponseInt(); | ||||
|         exitCommand(); | ||||
|         XBEE_COMMAND_END_DECORATOR | ||||
|         switch(intRes) { | ||||
|           case 0x00:  // 0x00 = The socket is definitely open | ||||
|           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) { | ||||
|  | ||||
|     // If we're already in command mode, move on | ||||
|     if (inCommandMode && (millis() - lastCommandModeMillis) < 10000L) return true; | ||||
|  | ||||
|     uint8_t triesMade = 0; | ||||
|     uint8_t triesUntilReset = 4;  // only reset after 4 failures | ||||
|     bool success = false; | ||||
|     streamClear();  // Empty everything in the buffer before starting | ||||
|  | ||||
|     while (!success and triesMade < retries) { | ||||
|       // 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 | ||||
| @@ -1036,7 +1056,11 @@ finish: | ||||
|       } | ||||
|       triesMade ++; | ||||
|     } | ||||
|     if (success) inCommandMode = true; | ||||
|  | ||||
|     if (success) { | ||||
|       inCommandMode = true; | ||||
|       lastCommandModeMillis = millis(); | ||||
|     } | ||||
|     return success; | ||||
|   } | ||||
|  | ||||
| @@ -1049,6 +1073,8 @@ finish: | ||||
|   } | ||||
|  | ||||
|   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 | ||||
|     waitResponse(); | ||||
|     inCommandMode = false; | ||||
| @@ -1083,6 +1109,14 @@ finish: | ||||
|     return intRes; | ||||
|   } | ||||
|  | ||||
|   String sendATGetString(GsmConstStr cmd) { | ||||
|     XBEE_COMMAND_START_DECORATOR(5, "") | ||||
|     sendAT(cmd); | ||||
|     String res = readResponseString(); | ||||
|     XBEE_COMMAND_END_DECORATOR | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   bool gotIPforSavedHost() { | ||||
|     if (savedHost != "" && savedIP != IPAddress(0,0,0,0)) return true; | ||||
|     else return false; | ||||
| @@ -1098,6 +1132,7 @@ protected: | ||||
|   IPAddress     savedIP; | ||||
|   String        savedHost; | ||||
|   bool          inCommandMode; | ||||
|   uint32_t      lastCommandModeMillis; | ||||
|   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 | ||||
| // converting said IP address to text | ||||
| #define TINY_GSM_CLIENT_CONNECT_TO_IP() \ | ||||
|   virtual int connect(IPAddress ip, uint16_t port) { \ | ||||
| #define TINY_GSM_CLIENT_CONNECT_OVERLOADS() \ | ||||
|   virtual int connect(IPAddress ip, uint16_t port, int timeout) { \ | ||||
|     String host; host.reserve(16); \ | ||||
|     host += ip[0]; \ | ||||
|     host += "."; \ | ||||
| @@ -211,7 +211,13 @@ String TinyGsmDecodeHex16bit(String &instr) { | ||||
|     host += ip[2]; \ | ||||
|     host += "."; \ | ||||
|     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