Ir ao conteúdo

Posts recomendados

Postado

Obrigado @ViniciusKruz e @aphawk!

 

O BUG é em relação ao JS: por exemplo, ele pega o horário pelo comando:

setInterval(function(){
     localtime = new Date();
     document.getElementById("hora_atual").innerHTML = localtime.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
     hora();
}, 1000);

A cada 1 segundo, ele atualiza a DIV com a hora atual, e tem 2 DIVS com os horários programados. Ele pega e compara: se o horario coiincidir, faz açao de ligar ou desligar.

 

O problema é: tenho que estar com a página aberta!! Se eu fechar ela, não funciona.

 

Alguém pode me dar uma dica de como solucionar? Eu pensei em algo com banco de dados (mysql).

  • Membro VIP
Postado
2 horas atrás, Papibakigrafo disse:

Consegui usando o setInterval, vou testar aqui assim pra ver!

 

setInterval()

setInterval(function(){ alert("Hello"); }, 3000);

Por que você chegou a afirmar que somente funcionaria como uma função de click ou keypress?

  • Curtir 1
Postado

@Papibakigrafo  Não consegui fazer pelo exemplo do vinicius Cruz, mas me baseei nas explicações dele e no código example:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

//Check if header is present and correct
bool is_authentified(){
  Serial.println("Enter is_authentified");
  if (server.hasHeader("Cookie")){   
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
    if (cookie.indexOf("ESPSESSIONID=1") != -1) {
      Serial.println("Authentification Successful");
      return true;
    }
  }
  Serial.println("Authentification Failed");
  return false;	
}

//login page, also called for disconnect
void handleLogin(){
  String msg;
  if (server.hasHeader("Cookie")){   
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
  }
  if (server.hasArg("DISCONNECT")){
    Serial.println("Disconnection");
    String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
    if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin" ){
      String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
      server.sendContent(header);
      Serial.println("Log in Successful");
      return;
    }
  msg = "Wrong username/password! try again.";
  Serial.println("Log in Failed");
  }
  String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
  content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
  content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
  content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
  content += "You also can go <a href='/inline'>here</a></body></html>";
  server.send(200, "text/html", content);
}

//root page can be accessed only if authentification is ok
void handleRoot(){
  Serial.println("Enter handleRoot");
  String header;
  if (!is_authentified()){
    String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>";
  if (server.hasHeader("User-Agent")){
    content += "the user agent used is : " + server.header("User-Agent") + "<br><br>";
  }
  content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>";
  server.send(200, "text/html", content);
}

//no need authentification
void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void){
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());


  server.on("/", handleRoot);
  server.on("/login", handleLogin);
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works without need of authentification");
  });

  server.onNotFound(handleNotFound);
  //here the list of headers to be recorded
  const char * headerkeys[] = {"User-Agent","Cookie"} ;
  size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
  //ask server to track these headers
  server.collectHeaders(headerkeys, headerkeyssize );
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}

 Primeiro antes do void setup e apos a linha do codigo web server(80) voce coloca esta parte aqui:

ESP8266WebServer server(80);

//Check if header is present and correct
bool is_authentified(){
  Serial.println("Enter is_authentified");
  if (server.hasHeader("Cookie")){   
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
    if (cookie.indexOf("ESPSESSIONID=1") != -1) {
      Serial.println("Authentification Successful");
      return true;
    }
  }
  Serial.println("Authentification Failed");
  return false;	
}

Depois na pagina que voce quer "lacrar", no void não sei das quantas, voce coloca nela esta linha de código aqui:

 String header;
  if (!is_authentified()){
    String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }

ahe durante os inumeros voids no código voce coloca este void aqui:

void handleLogin(){
  String msg;
  if (server.hasHeader("Cookie")){   
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
  }
  if (server.hasArg("DISCONNECT")){
    Serial.println("Disconnection");
    String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
    if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin" ){
      String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
      server.sendContent(header);
      Serial.println("Log in Successful");
      return;
    }
  msg = "Wrong username/password! try again.";
  Serial.println("Log in Failed");
  }
  String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
  content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
  content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
  content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
  content += "You also can go <a href='/inline'>here</a></body></html>";
  server.send(200, "text/html", content);
}

adiciona este void aqui também

void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

e no void setup voce valida as paginas:

  server.on("/", handleRoot);
  server.on("/login", handleLogin);
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works without need of authentification");
  });
server.onNotFound(handleNotFound);
  //here the list of headers to be recorded
  const char * headerkeys[] = {"User-Agent","Cookie"} ;
  size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
  //ask server to track these headers
  server.collectHeaders(headerkeys, headerkeyssize );
  server.begin();
  Serial.println("HTTP server started");

 

 

  • Curtir 2
