ESP8266: Como enviar email pelo GMAIL.

O processo é muito parecido com o usado para enviar email criptografado para outros provedores. Os detalhes a atentar são:

  1. Você precisa configurar a conta gmail para permitir o acesso de “aplicativos menos seguros”, por isso é recomendável que você crie e configure uma conta no gmail só para isso;
  2. O servidor é smtp.gmail.com e a porta é 465;
  3. Nos campos “MAIL from” e “RCPT to” você deve preencher apenas o email, assim: <usuario@servidor.com> . Do contrário dará “syntax error”.

Erros que você pode encontrar:

  1. “MAIL first” – Neste momento o servidor esperava o comando “MAIL from:”
  2. “RCPT first” – Neste momento o servidor esperava o comando “RCPT TO:”
  3. “Syntax error” – Remova o “nome” da caixa postal. Deixe apenas o endereço de email;

Por que “aplicativos menos seguros”? Existe modo de contornar isso?

Aparentemente, não.

O gmail não parece explicar em lugar algum o que faz o aplicativo ser seguro ou não no conceito da Google. A minha suspeita é que tenha algo a ver com data/hora (para validar certificados) por duas razões:

  • As apps “seguras” da google também recusam seu login se, por exemplo, a data/hora do seu celular Android estiver errada;
  • Quando você habilita o debug “Core +SSL” do ESP8266 é exibida uma mensagem: “pelase start sntp first!” assim que você faz uma conexão criptografada. O autor da biblioteca, Igor, diz que essa mensagem é do SDK da Expressif e não dele e você pode “ignorá-la com segurança“, mas SNTP significa Simple Network Time Protocol e se o SDK quer que você tenha o horário correto antes da conexão, alguma razão existe.

E eu não faço idéia de como fazer o protocolo de comunicação ser configurado com data/hora corretos nem se isso seria suficiente.  A Google possivelmente quer se certificar de que você está validando o certificado dela antes de transmitir, mas isso é só um palpite.

 

Postado em Sem categoria | Tags: , | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como enviar e-mail por uma conexão criptografada (SSL/TLS).

Em um post anterior eu mostrei como se enviava e-mail e adverti para o fato de que a conexão não era segura e as credenciais podiam ser interceptadas (além do fato óbvio do e-mail poder ser lido). Eu achei que enviar por uma conexão segura fosse muito complicado, mas descobri que não é. O problema é que usa muita RAM. O email sem criptografia te deixa com 46KB livres para o resto do seu programa enquanto este aqui te deixa com “apenas” 18KB. Lembre-se de que isso ainda é 9x a RAM total de um Arduino UNO.

Sobre fingerprints e validação de certificado

Se você usa um servidor de e-mail numa conta compartilhada, como é o caso da hostgator, o certificado não vai validar se você colocar o nome do seu domínio como servidor. Você tem que obter o nome correto do servidor de e-mail que atende a sua conta. Na hostgator isso pode ser visto no cPanel.

Por exemplo, meu servidor de e-mail normal seria: meudominio.com.br ou mail.meudominio.com.br mas para validar o certificado eu preciso colocar gator1234.hostgator.com.

O exemplo abaixo é uma adaptação simples do exemplo que não usa criptografia.

Por alto, as diferenças são 4:

1)Acrescente: #include <WiFiClientSecure.h>

2)Acrescente: const char* fingerprint = “fingerprint_aqui”;

3)Mude: WiFiClient client; para WiFiClientSecure client; 

4)Acrescente a validação de certificado logo após a conexão:

 

Postado em Sem categoria | Tags: , | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Os LEDs do módulo ESP-01

ESP-01_leds

O LED vermelho é ligado diretamente à alimentação e o LED azul é ligado ao TX da serial. Se você não usar a serial no seu projeto pode controlar esse LED usando GPIO1, conforme o código abaixo:

 

Postado em Sem categoria | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: GPIO no módulo ESP-01

esp8266_esp01_automalabs

ESP-01_pinout_automalabs

O problema: o ESP-01 tem apenas dois GPIO disponíveis: GPIO0 e GPIO2 e ambos são usados no processo de boot do chip.

Por que é tão limitado ?

