Category Archives: Informação

ESP8266: Usar ESP Touch / SmartConfig é seguro?

Aparentemente, não.

Para quem não conhece, ESP Touch é o nome dado pela ESPRESSIF a um engenhoso método de comunicação de credenciais aparentemente copiado da Texas Instruments, que esta chama de SmartConfig (marca registrada Texas). Nesse método, um ESP8266 ainda não configurado, que não faz idéia de a qual rede se conectar e muito menos a senha, é colocado em “modo de monitoramento” e fica continuamente escutando o tráfego de todas as redes Wi-Fi a seu alcance (uma por vez, rapidamente).  Uma app rodando em um computador ou smartphone conectado a um roteador Wi-Fi o mais próximo do ESP8266 quanto possível transmite continuamente via pacotes UDP o SSID e a senha que você quer que o ESP8266 conheça.  Quando o ESP8266 finalmente esbarrar nessa informação ele se auto configura com o SSID e a senha coletados.

Nota: embora o protocolo permita que você transmita o SSID e a senha de um roteador diferente do qual está conectado, é recomendável que você se conecte ao mesmo roteador cuja senha quer dar ao dispositivo porque isso permite que a app detecte que o dispositivo se conectou (estarão no mesmo domínio de broadcast). Se o dispositivo se conectar a outro roteador provavelmente não será detectável. Por causa disso algumas apps nem te dão a opção de escolher o SSID.

Isso é possível mesmo numa rede criptografada porque a app codifica essa informação em um campo da transmissão Wi-Fi que qualquer um pode ver: o tamanho do pacote. É como usar código morse. O pacote continua criptografado, mas você pode ver o seu tamanho e esse tamanho corresponde a “uma letra” específica (não é exatamente assim, mas o princípio é esse).

Engenhoso e prático mas com um grande problema: qualquer outro dispositivo ou software compatível com SmartConfig ao alcance pode ver o mesmo tráfego e recuperar as credenciais de acesso. Aqui é explicado como se faz isso.

Aparentemente a Texas Instruments incluiu em versões mais recentes do Smart Config a capacidade de criptografar essa transmissão com AES. No caso a app e o dispositivo precisam ter combinado antes uma chave que vai ser usada para poder decodificar a transmissão (a app da Texas tem um campo para a chave, que vem em um QRCode no dispositivo). Essa é uma mudança trivial do ponto de vista do usuário, mas aparentemente não foi implementado no ESP8266. Segundo a documentação da biblioteca ESP8266 Arduino Core a sintaxe para iniciar o monitoramento é:

E apenas isso. Eu ficaria mais à vontade para usar o recurso se a sintaxe fosse algo como

E você precisasse colocar a mesma chave na app, junto com a senha do roteador.

A propósito, outro problema do SmartConfig é que raramente funciona e um dos problemas (mas não o único) é que o ESP8266 suporta apenas redes de 2.4GHz e a app não consegue diferenciar uma rede de 2.4GHz de uma de 5GHz. Pior ainda: se existirem duas redes com o mesmo SSID o Android dá preferência a se conectar à rede de 5GHz. Você ou o cliente do seu produto podem não se dar conta disso e o SmartConfig não vai funcionar. Usando o método “tradicional” de configuração se conectando ao SoftAP, pelo menos você tem menos chances de errar porque a varredura do ESP8266 só mostra as redes de 2.4GHz. Eu recomendo que você esqueça o SmarConfig e use SoftAP com CaptivePortal para a configuração.

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Como obter o endereço IP do cliente HTTP

Essa informação é útil quando, por exemplo, você precisa determinar se o cliente está conectado pelo SoftAP, porque o endereço IP do cliente normalmente estará na faixa 192.168.4.x.

Só vai funcionar corretamente em uma função que manipule uma requisição do servidor, como as definidas por “WebServer.on()”. Em outras o resultado pode ser “0.0.0.0” ou o endereço IP de outro cliente.

Testado com ESP8266 Arduino Core 2.3.0.

 

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: O tamanho do stack é fixo em 4KB

Isso pode pegar você de surpresa. Mesmo com 30KB ou mais de RAM livre seu programa vai dar stack overflow com resultados imprevisíveis se você usar mais de 4KB em alguma rotina ou sucessão de rotinas encadeadas, o que é muito fácil usando, por exemplo, manipulação de strings com ArduinoJSON.

Isso é definido em cores\esp8266\cont.h:

#define CONT_STACKSIZE 4096

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: Problemas enlouquecedores provocados por alimentação