Postado
Em 24/12/2016 às 21:02, alexandre.mbm disse:

E gravar em arquivo, dentro do microcontrolador? Não estamos falando de um horário de agendamento? Ele seria mudado pouco.

Isso até pode dar certo, pois lembrei a diferença entre o JS e MySQL(PHP)!

JavaScript é rodado no cliente, quer dizer, se a página estiver fechada, não tem mesmo como rodar. Já o PHP e MySQL é rodado no servidor, que provavelmente daria certo.

Postado

@Papibakigrafo  Isso que você tá querendo(acionar por horário) não pode ser feito a nível de cliente(navegador) porque assim só funciona se o navegador estiver aberto mesmo!! Precisa entender uma coisa(creio que você já saiba): Javascript só funciona no navegador(cliente), logo, qualquer função feita em JS só funciona se o navegador estiver aberto mesmo.

 

O que você está querendo fazer, deve ser feito no servidor Web (ESP), é ele quem deve verificar os horários e ligar ou não. O navegador não pode ter a função de ligar ou desligar, e sim, de verificar se o ESP ligou alguma coisa e o navegador apenas atualiza isso na tela.

  • Curtir 2
Postado
Em 24/12/2016 às 17:39, alexandre.mbm disse:

Esses assuntos de direitos autorais, patentes e engenharia reversa são um tanto complicados, cheios de casuística.

 

O procedimento em si, de copiar (fazer backup) do código objeto, não é engenharia reversa. Porém, se o projeto não é aberto, certamente existiu alguma engenharia reversa para se chegar a ele.

 

E existem nuances. Consigo lembrar algumas:

 

1) Por exemplo, o projeto pode ser proprietário e sem documentação sobre o procedimento. Entretanto, mesmo sendo proprietário, pode ter documentação suficiente para dispensar um hard hacking.

 

2) Imagine uma impressora. Uma coisa é copiar o firmware dela para elaborar um produto concorrente, e fazer isso usando documentação confidencial. Outra coisa é fazê-lo simplesmente para revivê-la de uma atualização mal sucedida, ou fazê-lo "na raça" sem acesso a conteúdo não autorizado.

 

3) Imagine uma placa de circuito impresso. Eu posso redesenhar o esquemático dela. Para meu estudo; ou para modificar o meu exemplar. Outra coisa bem diferente é mandar produzi-la em escala.

 

4) ...

 

Muitas vezes é lícito divulgar o conhecimento de um "estudo" que fizemos, ou o método para alcançá-lo. Outras vezes, existem questões éticas até "colaterais".

 

Podemos discutir como alterar um filtro de linha ou uma campainha eletrônica. Não vejo algo errado nisso. E no entanto será uma engenharia reversa.

 

A palavra chave para definir o "status" é esta : o uso do conhecimento obtido será comercial ?

 

Se a resposta é não, então pode-se fazer isso tudo acima, com o objetivo de se fazer algo por pura satisfação pessoal.

 

Já se disso tudo acima sair algo de uso comercial, então é 100% de certeza de que os direitos de propriedade foram violados.

 

Mas não concordo com a sua afirmação sobre o "projeto não ser aberto então usou-se de algum tipo de engenharia reversa".

 

Eu tenho alguns produtos que eu fiz e vendo até hoje para menos de 50 clientes. São muito simples, com um pequeno pulo do gato neles, e que desenvolvi por completo apenas a partir do meu conhecimento básico sobre uma conexão RJ-45 , tráfego de dados e o tal pulo do gato.

 

Não violei nenhum direito autoral, não abri nenhum produto comercial para ver o funcionamento, e nunca ouvi falar de nenhum produto semelhante aos meu, fecho o firmware do microcontrolador justamente para proteger o meu pulo do gato. E posso te garantir que não violei nenhum direito comercial de outra pessoa.

 

Paulo

  • Curtir 3
Postado

@ViniciusKruz foi exatamente o que eu percebi essa noite... até escrevi isso logo acima da sua resposta kkkkkk

Os horários de ligar e desligar, é fácil de conseguir, pois ficam gravados na EEPROM. Agora, verificar o horário, no próprio ESP, não sei fazer... mas vou dar uma procurada hoje! 

 

 

EDIT: encontrei isso:

 

http://pedrominatel.com.br/pt/esp8266/data-e-hora-no-esp8266-com-ntp/

 

https://github.com/jhon2c/WifiRTC/blob/master/Código/firmware/firmware.ino

 

Acho que é por esse lado! =)

  • Curtir 2
Postado

Pega a hora por servidor NTP e incrementa um contador tipo long a cada segundo, eu tenho algumas rotinas que fazem isso.  O meu programa de calibração do DS3231 tem algumas rotinas úteis para fazer uma coisa destas.

  • Curtir 2