O meu melhor palpite é que ele não foi mesmo feito para isso. Quando o ESP-01 surgiu não existia essa facilidade que temos hoje para programá-lo diretamente. O fabricante do módulo, AI Thinker, criou um firmware que respondia a comandos AT e esse módulo foi criado para basicamente dar Wi-Fi a um projeto usando outro microcontrolador, como um Arduino. O módulo não precisava de GPIO para isso e o microcontrolador podia se comunicar por TX e RX e controlar seu status e até resetá-lo através dos pinos RST e CH_PD.

Para usar como saídas

Qualquer que seja o caso é recomendável que você tenha resistores de pull-up em ambos e assim o sinal ativo seja “LOW”.

Você pode usar ambos GPIO0 e GPIO2 como saídas, mas eu só recomendo no momento para LEDs e para i2C. GPIO2 especificamente é o TX da “hardware UART” na inicialização e por isso “pisca”. Acionar um relê com ele pode não ser uma boa ideia. GPIO0 parece ser seguro para relês mas ainda não estou certo disso.

Eu costumo usar assim e até agora não notei nenhum problema. Alguns recomendam colocar um pull-up de 4k7 ou 3k3 em paralelo com cada conjunto, mas ainda não vi real necessidade para isso:

ESP-01_output_leds

 

Para usar como entrada

Se qualquer um dos dois pinos estiver em nível baixo o ESP8266 poderá não inicializar. Você pode contornar o problema usando um dos GPIO como saída para ativar o uso do outro como entrada conforme mostra o último exemplo desta página, que é muito confuso por isso refiz assim:

ESP-01_GPIO

Durante o boot não importa se a chave S1 está aberta ou fechada, os resistores manterão GPIO0 e GPIO2 em nível alto. Quando rodar o programa você coloca GPIO2 como saída e em nível baixo, assim:

pinMode(2, OUTPUT);
digitalWrite(2, LOW);

Agora GPIO0 pode ser HIGH ou LOW dependendo da posição da chave. E assim você ganha uma entrada.

Mas o modo mais simples e “seguro” de ter uma entrada no ESP-01 é usar o pino RX da serial. Ele pode ser “liberado” no sketch com uma linha assim:

Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);

É claro que você não vai poder transmitir nada para esse sketch, mas vai poder receber normalmente pela serial.

Outro modo, mais complicado, de expandir a capacidade de I/O do ESP-01 é usando i2C. Basta um chip como o PCF8574 para transformar GPIO0 e GPIO2 em até oito entradas/saídas perfeitamente usáveis.

 

ESP-01_PCF8574_I2C

 

 

Postado em Sem categoria | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como enviar notificações usando o serviço Pushbullet

O Pushbullet é um serviço muito útil que permite enviar notificações instantâneas com o texto que você quiser para smartphones, tablets, browsers, etc. Antes de usar este exemplo certifique-se de que o serviço Pushbullet funciona para você usando o que está explicado neste outro post.

Este exemplo foi baseado neste aqui que por sua vez é baseado no exemplo HTTPSRequest.ino da biblioteca. Eu incluí algumas modificações que gosto de fazer.

Não tem checagens de erro, mas por sem bem simples fica também simples de entender.

Note que por usar HTTPS requer muita RAM. Eu incluí uma função para mostrar o impacto disso.

 

 

 

 

 

Postado em Sem categoria | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como enviar um e-mail a cada x minutos em caso de alarme.

Este exemplo é uma aplicação desse.

Está configurado para mandar dois e-mails diferentes para um mesmo destinatário. Um quando a condição for ativada (repetindo a cada x minutos) e outro quando for desativada.

Para criar uma versão com criptografia, veja instruções neste post.

 

Postado em Sem categoria | Tags: | 2 Comments

ESP8266: Como enviar e-mail por um servidor SMTP

Para a versão que usa SSL/TLS, veja este post.

Este código é um aperfeiçoamento do código apresentado aqui.

Testado com IDE 1.8.1 e ESP8266 Core v2.3.0

Melhorias:

  • Não é preciso pré-codificar usuário e senha em base64. Eu inclui as rotinas para isso;
  • Removi o uso de flash strings, que aparentemente era a causa da rotina demorar absurdamente em certos pontos;
  • Usei constantes no lugar de strings “hardcoded”;

Versão que prefiro

