7 – ligar e desligar uma luz através da WEB (web app Java)

Agora vamos por todo o esquema para funcionar via internet, ou seja, através da internet, remotamente, você controlar a luz da sua casa, ou abstraindo nossos tutoriais, alterar o estado de uma das portas do arduino.

Novamente, vou usar Java para o exemplo. Como vamos usar o java para se comunicar via porta serial, como na etapa 6, precisamos então de um web container java para fazer com que as paginas interajam com o backend java. Eu usei no exemplo o tomcat7.

Espero que vocês estejam familiarizados com o mais simples conceito web de java, a servlet. Uma servlet recebe os parâmetros enviados por um form, por exemplo, via método GET ou POST, executa uma ação e devolve um retorno.

Logo,  para completarmos nosso exemplo, precisamos de uma servlet que receba parâmetros de uma pagina html, traduza para comandos do arduino e envie via porta serial. O exemplo é bem semelhante a etapa 6.

Então vamos lá. Criei a servlet ControlarLuz, que pega o parâmetro “comando”, enviado via GET ou POST e envia para o arduino via porta serial. Note que tem um método getSerialInterface que busca a classe de interface serial do contexto de aplicação (ou seja, uma instancia para todo o servidor WEB). Outro ponto a destacar é a definição da URL da servlet, através da annotation @WebServlet(“/ControlarLuz”). Isso quer dizer que, se você chamar a url http://localhost:8080/etapa7/ControlarLuz?comando=L, o comando L será enviado ao arduino e ligará a luz.

O código da servlet ficou assim (não se preocupe que o código esta no projeto, https://github.com/odelot/etapa7 (github)  ):

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ControlarLuz")
public class ControlarLuz extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public ControlarLuz() {
		super();

	}

	public SerialInterface getSerialInterface(HttpServletRequest request) {
		// colocando o controlador de comunicacao serial no contexto da
		// aplicação
		Object sc = request.getServletContext().getAttribute("serialComm");
		if (sc == null) {
			SerialInterface si = new SerialInterface("COM6", 9600);
			si.read(new SerialReadAction() {

				public void read(byte b) {
					System.out.print((char) b);

				}
			});
			request.getServletContext().setAttribute("serialComm", si);
			return si;
		}
		return (SerialInterface) sc;
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		SerialInterface si = getSerialInterface(request);
		// pega o comando
		String comando = request.getParameter("comando");
		// envia o comando
		if (comando != null)
			si.write(comando.getBytes());
		// redireciona para a pagina de controle
		response.sendRedirect("index.html");
	}

}

Quadro 7.1 – Código da Servlet. Reparece que você deve alterar a porta COM6 pela porta que o windows escolheu para seu arduino.

Bom, aqui já conseguimos alterar o estado da luz pela internet. É só abrir a porta do seu computador que o tomcat esta utilizando (e provavelmente configurar seu PC na DMZ do seu roteador) e acessar via o seu ip externo (o ip da internet… para descobrir use http://www.whatismyip.com/), algo parecido com isso http:// 177.159.64.254:8080/etapa7/ControlarLuz?comando=D

  Mas seria legal comandar via uma pagina html. Veja que o ultimo comando da servlet redireciona a pagina para index.html. Isso porque vamos construir uma index.html que enviar os comandos para a servlet. O código da pagina fica assim:

<html>
<head></head>
<body>
       <form action="ControlarLuz">
               <input type="radio" name="comando" value="L">Ligar</input>
               <input type="radio" name="comando" value="D">Desligar</input>
               <input type="radio" name="comando" value="I" checked="checked">Interruptor</input>
               <input type="submit" value="Enviar"/>
       </form>
</body>
</html>

Quadro 7.2 – Código da pagina html que se comunica com a servlet.

Logo, quando você acessar a raiz da sua aplicação, ou seja, http://localhost:8080/etapa7, essa sera a pagina renderizada e, através dessas opções, você poderá controlar a luz da sua casa via internet:

Image

Imagem 7.3 – renderização da index.html

Um detalhe que pode impedir o funcionamento desse exemplo é a localização das bibliotecas dinâmicas do RXTX (os .DLLs). Diferentemente da etapa6, que é uma aplicação java desktop e a JVM busca na raiz da execução  (no nosso caso, executando de dentro do eclipse, a raiz do projeto), um projeto web é iniciado na pasta do container web. Você deve informar a JVM do container web a localização dessas bibliotecas, através do atributo java.library.path. É possível fazer isso dentro do Eclipse, na opção “Run Configuration”, customizando a execução para o tomcat7, informando o caminho da raiz do projeto (onde estão as DLLs), como indicado na imagem abaixo:

Image

Imagem 7.4  – informando o caminho das DLLs à JVM através do argumento java.library.path

Veja o video de tudo isso funcionando:

Espero que vocês tenham aproveitado esses tutoriais de uso do Arduino. A partir dessas 7 etapas, vocês estão preparados para criar projetos maiores, que interajam com outros tipos de dispositivos e sensores, com aplicações mais complexas que as dos exemplos 6 e 7, em outras linguagens (é só saber como se comunica via porta serial em C#, por exemplo), enfim, com essa base acredito que o limite é a imaginação e determinação de vocês!

Anúncios

4 Comentários

Arquivado em Arduino, Automação Doméstica, Desenvolvimento, Eletrônica, Geek, Java, Tutorial

4 Respostas para “7 – ligar e desligar uma luz através da WEB (web app Java)

  1. Pedro Ferreira

    Olá,

    Obrigado pelo tutorial! Serve bem para aprender a usar servlets com o Arduino.
    Será que conseguias fazer um tutorial explicando como controlar um Arduino específico de entre uma série deles através de uma página web?

    Cumprimentos!

  2. Emanoel Izaias

    e muito bom galera indico pravoces

  3. Durval

    Muito bom estes tutorias….. pegando o básico consegue fazer muita coisa depois…..
    Parabéns

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s