Postado

@Papibakigrafo  Sem internet, você pode colocar no sistema um RTC físico, eu sugiro o DS3231 ou então faz o relógio por software mesmo, só que nesse segundo caso, como não tem a internet pra manter ele atualizado, se desligar, já era, tem que acertar manualmente novamente.

  • Curtir 1
Postado

Não falta rotina exemplo para servidor NTP, a Internet está cheia delas. A minha eu posso colocar novamente aqui, achar alguma coisa em 62 páginas é complicado e eu já aperfeiçoei ela um pouco (para quem quer precisão ela está ótima, variação menor que 1 milissegundo), mas a interface ainda está tosca. Quando ficar satisfeito com o resultado (ainda não estou totalmente) eu devo começar a trabalhar na interface.

 

Fazer uma rotina acertando pelo NTP é fácil, principalmente se você não for paranoico por precisão como eu. Dá para conseguir precisão melhor que +/- 0,5 seg de erro sem dificuldade. Fazendo isso é só incrementar um contador long a cada segundo pelo timer do ESP8266 usando o USTAMP como hora inicial, que é obtido dos servidores NTP pela Internet. Para converter de USTAMP para data e hora dá mais trabalho, mas já tem muita coisa pronta na Internet, mesmo assim eu criei a minha própria em português (tem tudo isso na minha rotina de calibração).

  • Curtir 4
Postado

Pessoal, uma ultima duvida. é possivel adicionar uma senha ao esp? pra impedir que alguem por engenharia reversa tenha acesso ao código?

adicionado 38 minutos depois

Pessoal, outra duvida. Uma vezlih aqui no forum que pra alimentar o node com uma fonte externa voc tem que alimentar pelo Vin e pelo terra.Qual seria a tensão de alimentação no Vin? 3,3 volts ou 5 volts?

Postado

A ultima versão da minha rotina de calibração com o fonte mais o executável (feito no Eclipse).

 

Já estou usando o Elipse, tenho duas versões instaladas, uma é o Neon que eu consegui fazer funcionar com o ESP8266 mas não consigo transferir o arquivo para o ESP8266 por ela, tem uma segunda versão (Sloeber) do Neon, versão um pouco atrasada mas bastante arrumada, instalada por .bat. Nesta eu não consigo compilar para o ESP, dá problema com uma biblioteca (a do DS3231), que ele não encontra (é uma pena pois por ela dá para configurar direito o upload, se eu inibir a biblioteca externa ele consegue compilar mas fica inútil para mim).

 

Eu ainda não consigo entender como o Eclipse gerencia as Bibliotecas de terceiros (no Arduino IDE eu já estava conseguindo me virar) e uma montanha de outras coisas no programa. O programa é realmente incrível e muito cheio de recursos (que eu não sei usar, ele não é nada "user friendly") e compila muito rápido (mas estou sendo obrigado a fazer o upload com outro programa). Aprender a usar ele é quase como tentar aprender a pilotar helicóptero voando como auto de data e sem passar por simulador de voo (com o simulador já é complicado), é florida ! Nem sei como estou conseguindo compilar com ele, mas depois que consegui isso com o Eclipse Neon o Arduino IDE parou de compilar direito, estou tendo erro de biblioteca quando tento, sem entender o porque disso ???, e agora sou obrigado a usar o Eclipse mesmo sem entender direito como as coisas funcionam, me sinto totalmente perdido.

 

As muitas IDEs para o Eclipse até agora só me confundem, e na maioria das vezes eu tento seguir os exemplos dos tutorias da Internet e acabo chegando em lugar nenhum. Onde tem um bom tutorial para o Eclipse? Estou levando uma enorme surra e nem sei como incluir novas bibliotecas de terceiros.

Teste2.zip

Postado

@Intrudera6 É muito raro eu te ajudar, pois na maioria das vezes o seu conhecimento sobrepuja o meu, rsrs. Mas vejo que aqui jás uma exceção :)

Então as várias IDES para o eclipse é caso o usuário queira programar o eclipse apenas naquela linguagem específica, sem ter ficar baixando trocentas upgrades que, por fim, acabam deixando o eclipse lerdo.

" voce pode observar em foruns de programação, a maioria reclama do eclipse pelo fato dele ser lerdo, Embora eu o tenha achado bastante rápido."

Só usei o eclipse para programar em python e recentemente, javascript. Reconheço que o corretor ortografico dele em python é uma lesma encharcada de sal, em comparação a outra ide que é o pycharm, mas e melhor que nada. E em javascript ela nem existe. Mas deve ser algum plugin que acabou faltando.

  • Curtir 2
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...