From 2f38268dcd3de201a529236a1e8e9de136dbc01d Mon Sep 17 00:00:00 2001 From: paulvha Date: Fri, 16 Feb 2024 17:51:58 +0100 Subject: [PATCH 1/7] add ping --- .../WiFiS3/examples/WiFiPing/WiFiPing.ino | 124 ++++++++++++++++++ .../examples/WiFiPing/arduino_secrets.h | 2 + libraries/WiFiS3/src/WiFi.cpp | 17 +++ libraries/WiFiS3/src/WiFi.h | 5 + 4 files changed, 148 insertions(+) create mode 100755 libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino create mode 100755 libraries/WiFiS3/examples/WiFiPing/arduino_secrets.h diff --git a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino new file mode 100755 index 000000000..6aa00e6da --- /dev/null +++ b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino @@ -0,0 +1,124 @@ +/* + Web ICMP Ping + + This sketch pings a device based on the IP address or the hostname + using the WiFi module. By default the attempt is performed 5 times, but can + be changed to max. 255 + + It requires the latest USB Wifi bridge firmware level and WiFiS3 library. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the WiFi.begin() call accordingly. + + created 14 February 2024 + by paulvha + + */ + +#include "WiFiS3.h" +#include "arduino_secrets.h" + +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +/* -------------------------------------------------------------------------- */ +void setup() { +/* -------------------------------------------------------------------------- */ + //Initialize serial and wait for port to open: + Serial.begin(115200); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed. freeze !"); + // don't continue + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade to the WiFi USB bridge firmware. freeze !"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + + printWifiStatus(); +} + +/* -------------------------------------------------------------------------- */ +void loop() { +/* -------------------------------------------------------------------------- */ + + // Ping IP + const IPAddress remote_ip(140,82,121,4); + Serial.print("Trying to ping github.com on IP: "); + Serial.println(remote_ip); + + // using default ping count of 5 + float res = WiFi.ping(remote_ip); + + if (res != 0) { + Serial.print("Pin average response time: "); + Serial.print(res); + Serial.println(" ms"); + } + else { + Serial.println("Timeout on IP!"); + } + + // Ping Host + const char* remote_host = "www.google.com"; + Serial.print("Trying to ping host: "); + Serial.println(remote_host); + + // setting ping count to 10 instead of default 5 + float res1 = WiFi.ping(remote_host,10); + + if (res1 != 0) { + Serial.print("Pin average response time: "); + Serial.print(res1); + Serial.println(" ms"); + } + else { + Serial.println("Timeout on host!"); + } + + Serial.println(); + delay(1000); +} + +/* -------------------------------------------------------------------------- */ +void printWifiStatus() { +/* -------------------------------------------------------------------------- */ + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/WiFiS3/examples/WiFiPing/arduino_secrets.h b/libraries/WiFiS3/examples/WiFiPing/arduino_secrets.h new file mode 100755 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFiS3/examples/WiFiPing/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFiS3/src/WiFi.cpp b/libraries/WiFiS3/src/WiFi.cpp index 0717f6731..b4e000d71 100644 --- a/libraries/WiFiS3/src/WiFi.cpp +++ b/libraries/WiFiS3/src/WiFi.cpp @@ -561,6 +561,23 @@ void CWifi::setTimeout(unsigned long timeout) { _timeout = timeout; } +/* -------------------------------------------------------------------------- */ +float CWifi::ping(IPAddress ip, unsigned int count) { +/* -------------------------------------------------------------------------- */ + return ping(ip.toString().c_str(), count); +} + +/* -------------------------------------------------------------------------- */ +float CWifi::ping(const char* host, unsigned int count) { +/* -------------------------------------------------------------------------- */ + modem.begin(); + string res = ""; + if (modem.write(string(PROMPT(_PINGNAME)),res, "%s,%s,%d\r\n", CMD_WRITE(_PINGNAME), host, count)) { + String rsl = res.c_str(); + return rsl.toFloat(); + } + return 0; +} CWifi WiFi; diff --git a/libraries/WiFiS3/src/WiFi.h b/libraries/WiFiS3/src/WiFi.h index 8a50f4178..9fd1f3256 100644 --- a/libraries/WiFiS3/src/WiFi.h +++ b/libraries/WiFiS3/src/WiFi.h @@ -58,6 +58,11 @@ class CWifi { */ static const char* firmwareVersion(); + /* + * PING + */ + float ping(IPAddress ip, unsigned int count = 5); + float ping(const char* host, unsigned int count = 5); /* * Start WiFi connection for OPEN networks From 7af8623e3c0a932044f26af3239fc3b7be62387a Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 21 Nov 2024 18:06:52 +0100 Subject: [PATCH 2/7] ping: fix alignment --- libraries/WiFiS3/src/WiFi.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/WiFiS3/src/WiFi.cpp b/libraries/WiFiS3/src/WiFi.cpp index b4e000d71..7413707b0 100644 --- a/libraries/WiFiS3/src/WiFi.cpp +++ b/libraries/WiFiS3/src/WiFi.cpp @@ -564,19 +564,19 @@ void CWifi::setTimeout(unsigned long timeout) { /* -------------------------------------------------------------------------- */ float CWifi::ping(IPAddress ip, unsigned int count) { /* -------------------------------------------------------------------------- */ - return ping(ip.toString().c_str(), count); + return ping(ip.toString().c_str(), count); } /* -------------------------------------------------------------------------- */ float CWifi::ping(const char* host, unsigned int count) { /* -------------------------------------------------------------------------- */ - modem.begin(); - string res = ""; - if (modem.write(string(PROMPT(_PINGNAME)),res, "%s,%s,%d\r\n", CMD_WRITE(_PINGNAME), host, count)) { - String rsl = res.c_str(); - return rsl.toFloat(); - } - return 0; + modem.begin(); + string res = ""; + if (modem.write(string(PROMPT(_PING)), res, "%s,%s,%d\r\n", CMD_WRITE(_PING), host, count)) { + String rsl = res.c_str(); + return rsl.toFloat(); + } + return 0; } CWifi WiFi; From 46e6416a957ec0bf17779e883362cf1a72d8c8c0 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 22 Nov 2024 11:46:09 +0100 Subject: [PATCH 3/7] ping: make api compatible to WiFiNINA and WiFi101 --- libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino | 16 ++++++++-------- libraries/WiFiS3/src/WiFi.cpp | 14 +++++++------- libraries/WiFiS3/src/WiFi.h | 4 ++-- libraries/WiFiS3/src/WiFiTypes.h | 7 +++++++ 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino index 6aa00e6da..37fcc418b 100755 --- a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino +++ b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino @@ -71,11 +71,11 @@ void loop() { Serial.print("Trying to ping github.com on IP: "); Serial.println(remote_ip); - // using default ping count of 5 - float res = WiFi.ping(remote_ip); + // using default ping count of 1 + int res = WiFi.ping(remote_ip); - if (res != 0) { - Serial.print("Pin average response time: "); + if (res > 0) { + Serial.print("Ping response time: "); Serial.print(res); Serial.println(" ms"); } @@ -88,11 +88,11 @@ void loop() { Serial.print("Trying to ping host: "); Serial.println(remote_host); - // setting ping count to 10 instead of default 5 - float res1 = WiFi.ping(remote_host,10); + // setting ttl to 128 and ping count to 10 + int res1 = WiFi.ping(remote_host, 128, 10); - if (res1 != 0) { - Serial.print("Pin average response time: "); + if (res1 > 0) { + Serial.print("Ping average response time: "); Serial.print(res1); Serial.println(" ms"); } diff --git a/libraries/WiFiS3/src/WiFi.cpp b/libraries/WiFiS3/src/WiFi.cpp index 7413707b0..2599b578c 100644 --- a/libraries/WiFiS3/src/WiFi.cpp +++ b/libraries/WiFiS3/src/WiFi.cpp @@ -562,21 +562,21 @@ void CWifi::setTimeout(unsigned long timeout) { } /* -------------------------------------------------------------------------- */ -float CWifi::ping(IPAddress ip, unsigned int count) { +int CWifi::ping(IPAddress ip, uint8_t ttl, uint8_t count) { /* -------------------------------------------------------------------------- */ - return ping(ip.toString().c_str(), count); + return ping(ip.toString().c_str(), ttl, count); } /* -------------------------------------------------------------------------- */ -float CWifi::ping(const char* host, unsigned int count) { +int CWifi::ping(const char* host, uint8_t ttl, uint8_t count) { /* -------------------------------------------------------------------------- */ + int ret = WL_PING_ERROR; modem.begin(); string res = ""; - if (modem.write(string(PROMPT(_PING)), res, "%s,%s,%d\r\n", CMD_WRITE(_PING), host, count)) { - String rsl = res.c_str(); - return rsl.toFloat(); + if (modem.write(string(PROMPT(_PING)), res, "%s,%s,%d,%d\r\n", CMD_WRITE(_PING), host, ttl, count)) { + ret = atoi(res.c_str()); } - return 0; + return ret; } CWifi WiFi; diff --git a/libraries/WiFiS3/src/WiFi.h b/libraries/WiFiS3/src/WiFi.h index 9fd1f3256..356bc1e47 100644 --- a/libraries/WiFiS3/src/WiFi.h +++ b/libraries/WiFiS3/src/WiFi.h @@ -61,8 +61,8 @@ class CWifi { /* * PING */ - float ping(IPAddress ip, unsigned int count = 5); - float ping(const char* host, unsigned int count = 5); + int ping(IPAddress ip, uint8_t ttl = 128, uint8_t count = 1); + int ping(const char* host, uint8_t ttl = 128, uint8_t count = 1); /* * Start WiFi connection for OPEN networks diff --git a/libraries/WiFiS3/src/WiFiTypes.h b/libraries/WiFiS3/src/WiFiTypes.h index 70be019a5..d72acd95a 100644 --- a/libraries/WiFiS3/src/WiFiTypes.h +++ b/libraries/WiFiS3/src/WiFiTypes.h @@ -31,4 +31,11 @@ enum wl_enc_type { ENC_TYPE_UNKNOWN = 255 }; +typedef enum { + WL_PING_DEST_UNREACHABLE = -1, + WL_PING_TIMEOUT = -2, + WL_PING_UNKNOWN_HOST = -3, + WL_PING_ERROR = -4 +} wl_ping_result_t; + #endif \ No newline at end of file From 030bdf82b36512f8d53f0ee06092b53bd2c2777d Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 22 Nov 2024 11:47:58 +0100 Subject: [PATCH 4/7] ping: fix timeout in case of count > 1 --- libraries/WiFiS3/src/WiFi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/WiFiS3/src/WiFi.cpp b/libraries/WiFiS3/src/WiFi.cpp index 2599b578c..a7f5047e2 100644 --- a/libraries/WiFiS3/src/WiFi.cpp +++ b/libraries/WiFiS3/src/WiFi.cpp @@ -572,10 +572,13 @@ int CWifi::ping(const char* host, uint8_t ttl, uint8_t count) { /* -------------------------------------------------------------------------- */ int ret = WL_PING_ERROR; modem.begin(); + /* ping timeout is 1s and interval another 1s */ + modem.timeout((count * 2000) + MODEM_TIMEOUT); string res = ""; if (modem.write(string(PROMPT(_PING)), res, "%s,%s,%d,%d\r\n", CMD_WRITE(_PING), host, ttl, count)) { ret = atoi(res.c_str()); } + modem.timeout(MODEM_TIMEOUT); return ret; } From fec1109b3d21ddd204ac5de2ce13aeaff34e4ee6 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 22 Nov 2024 15:46:20 +0100 Subject: [PATCH 5/7] ping: add missing method --- libraries/WiFiS3/src/WiFi.cpp | 7 +++++++ libraries/WiFiS3/src/WiFi.h | 1 + 2 files changed, 8 insertions(+) diff --git a/libraries/WiFiS3/src/WiFi.cpp b/libraries/WiFiS3/src/WiFi.cpp index a7f5047e2..0a3a80c86 100644 --- a/libraries/WiFiS3/src/WiFi.cpp +++ b/libraries/WiFiS3/src/WiFi.cpp @@ -567,6 +567,13 @@ int CWifi::ping(IPAddress ip, uint8_t ttl, uint8_t count) { return ping(ip.toString().c_str(), ttl, count); } +/* -------------------------------------------------------------------------- */ +int CWifi::ping(const String &hostname, uint8_t ttl, uint8_t count) +/* -------------------------------------------------------------------------- */ +{ + return ping(hostname.c_str(), ttl); +} + /* -------------------------------------------------------------------------- */ int CWifi::ping(const char* host, uint8_t ttl, uint8_t count) { /* -------------------------------------------------------------------------- */ diff --git a/libraries/WiFiS3/src/WiFi.h b/libraries/WiFiS3/src/WiFi.h index 356bc1e47..bbacc5f13 100644 --- a/libraries/WiFiS3/src/WiFi.h +++ b/libraries/WiFiS3/src/WiFi.h @@ -62,6 +62,7 @@ class CWifi { * PING */ int ping(IPAddress ip, uint8_t ttl = 128, uint8_t count = 1); + int ping(const String &hostname, uint8_t ttl = 128, uint8_t count = 1); int ping(const char* host, uint8_t ttl = 128, uint8_t count = 1); /* From 4974e2f4be5a6de7ca569e2192a679bf71cfdb0a Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 27 Nov 2024 10:34:59 +0100 Subject: [PATCH 6/7] WiFiPing: add info about minimum required firmware version --- libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino index 37fcc418b..4103c6713 100755 --- a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino +++ b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino @@ -5,7 +5,7 @@ using the WiFi module. By default the attempt is performed 5 times, but can be changed to max. 255 - It requires the latest USB Wifi bridge firmware level and WiFiS3 library. + It requires at least version 0.5.0 of USB Wifi bridge firmware and WiFiS3 library. This example is written for a network using WPA encryption. For WEP or WPA, change the WiFi.begin() call accordingly. @@ -81,6 +81,7 @@ void loop() { } else { Serial.println("Timeout on IP!"); + Serial.println("Make sure your WiFi firmware version is greater than 0.5.0"); } // Ping Host @@ -98,6 +99,7 @@ void loop() { } else { Serial.println("Timeout on host!"); + Serial.println("Make sure your WiFi firmware version is greater than 0.5.0"); } Serial.println(); From 3a81b22f29f67da0045e2c111fc66fd57ddf43af Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 27 Nov 2024 10:35:52 +0100 Subject: [PATCH 7/7] WiFiPing: remove WIFI_FIRMWARE_LATEST_VERSION check --- libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino index 4103c6713..248098dcb 100755 --- a/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino +++ b/libraries/WiFiS3/examples/WiFiPing/WiFiPing.ino @@ -36,14 +36,7 @@ void setup() { // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { - Serial.println("Communication with WiFi module failed. freeze !"); - // don't continue - while (true); - } - - String fv = WiFi.firmwareVersion(); - if (fv < WIFI_FIRMWARE_LATEST_VERSION) { - Serial.println("Please upgrade to the WiFi USB bridge firmware. freeze !"); + Serial.println("Communication with WiFi module failed."); // don't continue while (true); }