Se você acha que problemas de alimentação só podem levar a travamentos e resets vai ficar espantado. Estes são os problemas que podem ocorrer na falta de um capacitor eletrolítico de desacoplamento na linha de 3.3V, bem perto do chip:

  • SoftAP com funcionamento irregular, chegando a ser impossível usar. Fica aparecendo e desaparecendo da lista de APs detectados pelo celular;
  • No modo STA ou AP_STA não conecta a certos roteadores. Dá consistentemente erro de senha errada, apesar de consistentemente conectar a outros e funcionar por semanas sem problemas aparentes.

Problema detectado com diversos módulos ESP-01 usando o firmware ESP8266 Arduino Core. O mais louco é que o primeiro problema desaparece se você fizer um downgrade para a versão 2.0.0 do Core. Com as versões mais recentes 2.3.0 e 2.4.0-rc2 sempre se manifesta. Isso faz você achar que se trata de um bug de software quando se dá conta de que módulos programados dois anos atrás não manifestam o problema. Tirando esses problemas o módulo funciona aparentemente sem falhas.

Colocar um capacitor de 220uF x 10V (100uF podem bastar) entre os terminais +3.3V e GND do módulo resolve o problema

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

ESP8266: O que fazer quando WiFi.hostname() não funciona

Primeiramente é preciso que fique claro que o hostname definido nesta função é o chamado “DHCP hostname” e praticamente só serve para definir o que aparece na listagem de “DHCP leases” do roteador. Você não vai pode usá-lo para dar um “ping” a não ser que seu servidor DHCP seja também um servidor DNS. O ESP8266 já tem um hostname padrão no formato ESP_XXXXXX onde XXXXX são os seis últimos caracteres do endereço MAC e você não precisa usar WiFi.hostname() se esse hostname for suficiente para você.

Requerimentos para que WiFi.hostname() funcione:

  • A função precisa ser executada antes de WiFi.begin();
  • Só funciona se o ESP8266 estiver configurado para obter IP por DHCP;
  • Você precisa reiniciar o roteador e depois obter um IP por DHCP para ver o novo nome aparecer na lista.

Testado com ESP8266 Arduino Core 2.3.0.

 

Postado em Informação | Tags: | Deixe um comentário (responderei para o seu e-mail)

Como fazer o Delphi executar uma função Javascript em um TwebBrowser

Meu exemplo é um resumo desta excelente explicação de Paul Johnson aqui.

Fazer isso é muito simples. Muito mais simples que o oposto, que é fazer o seu programa em Delphi responder a eventos que ocorrem no TwebBrowser.

Digamos que você tenha um componente TwebBrowser no seu projeto Delphi nomeado webbrowser1 que esteja carregado com uma página que tem a função javascript exibirGrafico(). Para chamar essa função você só precisa fazer algo assim:

Executar “ExecutaJS” no seu programa irá chamar a função “exibirGrafico()” carregada no documento HTML.

Note que a maior parte do que você vê acima é manipulação de erros. Se você não se preocupar com isso a procedure se resume a isto:

Só existe um inconveniente: você não pode receber o retorno da função. É possível contornar esse problema e o artigo de Paul explica como fazer, mas eu ainda não precisei dessa funcionalidade e por isso só vou abordar esse problema outro dia.

Note que o motivo número 1 para você se deparar com erros ao tentar executar o script é estar usando a configuração errada. O número 2 é esquecer que javascript é Case Sensitive. Isto é: exibirGrafico() e ExibirGrafico() são funções diferentes.

Como passar um parâmetro para a função.

Digamos que a função javascript exibirGrafico espere por um parâmetro texto que está no componente edit1. Você pode executá-la com algo assim:

 

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

Como criar um programa baseado em Chromium no Lazarus.

O Lazarus é mais ou menos uma tentativa de fazer uma versão opensource do Delphi.

Chromium é o nome da versão opensource do browser/navegador Google Chrome. Ao contrário do que acontece no Delphi, que já vem com tudo o que é necessário para criar um browser baseado no Internet Explorer, o Lazarus não vem com tal funcionalidade. O que vou explicar aqui será o suficiente para alguém que já programa em Delphi rodar sua primeira aplicação baseada no Chromium no Lazarus.

Você precisa de quatro coisas:

  • O Lazarus. Eu usei a versão 1.6.4 de 32 bits (em geral eu acho que versões de 64 bits só complicam as coisas);
  • Um componente chamado fpCEF3;
  • Um conjunto de bibliotecas e outros arquivos do projeto Chromium Embedded Framework (CEF);
  • O Winrar ou o 7-zip para poder abrir o arquivo acima.

