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:205
 
#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:110
 
#define WS_DEBUG_PRINT(...)
Prints debug output. 
Definition: Wippersnapper.h:51
 
#define WS_DEBUG_PRINTHEX(...)
Prints debug output. 
Definition: Wippersnapper.h:57
 
secretsConfig _config
Definition: Wippersnapper.h:408
 
#define WL_MAC_ADDR_LENGTH
MAC address length - from RP2040 BSP. 
Definition: Wippersnapper_Networking.h:20
 
ws_status_t
Definition: Wippersnapper.h:192
 
virtual bool check_valid_ssid()
Performs a scan of local WiFi networks. 
Definition: Wippersnapper.cpp:250
 
Class that provides storage and functions for the Adafruit IO Wippersnapper interface. 
Definition: Wippersnapper.h:285
 
virtual void _connect()
Connects to wireless network. 
Definition: Wippersnapper.cpp:164
 
#define WS_MAX_ALT_WIFI_NETWORKS
Maximum number of alternative networks. 
Definition: Wippersnapper.h:253
 
virtual void getMacAddr()
Sets the network interface's unique identifier, typically the MAC address. 
Definition: Wippersnapper.cpp:183
 
virtual void set_ssid_pass()
Sets the device's wireless network credentials from the secrets.json configuration file...
Definition: Wippersnapper.cpp:240
 
void feedWDT()
Feeds the WDT to prevent hardware reset. 
Definition: Wippersnapper.cpp:2632
 
bool _isWiFiMulti
Definition: Wippersnapper.h:410
 
networkConfig _multiNetworks[3]
Definition: Wippersnapper.h:409
 
#define WS_DEBUG_PRINTLN(...)
Prints line from debug output. 
Definition: Wippersnapper.h:54
 
#define WS_DELAY_WITH_WDT(timeout)
Delay function. 
Definition: Wippersnapper.h:67
 
Wippersnapper WS
Definition: Wippersnapper.cpp:36
 
uint8_t _macAddr[6]
Definition: Wippersnapper.h:403
 
Adafruit_MQTT * _mqtt
Definition: Wippersnapper.h:406
 
virtual ws_status_t networkStatus()
Returns the network's connection status. 
Definition: Wippersnapper.cpp:215
 
virtual int32_t getRSSI()
Gets the network's RSSI. 
Definition: Wippersnapper.cpp:193
 
virtual void _disconnect()
Disconnect Wippersnapper MQTT session and network. 
Definition: Wippersnapper.cpp:173