Libreria "RestClient.h" - fallos esporadicos de conexión

Buenas tardes.

He implementado un codigo, que utilizandio POST, GET,... consulto datos, modifico registros y añado información a una base de datos de un servidor a traves de un web service.
Utilizo la libreria "RestClient.h"

Todo funciona, pero alguna vez, muchas, demasiadas, no obtengo los datos de confirmación o los datos consultados. Pude hacer bien la consulta o actualización bien tres veces seguidas y fallar las dos siguientes, ho no responder (no recivo ningun dato del servidor), y la siguente consulta funciona bien. No sé porque me pasa y tampoco como localizar el problema. El Web service, funciona bien, está comprobado con una aplicación en VB, en la aplicacion VB no falla. La conexión a la red, es buena y no falla.

¿Alguna idea?

En el código verán que utilizo el <avr/wdt.h> para solucionar si el programa no responde y así lo reseteo, pero no es una buena solución!!!

Lo estoy ejecutando en un Arduino Mega 2560 R3 y una shild Ethernet, voy sobrado de memoria!!! La conexión a la red es por cable.
Grácias.

#include <Ethernet.h>
#include <SPI.h>
#include "RestClient.h"
#include <avr/wdt.h>   // Control de prenjades.

RestClient client = RestClient("dades.yyyyyyyy.cat");

int idSonda  = 1012;                        // Id de la Sonda, cada sonda ha de portar un Id Unica

int OpenClose = 0;                         // Aquest var indicarà si hem d'obrir el relé o no 0=No 1=Si
int TempsEntreLectures = 1;       // Si son Portes son segons, si son sondes son minuts
int OnOff = 0;                                // 0= no gravem 1=si gravem
int TimeOpen = 500;                   // Temps que tindrem el relé activat 1000 =1segons

char userMySQL[] = "yyyyyyyy";              // MySQL user login username
char passwordMySQL[] = "xxxxxx";        // MySQL user login password

    


void setup() 
  {
  //Autoreset
  wdt_enable(WDTO_8S);  //8segons es el màxim !!!
  //Fi autorreset
  Serial.begin(9600);
  Serial.println();
  Serial.println("Iniciant SETUP...");
  ActivarRele(0);  //Assegurem que el relé està tancat amb un 0.   
  Serial.print("Idsonda:"); Serial.println(idSonda);
  wdt_reset();
  Serial.println("Connectant a la xarxa...");
  client.dhcp();
  wdt_reset();
  LlegirMySQL();
  wdt_reset();
  Serial.println("Fi SETUP");
  Serial.println("*****************");
  delay(1000);
  }


void loop() 
  {
  wdt_reset();
  LlegirMySQL();
  wdt_reset();
  wdt_reset();
  if (OpenClose == 1)
    {
    //Canvia l'estat del rele
    wdt_reset();
    ActivarRele(1);  //Activem el relé amb 1.   
    wdt_reset();
    if (OnOff == 1) 
      {
      ActualitzaMySQL(idSonda, "Pt", 0);  //Canviem l'estat del relé a la BD --> idsonda, tipus de sonda, valor a gravar 
      wdt_reset();
      RegistreMySQL(idSonda, "Pt", 0);    //Creem registre de tracevilitat.
      }
    }
  wdt_disable();
  // Temps que esperem entre captura i captura, en minuts--------------------    
  Esperem (TempsEntreLectures); //esperem 1, 10 minut,...
  // Fi espera entre dades---------------------------------------------------  
  wdt_enable(WDTO_4S);     //wdt_enable(WDTO_8S);
  
  }

//PUT  actualitzar registres dades a la taula de "sondes"
void ActualitzaMySQL(int idSondaSQL, char IdTipusSondaSQL[], float ValorSQL)
  {
  int Control = 0 ;
  String response; 
  char idSondaInsertat[6];
  char ValorInsertar[6];  


  Serial.println(" -> Actualitzant dades al MySQL...");
  dtostrf( idSondaSQL , 1, 0, idSondaInsertat);   // zero decimals
  dtostrf( ValorSQL , 1, 0, ValorInsertar);   // dos decimals
 
  char INSERT_POST[] = "/GesRegistresAPI/api/config/1001?";
  char INSERT_BODY[] = "nomUsuari=yyyyyyyy&passwordUsuari=xxxxxx&idSonda=%s&OpenClose=%s&_method=PUT";
  char query[128];

  Repetim:
  sprintf(query, INSERT_BODY,idSondaInsertat,ValorInsertar);         
  Serial.println(query);

  //PUT
  Serial.println(" -> PUT:");  
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  int statusCode = client.post(INSERT_POST, query, &response);      
  Serial.print("Status code from server: ");
  Serial.println(statusCode);
  if (statusCode != 200) Control++;
  Serial.print("Response body from server: ");
  Serial.println(response);
  if ((statusCode != 200) && ( Control <3)) goto Repetim;
  Serial.println("------------------"); 
  delay(500);   
  }

