Armazenar array para envio posterior

Olá.

Estou com dificuldades em entender como poderia fazer para armazenar uma QUERY caso a conexão com o banco de dados seja interrompida.

Meu projeto consiste e salvar a cada 10 segundos um valor no banco, e caso a conexão com o banco de dados caia, esta query deve ser armazenada na fila para envio quando a rede retornar, criando assim uma fila pendente de envio.

Atualmente utilizo o código abaixo com a lib do ChuckBell.

#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(10, 0, 1, 35); // IP of the MySQL *server* here

char user[] = "****";              // MySQL user login username
char password[] = "****";        // MySQL user login password

int status_banco; // variavel que recebe status banco, 0 para nao disponivel e 1 para disponivel.
int maq, valor_1, valor_2, valor_3, valor_4; // valores int do insert
maq = 100;

unsigned long millisTarefa1 = millis();

//Analog Input
#define ANALOG_PIN_0 35
#define ANALOG_PIN_1 34
#define ANALOG_PIN_2 36
#define ANALOG_PIN_3 39

// Query de dados
char INSERT_SQL[] = "INSERT INTO banco.tab_registro (maq,valor_1,valor_2,valor_3,valor_4) VALUES ('%d','%d','%d','%d','%d')";
char query[512];
EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup()
{
  Serial.begin(115200);
  while (!Serial);
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  func_conecta_banco();
}

void loop()
{
  // funcao para verificar conexao com o banco de dados
  func_conecta_banco();

  // recebendo valores nas variáveis...
  valor_1 = analogRead(ANALOG_PIN_0);
  valor_2 = analogRead(ANALOG_PIN_1);
  valor_3 = analogRead(ANALOG_PIN_2);
  valor_4 = analogRead(ANALOG_PIN_3);

  // millis para executar a cada 10s
  if ((millis() - millisTarefa1) < 10000)
  {
    if (status_banco == 1) // se banco disponível...
    {
      func_salvar_dados(); // função que executa a query
    }
    if (status_banco == 0) // se banco indisponível...
    {
      // nesse ponto cria a fila de query para envio quando a conexao voltar.
    }
  }
}

void func_conecta_banco();
if (conn.connect(server_addr, 3306, user, password))
{
  status_banco = 1;
  delay(1000);
} else {
  Serial.println("Connection failed.");
  status_banco = 0;
}

void func_salvar_dados()
{
  sprintf(query, INSERT_SQL, maq, valor_1, valor_2, valor_3, valor_4);
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  cur_mem->execute(query);
  delete cur_mem;
}

O INSERT_SQL é uma string ou seja um array de char, salva ele em um SD card, você também pode deixar na memoria se for uma prova de conceito mas na produção seu projeto pode travar bem rapido (stackoverflow).

  1. Quando não tem conexão você salva do SD
  2. Quando completa 1 segundo você envia a nova leitura
  3. Enquanto não completa 1 segundo você vai enviando as mensagens gravadas no SD

Olá Nicolas,

Obrigado pelo retorno, porem eu nao tenho um dispositivo SD no projeto, portanto, precisava somente que essa array fosse salvo na memoria volátil, nao em eepron/flash/sd, por um curto periodo de tempo, e quando a rede retornasse, essas arrays que estão na fila, fossem enviadas para o banco de dados.

É muito pouco espaço, se sua rede ficar offline por 30 minutos são 1800 strings que vai ter que guardar, sua string tem aproximadamente 40 bytes (1 caractere = 1 byte) e isso vai dar 70 KBytes.

Você pode salvar menos informação, mas é um risco do mesmo jeito…
Não tem como prever quanto tempo vai ficar offline.

Tens razão, porem posso mudar para 1 registro por minuto caso a rede caia, preciso garantir mesmo que eu não perca informações em pequenas falhas na rede, tipo, 5 min no máximo. Outro detalhe, vou utilizar o esp32, a memoria volatil dele é de 520KB, maior que do arduino.

Falai @renandamaia cara uma saida seria utilizar uma Matriz ao invés de 4 variáveis e utilizar alocação dinamica para crescer essa matriz. Outra saída seria utilizar estrutura de dados de fila. Essas alternativas seriam utilizadas no fluxo normal do programa. Por exemplo vc leu as variáveis , atribuiu elas a uma posição da matriz, caso esteja indisponível o banco vc ira ler novamente e atribuir a uma segunda posição da matriz e dai vai fazendo isso ate o banco ficar disponivel. Quando ele ficar disponível eh a hora de fazer um loop e executar os inserts em banco apos cada insert feito vc elimina essa posição da matriz. Vai dar um trabalho mas eh uma saida.

Abraços
Max

Valeu Max, realmente uma boa saída.
Vou estudar as possibilidades. Muito obrigado.