É preciso ter em mente que o componente é feito para uma versão específica do CEF. Você deve baixar o componente e a versão do CEF feita para ele. Essa é possivelmente a parte mais complicada do processo e por isso eu vou detalhar aqui como eu fiz.

  • Vá na página de Releases do fpCEF3 e veja que versões estão disponíveis. Digamos que você queira fazer com a versão 3.3029, que hoje é a mais recente. Baixe o ZIP do source code dessa versão.
  • Vá na página de builds do CEF e procure pela build mais recente para o seu sistema operacional da versão que você escolheu. Note que nessa página existem seções para Linux, Windows e MAC OSX. 32 bits e 64 bits. Você deve baixar o aquivo “Standard” ou o “Minimal”. A build mais recente Standard para Windows de 32bits v3.3029 é esta. Você poderia usar a versão de 64 bits, mas enquanto está aprendendo é melhor limitar as complicações.

Baixar a build mais recente é importante porque o componente é configurado para a build mais recente. Não é frescura. Se você usar outra build pode ter problemas ao compilar ou rodar o programa.

Guarde esses arquivos porque senão mais tarde você pode ter problemas para refazer sua aplicação.

Instale o Lazarus;

OBS: No Lazarus a janela Mensagens é importante mas tem o hábito de desaparecer em segundo plano e deixar você sem saber o que está havendo. Sempre procure colocá-la em primeiro plano quando você achar que “algo deveria estar havendo” e você não está vendo nada.

Instale o componente. Isso é feito colocando a pasta “fpCEF3-x.xxxx” do componente dentro da pasta Components do Lazarus e depois clicando duas vezes em fpCEF3-x.xxxx\Component\cef3.lpk. Na janela que se abre clique em Compilar e aguarde aparecer “Sucesso” na janela de mensagens. Depois clique em Usar -> Instalar, em SIM no diálogo que vai aparecer e aguarde o Lazarus reiniciar.  Sim, ao contrário do Delphi o default do Lazarus requer reiniciar o editor ao instalar um componente. A partir desse ponto você deve ter uma aba “Chromium” na barra de componentes.

Descompacte a build do CEF. Você precisa do conteúdo das pastas “Release” e “Resources”;

O componente vem com projetos de exemplo. Para rodar um deles você precisa colocar na pasta do projeto os arquivos obtidos no passo anterior. Fica tudo misturado mesmo.

Como o Lazarus pode criar para várias plataformas ele pode “se perder” e querer compilar para Linux apesar de você estar no Windows. À esquerda do botão Executar existe o botão “Modo de Construção” (Build Mode) que controla isso. Certifique-se de estar no modo certo.

Problemas que podem acontecer:

Exceção ao rodar o programa pode acontecer ao usar a build errada do CEF ou porque o programa não está achando os arquivos.

Ao executar o navegador fica em branco: Experimente colocar um botão que ao ser clicado manda abrir o navegador no Google e clique nesse botão depois que o programa abrir completamente. Existe um problema de “timing” nos exemplos (que não ocorre nos exemplos do CEF4Delphi) que faz o programa ignorar a página que deveria abrir automaticamente. Se mesmo assim não funcionar a documentação diz que o CEF pode estar travando e talvez você precise de outra combinação de componente e build.

 

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

Como criar um programa baseado em Chromium no Delphi 7.

Chromium é o nome da versão opensource do browser/navegador Google Chrome. Normalmente você não precisa disso porque o Delphi 7 já vem com tudo o que é necessário para criar um browser baseado no Internet Explorer, que é o suficiente em projetos de automação (o foco deste blog). Na maioria das vezes os erros no uso de twebbrowser são provocados pela falta de uma configuração. Mas se por alguma razão o Chromium for realmente necessário, o que vou explicar aqui será o suficiente para alguém que já programa em Delphi rodar sua primeira aplicação baseada no Chromium.

Você precisa de quatro coisas:

  • O Delphi 7, claro;
  • Um componente chamado CEF4Delphi;
  • Um conjunto de bibliotecas e outros arquivos do projeto Chromium Embedded Framework (CEF);
  • O Winrar ou o 7-zip para poder abrir o arquivo acima.

É preciso ter em mente que o componente é feito para uma versão específica do CEF. Você deve baixar o componente e a versão do CEF especificada. Guarde esses arquivos porque senão mais tarde você pode ter problemas para refazer sua aplicação.

  • Baixe o CEF4Delphi aqui. Clique em “Clone or Download”;
  • Na mesma página, siga o link para baixar o arquivo do CEF desejado. Eu usei o de 32bits.