Eu criei esta versão porque preferia uma rotina de envio mais “limpa” e o log na porta serial feito de forma a representar com mais fidelidade a comunicação com o servidor.

 

Postado em Sem categoria | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como fazer um atualizador para DDNS Cloudflare

Eu não sou programador. Tudo o que garanto é que nas condições certas o programa funciona.

Correções e aperfeiçoamentos são bem-vindos.

Você precisa de:

Preencha os dados da sua rede sem fio e da sua conta Cloudflare e faça o upload. Se tudo estiver certo o procedimento do programa será o seguinte:

Ao inicializar:

  • Verifica o IP registrado para o host na sua conta Cloudflare;
  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Se forem diferentes atualiza a sua conta Cloudflare;
  • Guarda o IP para não precisar mais consultar a conta;

A cada 10 minutos

  • Verifica com checkip.dyndns.org qual o seu IP externo atual;
  • Compara com o ip armazenado e atualiza sua conta se forem diferentes;

Em caso de erro o programa reduz o intervalo entre checagens para 2 minutos. Retorna a 10 minutos após o primeiro sucesso.

 

A melhorar:

  • As rotinas de parse ainda são uma gambiarra;
  • Não testei se minhas checagens de erro realmente funcionam;
  • Com mais alguns GETs e parses JSON é possível obter o zone_id e o host_id a partir do host_name. Isso simplifica a vida de quem não sabe obter essas informações.

O programa não prossegue se o fingerprint do certificado for diferente do esperado. Infelizmente isso significa que quando o certificado da Clouflare for atualizado o programa deixará de funcionar até que um novo fingerprint seja inserido. Você pode remover esse requerimento mas fica sujeito a roubo de suas credenciais num ataque MITM. Uma sugestão seria armazenar o fingerprint em um arquivo no SPIFFS e fazer o programa ao não conseguir mais validar o certificado mandar uma mensagem para você e passar a procurar por uma atualização de fingerprint no seu domínio, em arquivo criptografado por você.

Infelizmente não parece haver meio do ESP8266 verificar a validade de certificados em tempo real. A checagem de fingerprints foi o melhor que a impressionante equipe por trás do desenvolvimento conseguiu fazer.

Ferramentas online úteis ao debugar esse projeto:

  • Teste da ArduinoJSON – Você pode testar algumas idéias sem ter que fazer upload para um arduino
  • dostring.com – Não sabe qual o tamanho do JSON em bytes? String Length diz.
  • JSON Parser Online – Não consegue visualizar a árvore mentalmente? Permite colapsar estruturas;
Postado em Sem categoria | Tags: | 2 Comments

Como usar I2C no ESP8266 e especificamente no ESP-01

esp8266_esp01_automalabsUsando a IDE Arduino com Board ESP8266 é realmente muito simples. Não é preciso usar uma biblioteca I2C específica como é o caso de rede e seus programas já existentes devem funcionar exceto por um detalhe: você precisa especificar na inicialização da biblioteca Wire os pinos que você está usando para I2C no ESP8266.

Wire.begin(SDApin, SCLpin);

No ESP-01 você provavelmente vai ter que usar GPIO0 e GPIO2, por isso a inicialização fica assim:

Wire.begin(0, 2);

Em todos os casos você deve colocar resistores de pull-up de 4k7 nos GPIO que você escolheu para I2C. Atente para o fato de que alguns módulos i2C já vem com esses resistores.

No desenho SDA e SCL estão invertidos. Depois eu corrijo isso.

ESP-01_PCF8574_I2C

Postado em Sem categoria | Tags: , | Deixe um comentário (responderei para o seu e-mail)

Use o browser para debugar seu projeto que usa HTTP

Na maioria das vezes você não precisa instalar um proxy ou nada mais complicado para ver como está se comportando seu projeto. No Chrome, por exemplo, tecle F12 para abrir as ferramentas de desenvolvedor e clique na aba “network” (rede). Daí “visite” o seu projeto.
A cada clique que você der o Chrome vai mostrar que arquivos (CSS, imagens, javascript, etc) foram requisitados, que tamanho tinham, quanto tempo levou, quais não chegaram, a ordem das operações, etc.

http_debug_chrome_automalabs.com.br

Postado em Sem categoria | Deixe um comentário (responderei para o seu e-mail)