/*
* Wayward Soul - Módulo de Telemetria
*
* Um módulo Ethernet para a telemetria,
* com capacidade para fazer reboots a quente ao router, caso se perca a ligação à Internet.
* Responde com dados das entradas analógicas, ou com as entradas do 6017.
* Pode ser configurado para enviar os valores analógicos para um servidor com uma determinada cadência.
* Cadencia: 10 min = cerca de 540KB por mes
* Tem uma linha de comandos simples, em telnet, que permite configurar, ler valores, sacar logs, mudar estado, etc.
* Guarda logs da abertura e fecho da porta do quadro, das percas e restabelecimentos de ligação à Internet, etc.
* Guarda dados quando nao tem ligacao a Internet, depois envia-os a pedido.
*/
#include <Ethernet.h>
#include <PString.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 50 };
byte netmask[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 1, 1 };
Server server(2023);
byte router[] = { 192, 168, 1, 1 }; // Router
Client client(router, 23);
byte cas[] = { 213, 228, 166, 27 }; // Servidor da RNM 213.228.166.27
Client clienteAutosend(cas, 22020);
byte cl[] = { 213, 228, 166, 27 }; // Servidor da Progresso 85.10.128.150, progresso.pt ; Formula9: 213.228.166.27
Client clienteLink(cl, 80);
long rollovers = 0;
boolean rebootActivated = true;
int i;
char comandoBuffer[29];
int posicao = 0;
PString comando(comandoBuffer, sizeof(comandoBuffer));
boolean autosend = false;
boolean linkUp = true;
int falhas = 0;
unsigned long linkContador = 0;
unsigned long cadenciaLink = 180000;
unsigned long oldmillisLink = 0;
void setup()
{
//clearBuffer();
oldmillisLink = millis();
linkContador = 0;
falhas = 0;
Serial.begin(9600);
Serial.println("Wayward Soul - Modulo de Telemetria");
Serial.println("V0.8 - 2009 - Oscar Sarabando");
Serial.println();
//delay(3000);
Ethernet.begin(mac, ip, gateway, netmask);
server.begin();
//clienteLink = Client(cl, 80);
if (rebootActivated)
{
Serial.println("A esperar 20 segs...");
Serial.println();
for(i=20 ; i>0 ; i--)
{
Serial.print(i);
Serial.print("...");
delay(1000);
}
Serial.println();
// =========== Fazer Reboot ao Router por causa do modem ZTE MF636DB
rebootRouter();
}
Serial.println("Inicializada!");
}
void loop()
{
// ======================== Verificar ligação Internet do Router =========================
// Fazer reboot ao Router se não tiver ligação Internet há mais de X minutos
// Testa a ligação ao servidor da Progresso, com uma página de teste mínima
// Se não conseguimos ligação X vezes, fazer reboot ao router por telnet
// Handle rollover do contador
if ( millis() < oldmillisLink )
{
oldmillisLink = millis();
//linkContador = 0;
rollovers++;
}
// Verify event happened
linkContador += (millis() - oldmillisLink);
oldmillisLink = millis();
if (linkContador > cadenciaLink)
{
linkContador = 0;
Serial.println("------------");
Serial.println(millis());
Serial.println(rollovers);
Serial.println("A testar o link...");
// Tentar ligar ao servidor
boolean linkTest = false;
if (clienteLink.connect())
{
Serial.println("Link bom!");
linkTest = true;
linkUp = true;
falhas = 0;
//clienteLink.println("GET /telemetria/telem.html HTTP/1.0");
//clienteLink.println();
clienteLink.stop();
}
else
{
falhas++;
linkTest = false;
Serial.print("************* Falha ");
Serial.print(falhas);
Serial.println(" no link!");
linkUp = false;
}
// Se falhou 4 vezes, faz reboot ao router
if (!linkTest && (falhas > 3))
{
Serial.println("************* Quarta falha! Rebooting.");
rebootRouter();
linkUp = true;
falhas = 0;
}
// AUTO SEND
if (autosend)
{
if (clienteAutosend.connect())
{
Serial.println("Ligado ao servidor.");
clienteAutosend.println(millis());
Serial.println("Enviado!");
clienteAutosend.stop();
}
else
{
Serial.println("*************** Autosend falhou!");
}
}
}
// ======================== LER as Analogicas do 6017 para RAM (every X secs) =========================
// ======================== LOGS na EPROM (reboots por power loss e reboots ao router) =========================
// ======================== PEDIDO: LOGS =========================
// ======================== PEDIDO: Entradas Analógicas por Ethernet WEBSERVER =========================
/*
Client clientWeb = server.available();
if (clientWeb)
{
// an http request ends with a blank line
boolean current_line_is_blank = true;
while (clientWeb.connected()) {
if (clientWeb.available()) {
char c = clientWeb.read();
// if we've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (c == '\n' && current_line_is_blank) {
// send a standard http response header
clientWeb.println("HTTP/1.1 200 OK");
clientWeb.println("Content-Type: text/html");
clientWeb.println();
// output the value of each analog input pin
for (int i = 0; i < 6; i++) {
clientWeb.print("Entrada analogica ");
clientWeb.print(i);
clientWeb.print(" : ");
clientWeb.print(analogRead(i));
clientWeb.println("
");
}
break;
}
if (c == '\n') {
// we're starting a new line
current_line_is_blank = true;
} else if (c != '\r') {
// we've gotten a character on the current line
current_line_is_blank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
clientWeb.stop();
}
*/