A instalação do Delphi4CEF é quase como a de qualquer outro componente:

  • Crie uma pasta vazia chamada “dcu” dentro do diretório “Sources”;
  • Clique duas vezes em “Sources\CEF4Delphi_D7.dpk”, compile e instale. Uma nova aba “Chromium” deve aparecer na barra de componentes;
  • Adicione o diretório Sources do componente ao Library Path do Delphi;

No diretório “demos” você encontrará diversos exemplos de uso, mas para funcionar você ainda precisa fazer algumas coisas:

  • Apague todos os arquivos que não são requeridos em um projeto do Delphi7. No meu caso a presença de algum deles estava travando o Delphi logo ao abrir o projeto;
  • Apague os arquivos .res (serão recriados automaticamente) para evitar um erro de access violation  em RLINK32;
  • Comente a linha {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} no código-fonte.

A partir deste ponto você deve ser capaz de compilar o demo. Vai dar um erro “CEF Binaries Missing!” que significa que não pode achar o CEF, mas é normal. Enquanto o programa não compilar não adianta prosseguir. Releia o explicado acima.

O programa compilou? Agora abra o arquivo do CEF no Winrar ou 7-zip (é normal demorar a abrir) e extraia todo o conteúdo dos diretórios “Resources” e “Release” para o mesmo diretório do exemplo que você quer rodar. Você precisa fazer isso para cada um deles que você queira rodar. Sim, os arquivos vão ficar misturados com os arquivos do projeto.

Agora execute o programa de novo. O navegador baseado em Chromium deve abrir.

Se continuar dando o erro “CEF Binaries Missing!” verifique se o código-fonte especifica onde devem ser colocados os arquivos. Por exemplo, o demo “Geolocation” faz as seguintes especificações:

Você pode comentar essas linhas (em especial as três primeiras) ou colocar os arquivos nos diretórios certos.

 

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

Como fazer o componente TwebBrowser usar/emular uma versão específica do IE.

Isso é para quem programa em C++, Delphi, etc e usa o componente twebbrowser para construir um programa baseado em navegador.

Como todos devem saber esse componente usa o engine do Internet Explorer instalado no Windows. O que você talvez não saiba é que por default esse engine quando é “embarcado” em um programa é configurado para entrar em um modo de compatibilidade onde personifica uma versão anterior do IE. Até mesmo no Windows 8.1 de 64bits com o IE11 instalado seu programa vai emular o IE7.

O resultado disso é que certas páginas que abrem sem qualquer problema no IE da máquina vão acusar erro no seu programa. Os mais comuns são erros de script como este:

ie_erro_script_wrongIEversion_automalabs.com.br

Para saber que versão do IE seu programa está emulando faça-o abrir uma página que diga isso, como http://www.useragentstring.com/

Método 1

Isso é configurável pelo Registro. Você precisa ir na chave:

HKEY_LOCAL_MACHINE (ou HKEY_CURRENT_USER)
SOFTWARE
Microsoft
Internet Explorer
Main
FeatureControl
FEATURE_BROWSER_EMULATION

E adicionar um item “NomedoSeuPrograma.exe” com um valor DWORD que corresponde à versão do IE que você quer que seu programa use.

A lista dos valores pode ser vista aqui. Em resumo (valores  em DECIMAL):

  • 11001 – IE 11 modo Edge
  • 11000 – IE11
  • 10001 – IE10 forçado – ignora !DOCTYPE
  • 10000 – IE10
  • 9999 – IE9 forçado – ignora !DOCTYPE
  • 9000 – IE9
  • 8888 – IE8 forçado – ignora !DOCTYPE
  • 8000 – IE8
  • 7000 – IE7

Se fizer a inclusão em HKEY_LOCAL_MACHINE isso val valer para todos os usuários da máquina, mas requer privilégios de administrador para isso. Já a inclusão em HKEY_CURRENT_USER vale apenas para o usuário atual mas seu programa pode mexer nessa chave sem precisar de privilégios.

Você não pode emular uma versão do IE superior à instalada na máquina.

Método 2

Você também pode definir isso via HTML. Não vai precisar mexer no Registro mas cada página precisará ser alterada. Obviamente só é viável quando todas as páginas que seu programa vai exibir são criadas por você.

Basta acrescentar algo assim em HEAD:

Isso instrui o mecanismo do IE a exibir o documento como se fosse o IE9

Isso instrui o mecanismo do IE a exibir o documento como se fosse o Edge

Mais uma vez, você não pode emular uma versão do IE superior à instalada na máquina.

Postado em Informação | Deixe um comentário (responderei para o seu e-mail)

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: “please 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 Informação | Tags: , | Deixe um comentário (responderei para o seu e-mail)