CLIENTE E SERVIDOR AO MESMO TEMPO

Olá pessoal,

Estou com um problema a um tempo que é implementar um cliente telnet que irá enviar mensagens de controle a um servidor, juntamente com um servidor web que recebe configurações via web.

O servidor de configurações funciona, já o cliente telnet não. Não conecta a servidor nenhum. Segue trechos do código:

declarações globais

// VARIAVEIS GLOBAIS ============================================================================

const char teste[] PROGMEM = "<svgabcammsg><svgabcamid>RCJS1086701</svgabcamid><svgabcamop>svgabcam_keepalive</svgabcamop><svgabcamseq>1000</svgabcamseq><svgabcamcamstatus1>svgabcamcamstatus_online</svgabcamcamstatus1><svgabcamcamstatus2>svgabcamcamstatus_online</svgabcamcamstatus2><svgabcamcamstatus3>svgabcamcamstatus_offline</svgabcamcamstatus3><svgabcamcamstatus4>svgabcamcamstatus_offline</svgabcamcamstatus4><svgabcamcamstatus5>svgabcamcamstatus_not_registered</svgabcamcamstatus5><svgabcamcamstatus6>svgabcamcamstatus_not_registered</svgabcamcamstatus6></svgabcammsg>";
PROGMEM const char * const test_msg[1] = {teste};

char buffer_msg[512];

String serialCode;
int seq = 1;

const unsigned int MAX_INPUT = 500;
const int MAX_PARAM = 15;

char buffer[256];

// Shield
uint8_t mac[6] = {0xAB, 0xCD, 0x12, 0x34, 0xFF, 0xCA};
uint8_t ip[4] = {};
uint8_t mask[4] = {};
uint8_t gateway[4] = {};
uint8_t domain_server[4] = {};

// IPs dos Dispositivos para teste
uint8_t disp1[4] = {};
uint8_t disp2[4] = {};
uint8_t disp3[4] = {};
uint8_t disp4[4] = {};
uint8_t disp5[4] = {};
uint8_t disp6[4] = {};
uint8_t disp7[4] = {};
uint8_t disp8[4] = {};
uint8_t disp9[4] = {};
uint8_t disp10[4] = {};

// Cliente telnet
IPAddress server_msg(187, 79, 182, 109);
EthernetClient client;

// Configuracoes de PING
SOCKET pingSocket = 0;
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

// Porta do servidor WEB
EthernetServer server(80);

// Configuracoes dos dispositivos
int statusdisp[10] = {};
int saidadisp[10] = {};

// Controle de reboots
int inc_reboot[22] = {0, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 100, 150, 200, 300, 400, 500};

int reboot_disp1[3] = {};
int reboot_disp2[3] = {};
int reboot_disp3[3] = {};
int reboot_disp4[3] = {};
int reboot_disp5[3] = {};
int reboot_disp6[3] = {};
int reboot_disp7[3] = {};
int reboot_disp8[3] = {};
int reboot_disp9[3] = {};
int reboot_disp10[3] = {};

// Controle de saidas de alimentacao
int saida_disp1 = 0;
int saida_disp2 = 0;
int saida_disp3 = 0;
int saida_disp4 = 0;
int saida_disp5 = 0;
int saida_disp6 = 0;
int saida_disp7 = 0;
int saida_disp8 = 0;
int saida_disp9 = 0;
int saida_disp10 = 0;

// Configuracao de Threads
ThreadController cpu;
Thread threadWeb;
Thread threadPing;
Thread threadMsg;

Setup