//POST
void RegistreMySQL(int idSondaSQL, char IdTipusSondaSQL[], float ValorSQL)
//void RegistreMySQL()
  {
  int Control = 0;
  String response; 
  char idSondaInsertat[6];
  char ValorInsertar[6];  

  Serial.println(" -> Gravan registre nou al MySQL...");
  dtostrf( idSondaSQL , 1, 0, idSondaInsertat);   // zero decimals
  dtostrf( ValorSQL , 1, 2, ValorInsertar);   // dos decimals
  
  char INSERT_POST[] = "/GesRegistresAPI/api/registres ";                                                 // <-- *** Línea modificada ***
  char INSERT_BODY[] = "nomUsuari=yyyyyyyy&passwordUsuari=xxxxxx&idSonda=%s&idTipusSonda=%s&valor=%s";  // <-- *** Línea añadida ***
  char query[128];

  Repetim:  
  sprintf(query, INSERT_BODY, idSondaInsertat, "Pt", ValorInsertar);           
  Serial.println(query);

  //POST
  Serial.println(" -> POST:");  
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  int statusCode = client.post(INSERT_POST, query, &response);      
  Serial.print("Status code from server: ");
  Serial.println(statusCode);
  if (statusCode != 200) Control++;  
  Serial.print("Response body from server: ");
  Serial.println(response);
  if ((statusCode != 200) && ( Control <3)) goto Repetim;
  Serial.println("------------------");  
  delay(500);  
  }


//GET
void LlegirMySQL()
  {
  int Control = 0;  
  char *s;
  char *strings[10];
  String response;   
  char SELECT_GET[] = "/GesRegistresAPI/api/config?nomUsuari=yyyyyyyy&passwordUsuari=xxxxxx&idSonda=%s";
  char query[128];
   
  Serial.println(" -> Llegint dades del MySQL...");
  char idSonaInsertat[6];
  dtostrf( idSonda, 1, 0, idSonaInsertat);   // zero decimals  
  sprintf(query, SELECT_GET, idSonaInsertat);
  Repetim:
  Serial.println(query);
  Serial.println(" -> GET:");
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  //int statusCodeGet = client.get("/GesRegistresAPI/api/config?nomUsuari=yyyyyyyy&passwordUsuari=xxxxxx&idSonda=1002", &response);
  int statusCodeGet = client.get(query, &response);
  Serial.print("Status code from server: ");
  Serial.println(statusCodeGet);  //si es 200 es que ha retornar dades correctament
  if (statusCodeGet != 200) Control++;
  if (statusCodeGet==200)
    {
    Serial.println("Lectura correcte, les dades son: ");
    // "idSonda""idClient""AlarmaMinima""AlarmaMaxima""Data""idTipusSondes""Calibratge""Periode""OnOff""OpenClose""TimeOpne"
    // 1012;1001;0;0;2021-05-20 00:00:00;Pt;0;20;1;0;1000
    Serial.println(response);
    s = strtok(response.c_str(), ";");
    int index=0;
    while (s!=NULL) 
      {
      strings[index]= s;  
      s=strtok(NULL, ";");
      index++;
      }
    for(int n = 0; n <= index; n++)
      { 
      Serial.print(n);Serial.print("-->");Serial.println(strings[n]);
      if (n==7) TempsEntreLectures = atol(strings[n]);    //Temps entre lectures
      if (n==8) OnOff = atol(strings[n]);                             //Grabem les dades 1=SI i 0=NO
      if (n==9) OpenClose = atol(strings[n]);                    //Obrir porta 1=SI i 0=NO
      if (n==10) TimeOpen = atol(strings[n]);                  //Temps que tindrem el relé clavat
      if (TimeOpen >3000 ) TimeOpen = 3000;              //Maxim temps 3 segons
      }    

    // Mostra els resultats
    Serial.println("------------------------------------"); 
    Serial.print(" -> Temps entre lectures = ");
    Serial.println(TempsEntreLectures);  
    Serial.print(" ->                OnOff = ");
    Serial.println(OnOff);     
    Serial.print(" ->            OpenClose = ");
    Serial.println(OpenClose);  
    Serial.print(" ->             TimeOpen = ");
    Serial.println(TimeOpen);         
    //Fi Calibratge    
    }
  else
    {
    Serial.println("Error al llegir les dades.");  
    if ((statusCodeGet != 200) && ( Control <3)) goto Repetim;    
    }
  Serial.println("------------------------------------"); 
  delay(500);  
  }

void ActivarRele(int Valor)   // ha de ser 0 o 1
  {
  int pin = 9;   //Pin digital 9

  Serial.println(" -> Rele:");
  Serial.println("    HIGH");
  if (Valor == 0) digitalWrite(pin, LOW);       // poner el Pin en LOW 
  if (Valor == 1) digitalWrite(pin, HIGH);      // poner el Pin en HIGH 
  wdt_reset();  
  delay(TimeOpen);                 // manetenim el relé clavat 
  wdt_reset();   
  Serial.println("    LOW");
  digitalWrite(pin, LOW);        // poner el Pin en LOW  sempre acava en "0"
  }

// Funció temps d'espera entre captura de dades, en minuts-------------------
void Esperem (int minuts)
  {
  Serial.print(" -> Esperant (minuts) :");
  Serial.print( minuts);
  Serial.print(" ");
  for (int a=0; a<minuts; a++)
    {      
    delay(1000);  //60000 es un minut   si son sondes 60000 pq son minuts. Si son portes, segons i posem 1000
    Serial.print(".");
    }
  Serial.println (" ");  
  }
// Fi funció temps d'espera--------------------------------------------------
  

A ver, más pistas. He visto que si las consultas, las separo más de 5 segundos tengo menos errores. También que al ejecutar la petición GET, la función "LlegirMySQL", si el Web service me pasa menos registros, la recepción falla menos. ¿Alguna idea de como mejorar estos detalles? Gracias.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.