Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Consultem periòdicament una pàgina web

En aquest cas el nostre microcontrolador es connectarà a una xarxa existent i demanarà periòdicament una pàgina a un servidor connectat al web.

La pàgina sol·licitada serà https://www.google.cat/search?q=etseib.

L'exemple que consulta una pàgina web no ens serveix perquè està pensat per llegir la pàgina un sol cop. En el programa següent hem fet algunes variacions respecte al que hem commentat per aconseguir fer les lectures periòdiques.

// Aquest programa està parcialment basat en els exemples de la pàgina
// https://www.arduino.cc/en/Tutorial/LibraryExamples#wifi1010
#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
const char idXarxa[] = "xarxa-wifi";    // Nom del punt d'accés 
const char contrasenya[] = "contrasenya-wifi";    // Contrasenya de connexió 
unsigned long darreraConnexio = 0;
const unsigned long periodeConnexio = 10000UL;
int status = WL_IDLE_STATUS;
char server[] = "www.google.cat";    // Servidor al que ens connectarem
char pagina[] = "/search?q=etseib";    // Pàgina que volem demanar
WiFiClient client;
void setup() {    // Inicialització
    Serial.begin(9600);    // Monitor sèrie
    while (!Serial) {
        ;    // Esperem que l'usuari obri el monitor sèrie
    }
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("No s'ha trobat el dispositiu Wi-Fi");
        while (true);    // Bloquegem el programa
    }
    String versio = WiFi.firmwareVersion();
    if (versio < "1.0.0") {
        Serial.println("Convindria actualitzar el firmware");
    }
    while (status != WL_CONNECTED) {
        Serial.print("Connectant a la xarxa ");
        Serial.println(idXarxa);
        status = WiFi.begin(idXarxa, contrasenya);
        delay(10000);    // Ho tornarem a intentar passats 10 s
    }
    Serial.print("Connectat a "); 
    Serial.println(WiFi.SSID());
    Serial.print("Estat de la connexió: ");
    Serial.println(WiFi.status()); 
    Serial.print("Adreça IP del dispositiu: ");
    Serial.println(WiFi.localIP()); 
    Serial.print("Intensitat del senyal: ");
    Serial.print(WiFi.RSSI()); 
    Serial.println(" dBm");
    Serial.println(); 
    Serial.println("Anem a connectar al servidor");
}
void loop() {    // Programa que es repeteix indefinidament
    while (client.available()) {
        char c = client.read();    // Rebem caràcters del servidor
        Serial.write(c);
    }
    if (millis() - darreraConnexio > periodeConnexio) {
        client.stop();
        if (client.connect(server, 80)) {    // Si ho hem aconseguit
            Serial.println("S'ha fet la connexió al servidor");
            client.print("GET ");
            client.print(pagina);
            client.println(" HTTP/1.1");
            client.print("Host: ");
            client.println(server);
            client.println("Connection: close");
            client.println();
            // Guardem quan hem fet la connexió
            darreraConnexio = millis();
        } else {
            Serial.println("connection failed");
        }
    }
}

En aquest programa hi ha la condició que el monitor sèrie estigui obert per a que el programa comenci a funcionar. Això ens permet seguir tot el procés encara que triguem a obrir el monitor sèrie. Quan el microcontrolador hagi de funcionar de manera independent de l'ordinador caldrà eliminar les línies següents per evitar aquest bloqueig.

    while (!Serial) {
        ;    // Esperem que l'usuari obri el monitor sèrie
    }

La petició que hem fet ha estat fent servir el protocol http (sense encriptació). La majoria de servidors ja no admeten el protocol http i demanen que sempre es faci servir un protocol segur (https), en aquest cas obtindríem una resposta en la que se'ns indicaria que aquesta pàgina s'ha mogut a un servidor https (encriptat) i no ens tornarà la informació.

Llavors hauríem de fer la petició fent servir un protocol segur SSL. En aquest cas caldria modificar les línies marcades en groc tal com es mostra a continuació (cada una al seu lloc).

WiFiSSLClient client;

    if (client.connect(server, 443)) {

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.