17 #ifndef WS_NETWORKING_PICO_H 18 #define WS_NETWORKING_PICO_H 20 #ifdef ARDUINO_ARCH_RP2040 22 #define PICO_CONNECT_TIMEOUT_MS 20000 23 #define PICO_CONNECT_RETRY_DELAY_MS 200 25 #include "Wippersnapper.h" 27 #include "Adafruit_MQTT.h" 28 #include "Adafruit_MQTT_Client.h" 30 #include <WiFiClient.h> 31 #include <WiFiClientSecure.h> 57 ~ws_networking_pico() {
58 if (_mqtt_client_secure)
59 delete _mqtt_client_secure;
60 if (_mqtt_client_secure)
61 delete _mqtt_client_secure;
73 void set_ssid_pass(
const char *ssid,
const char *ssidPassword) {
78 if ((ssidPassword != NULL) && (strlen(ssidPassword) == 0)) {
91 _ssid = WS.
_config.network.ssid;
92 _pass = WS.
_config.network.pass;
109 int n = WiFi.scanNetworks();
115 bool foundNetwork =
false;
118 for (uint8_t i = 0; i < n; i++) {
119 if (!foundNetwork && strcmp(WiFi.SSID(i), _ssid) == 0) {
132 WiFi.BSSID(i, BSSID);
158 uint8_t mac[6] = {0};
159 WiFi.macAddress(mac);
160 memcpy(WS.
_macAddr, mac,
sizeof(mac));
169 int32_t
getRSSI() {
return WiFi.RSSI(); }
179 if (strcmp(WS.
_config.aio_url,
"io.adafruit.com") == 0 ||
180 strcmp(WS.
_config.aio_url,
"io.adafruit.us") == 0) {
181 _mqtt_client_secure =
new WiFiClientSecure();
182 _mqtt_client_secure->setCACert(
183 strcmp(WS.
_config.aio_url,
"io.adafruit.com") == 0
185 : _aio_root_ca_staging);
186 WS.
_mqtt =
new Adafruit_MQTT_Client(
187 _mqtt_client_secure, WS.
_config.aio_url, WS.
_config.io_port, clientID,
190 _mqtt_client_insecure =
new WiFiClient();
191 WS.
_mqtt =
new Adafruit_MQTT_Client(
204 switch (WiFi.status()) {
206 return WS_NET_CONNECTED;
207 case WL_CONNECT_FAILED:
208 return WS_NET_CONNECT_FAILED;
212 return WS_NET_DISCONNECTED;
222 const char *connectionType() {
return "Pico"; }
228 *_mqtt_client_insecure;
230 *_mqtt_client_secure;
231 WiFiMulti _wifiMulti;
233 const char *_aio_root_ca_staging =
234 "-----BEGIN CERTIFICATE-----\n" 235 "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\n" 236 "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\n" 237 "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\n" 238 "WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\n" 239 "ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\n" 240 "MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\n" 241 "h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n" 242 "0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\n" 243 "A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\n" 244 "T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\n" 245 "B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\n" 246 "B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\n" 247 "KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\n" 248 "OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\n" 249 "jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\n" 250 "qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\n" 251 "rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n" 252 "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\n" 253 "hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\n" 254 "ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n" 255 "3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\n" 256 "NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\n" 257 "ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\n" 258 "TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\n" 259 "jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\n" 260 "oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n" 261 "4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\n" 262 "mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\n" 263 "emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n" 264 "-----END CERTIFICATE-----\n";
266 const char *_aio_root_ca_prod =
267 "-----BEGIN CERTIFICATE-----\n" 268 "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n" 269 "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" 270 "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n" 271 "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n" 272 "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" 273 "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n" 274 "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n" 275 "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n" 276 "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n" 277 "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n" 278 "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n" 279 "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n" 280 "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n" 281 "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n" 282 "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n" 283 "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n" 284 "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n" 285 "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n" 286 "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n" 287 "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n" 288 "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n" 289 "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n" 290 "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n" 291 "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n" 292 "7h4SeM6Y8l/7MBRpPCz6l8Y=\n" 293 "-----END CERTIFICATE-----\n";
302 if (WiFi.status() == WL_CONNECTED)
307 WiFi.setTimeout(20000);
310 if (strlen(_ssid) == 0) {
311 _status = WS_SSID_INVALID;
318 _wifiMulti.clearAPList();
320 _wifiMulti.addAP(_ssid, _pass);
327 if (_wifiMulti.run(20000) == WL_CONNECTED) {
329 _status = WS_NET_CONNECTED;
334 WiFi.begin(_ssid, _pass);
339 []() ->
int {
return WiFi.status(); },
342 [](
int status) {
return status == WL_CONNECTED; },
343 PICO_CONNECT_TIMEOUT_MS,
344 PICO_CONNECT_RETRY_DELAY_MS);
346 if (lastResult == WL_CONNECTED) {
347 _status = WS_NET_CONNECTED;
353 _status = WS_NET_DISCONNECTED;
370 #endif // ARDUINO_ARCH_RP2040 371 #endif // WS_NETWORKING_PICO_H virtual void setupMQTTClient(const char *clientID)
Sets up the MQTT client session.
Definition: Wippersnapper.cpp:203
#define RETRY_FUNCTION_UNTIL_TIMEOUT(func, result_type, result_var, condition, timeout, interval,...)
Retry a function until a condition is met or a timeout is reached.
Definition: Wippersnapper.h:108
#define WS_DEBUG_PRINT(...)
Prints debug output.
Definition: Wippersnapper.h:49
#define WS_DEBUG_PRINTHEX(...)
Prints debug output.
Definition: Wippersnapper.h:55
secretsConfig _config
Definition: Wippersnapper.h:406
#define WL_MAC_ADDR_LENGTH
MAC address length - from RP2040 BSP.
Definition: Wippersnapper_Networking.h:20
ws_status_t
Definition: Wippersnapper.h:190
virtual bool check_valid_ssid()
Performs a scan of local WiFi networks.
Definition: Wippersnapper.cpp:248
Class that provides storage and functions for the Adafruit IO Wippersnapper interface.
Definition: Wippersnapper.h:283
virtual void _connect()
Connects to wireless network.
Definition: Wippersnapper.cpp:162
#define WS_MAX_ALT_WIFI_NETWORKS
Maximum number of alternative networks.
Definition: Wippersnapper.h:251
virtual void getMacAddr()
Sets the network interface's unique identifer, typically the MAC address.
Definition: Wippersnapper.cpp:181
virtual void set_ssid_pass()
Sets the device's wireless network credentials from the secrets.json configuration file...
Definition: Wippersnapper.cpp:238
void feedWDT()
Feeds the WDT to prevent hardware reset.
Definition: Wippersnapper.cpp:2608
bool _isWiFiMulti
Definition: Wippersnapper.h:408
networkConfig _multiNetworks[3]
Definition: Wippersnapper.h:407
#define WS_DEBUG_PRINTLN(...)
Prints line from debug output.
Definition: Wippersnapper.h:52
#define WS_DELAY_WITH_WDT(timeout)
Delay function.
Definition: Wippersnapper.h:65
Wippersnapper WS
Definition: Wippersnapper.cpp:36
uint8_t _macAddr[6]
Definition: Wippersnapper.h:401
Adafruit_MQTT * _mqtt
Definition: Wippersnapper.h:404
virtual ws_status_t networkStatus()
Returns the network's connection status.
Definition: Wippersnapper.cpp:213
virtual int32_t getRSSI()
Gets the network's RSSI.
Definition: Wippersnapper.cpp:191
virtual void _disconnect()
Disconnect Wippersnapper MQTT session and network.
Definition: Wippersnapper.cpp:171