Author Archives: Jefferson

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)

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 Informação | 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 Informação | 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 Informação | 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 Informação | 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 Informação | Tags: | 2 Comments