void setup() {

  pinMode(saida1, OUTPUT); // Configura pino 6 como saida
  digitalWrite(saida1, LOW); // Carrega pino 6 com nivel logico baixo

  pinMode(saida2, OUTPUT); // Configura pino 7 como saida
  digitalWrite(saida2, LOW); // Carrega pino 7 com nivel logico baixo

  pinMode(saida3, OUTPUT); // Configura pino 8 como saida
  digitalWrite(saida3, LOW); // Carrega pino 8 com nivel logico baixo

  pinMode(saida4, OUTPUT); // Configura pino 9 como saida
  digitalWrite(saida4, LOW); // Carrega pino 9 com nivel logico baixo

  pinMode(saida5, OUTPUT); // Configura pino 5 como saida
  digitalWrite(saida1, LOW); // Carrega pino 5 com nivel logico baixo

  pinMode(ledvd, OUTPUT); // Configura pino 1 como saida
  digitalWrite(ledvd, LOW); // Carrega pino 1 com nivel logico baixo

  pinMode(ledam, OUTPUT); // Configura pino 2 como saida
  digitalWrite(ledam, LOW); // Carrega pino 2 com nivel logico baixo

  Serial.begin(9600); // Velocidade da comunicacao serial

  setup_EEPROM();

  Ethernet.begin(mac, ip, domain_server, gateway, mask);
  server.begin();

  threadWeb.setInterval(200);       // Configura o intervalo em que a thread do servidor WEB ira rodar
  threadWeb.onRun(server_page);     // Indica a funcao que sera executada

  threadPing.setInterval(30000);    // Configura o intervalo em que a thread do ping ira rodar
  threadPing.onRun(disp_test);      // Indica a funcao que sera executada

  threadMsg.setInterval(5000);     // Configura o intervalo em que a thread da mensagem ira rodar
  threadMsg.onRun(send_msg);        // Indica a funcao que sera executada

  cpu.add(&threadWeb);              // Configura o should run da thread do servidor WEB
  cpu.add(&threadPing);             // Configura o should run da thread do ping
  cpu.add(&threadMsg);              // Configura o should run da thread de envio da mensagem

  wdt_disable();

  delay(5000);

  if (client.connect(server_msg, 60444)) {
    Serial.println("conect");
  } else {
    Serial.println("desconect");
  }
 
  Serial.println(Ethernet.localIP());
}

Envio da mensagem

// Envia keep alive =============================================================================
void send_msg() {

  Serial.println("KEEP ALIVE");

  if (client.connect(server_msg, 60444)) {
   Serial.println("conect");
   strcpy_P(buffer_msg, (char*)pgm_read_word(&(test_msg[0])));
   client.println(buffer_msg);
    
   while (client.connected()){
        while (client.available() > 0) {
          char c = client.read();
          Serial.print(c);
        }
    }
 } else {
  Serial.println("desconect");
 }
 
 client.stop();
}

Página web

// PAGINA DO SERVIDOR  ==========================================================================
void server_page()
{
  client = server.available();

  if (client) {

    //Serial.println("cliente conectado");
    boolean done = false;

    while (client.connected() && !done) {

      while (client.available() > 0 && !done) {

        done = processIncomingByte(client.read());
      }
    }
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
    client.println("<!DOCTYPE HTML>");
    client.println("<html><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>");

    // Apresentacao de cabecalho -----------------------------------------
    for (int i = 0; i < 9; i++) {
      strcpy_P(buffer, (char*)pgm_read_word(&(string_table1[i])));
      client.print(buffer);
    }
    // -------------------------------------------------------------------


    // Apresentacao das configuracoes atuais -----------------------------
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table2[0])));
    client.print(buffer);
    client.print(mac[0], HEX);

    for (int i = 1; i < 6; i++) {
      client.print(":");
      client.print(mac[i], HEX);
    }

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table2[1])));
    client.print(buffer);
    client.print(ip[0], DEC);

    for (int i = 1; i < 4; i++) {
      client.print(".");
      client.print(ip[i], DEC);
    }

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table2[2])));
    client.print(buffer);
    client.print(mask[0], DEC);

    for (int i = 1; i < 4; i++) {
      client.print(".");
      client.print(mask[i], DEC);
    }

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table2[3])));
    client.print(buffer);
    client.print(gateway[0], DEC);

    for (int i = 1; i < 4; i++) {
      client.print(".");
      client.print(gateway[i], DEC);
    }

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table2[4])));
    client.print(buffer);
    client.print(domain_server[0], DEC);

    for (int i = 1; i < 4; i++) {
      client.print(".");
      client.print(domain_server[i], DEC);
    }
    // -------------------------------------------------------------------


    // Apresentacao das configuracoes de rede ----------------------------
    for (int i = 0; i < 20; i++) {
      strcpy_P(buffer, (char*)pgm_read_word(&(string_table3[i])));
      client.print(buffer);
    }
    // -------------------------------------------------------------------

    // Apresentacao das configuracoes atuais de dispositivos -------------
    for (int i = 0; i < 10; i++) {

      strcpy_P(buffer, (char*)pgm_read_word(&(string_table4[i])));
      client.print(buffer);

      if (statusdisp[i] == 1) {
        client.print("<td align=center>OFF</td>");
      } else {
        client.print("<td align=center>ON</td>");
      }

      client.print("<td></td><td align=center>");
      client.print(saidadisp[i]);
      client.print("</td>");

      switch (i) {

        case 0:
          client.print("<td align=center>");
          client.print(disp1[0]);
          client.print(".");
          client.print(disp1[1]);
          client.print(".");
          client.print(disp1[2]);
          client.print(".");
          client.print(disp1[3]);
          client.print("</td>");
          break;

        case 1:
          client.print("<td align=center>");
          client.print(disp2[0]);
          client.print(".");
          client.print(disp2[1]);
          client.print(".");
          client.print(disp2[2]);
          client.print(".");
          client.print(disp2[3]);
          client.print("</td>");
          break;

        case 2:
          client.print("<td align=center>");
          client.print(disp3[0]);
          client.print(".");
          client.print(disp3[1]);
          client.print(".");
          client.print(disp3[2]);
          client.print(".");
          client.print(disp3[3]);
          client.print("</td>");
          break;

        case 3:
          client.print("<td align=center>");
          client.print(disp4[0]);
          client.print(".");
          client.print(disp4[1]);
          client.print(".");
          client.print(disp4[2]);
          client.print(".");
          client.print(disp4[3]);
          client.print("</td>");
          break;

        case 4:
          client.print("<td align=center>");
          client.print(disp5[0]);
          client.print(".");
          client.print(disp5[1]);
          client.print(".");
          client.print(disp5[2]);
          client.print(".");
          client.print(disp5[3]);
          client.print("</td>");
          break;

        case 5:
          client.print("<td align=center>");
          client.print(disp6[0]);
          client.print(".");
          client.print(disp6[1]);
          client.print(".");
          client.print(disp6[2]);
          client.print(".");
          client.print(disp6[3]);
          client.print("</td>");
          break;

        case 6:
          client.print("<td align=center>");
          client.print(disp7[0]);
          client.print(".");
          client.print(disp7[1]);
          client.print(".");
          client.print(disp7[2]);
          client.print(".");
          client.print(disp7[3]);
          client.print("</td>");
          break;

        case 7:
          client.print("<td align=center>");
          client.print(disp8[0]);
          client.print(".");
          client.print(disp8[1]);
          client.print(".");
          client.print(disp8[2]);
          client.print(".");
          client.print(disp8[3]);
          client.print("</td>");
          break;

        case 8:
          client.print("<td align=center>");
          client.print(disp9[0]);
          client.print(".");
          client.print(disp9[1]);
          client.print(".");
          client.print(disp9[2]);
          client.print(".");
          client.print(disp9[3]);
          client.print("</td>");
          break;

        case 9:
          client.print("<td align=center>");
          client.print(disp10[0]);
          client.print(".");
          client.print(disp10[1]);
          client.print(".");
          client.print(disp10[2]);
          client.print(".");
          client.print(disp10[3]);
          client.print("</td>");
          break;
      }
    }
    // -------------------------------------------------------------------


    // Apresentacao das configuracoes dos dispositivos e serial number ---
    for (int i = 0; i < 55; i++) {

      strcpy_P(buffer, (char*)pgm_read_word(&(string_table5[i])));
      client.print(buffer);
    }
    // -------------------------------------------------------------------

    // Apresentacao do menu serial number --------------------------------

    strcpy_P(buffer, (char*)pgm_read_word(&(string_table6[0])));
    client.print(buffer);

    for (int i = 0; i < 9; i++) {
      client.print(serialCode[i]);
    }

    // -------------------------------------------------------------------

    // Apresentacao do menu serial e reset -------------------------------
    for (int i = 0; i < 5; i++) {

      strcpy_P(buffer, (char*)pgm_read_word(&(string_table7[i])));
      client.print(buffer);
    }
  }

  //Serial.println("cliente desconectado!");
  delay(1);
  client.stop();
}

Loop

void loop()
{
  cpu.run();
}

O teu programa não define nada:

uint8_t mac[6] = {0xAB, 0xCD, 0x12, 0x34, 0xFF, 0xCA};
uint8_t ip[4] = {};
uint8_t mask[4] = {};
uint8_t gateway[4] = {};
uint8_t domain_server[4] = {};

sem configurares isto como deve ser, não me espanta que nada funcione.

São declaradas sim, em outra função que coleta os dados da EEPROM. como eu havia descrito anteriormente, O SERVIDOR FUNCIONA (o que só daria certo se as configurações de rede fossem realizadas), só não funciona o cliente.

essa parte da eeprom não vem ao caso pois está funcionando.