sexta-feira, 31 de janeiro de 2014

Pi4j, Wiiring Pi e libpi4j.so - mais um problema resolvido no hackathon soujava da Campus Party 2014!

Ae galera,

Outro problema que enfrentamos foi para executar o pi4j no tomcat no raspberry para trocar o estado de portas digitais do Rpi. Por alguma razão, aplicativos tipo "main" que usam o pi4j não apresentaram este problema mas executando um servlet no tomcat isso acontece.

Basicamente a JVM não encontra o código nativo libpi4j.so ao executar o servlet que tenta chavear a porta digital do RPi e de fato eu não encontrei este arquivo na distribuição que fornecemos para o hackathon, bom começo!

A solução foi baixar o zip do pi4j, descompactamos ele e encontramos o libpi4j.so no pi4core directory. Copiamos o libpi4j.so para o diretório /home/pi/java/jdk1.8/jre/lib/ext e boa! Ops, também não deu certo.

Na tentativa seguinte demos permissão de execução com chmod 755 libpi4j.so e pronto, funfou. Nada grave, a pergunta é: porque funciona com apps java com método main? Seguir cenas do próximo capítulo!

Como acessar o Java Embedded Panel com Jersey Client facinho facinho! - Campus Party 2014

É assim bem simples, crie um projeto no NetBeans e depois adicione a biblioteca Jersey clicando com botão direito do mouse nas propriedades do projetos -> bibliotecas.

Ai copia e cola este código:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package embeddedpanel;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

/**
 *
 * @author root
 */
public class EmbeddedPanel {

    public static void main(String[] args) {
        System.out.println("External Temperature: " + getTemperature());
        System.out.println("Humidity            : " + getHumidity());
        System.out.println("Distance            : " + getDistance());
        System.out.println("Alcohol             : " + getAlcohol());
        setRGB(255, 0, 0);
        setRGB(0, 255, 0);
        setRGB(0, 0, 255);
    }

    public static void setRGB(int red, int green, int blue) {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.12:8080/things/red/" + red);
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        webResource = client
                .resource("http://192.168.1.12:8080/things/green/" + green);
        response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        webResource = client
                .resource("http://192.168.1.12:8080/things/blue/" + blue);
        response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }

    }

    public static float getTemperature() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/temp_out");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Float.parseFloat(output);

    }

    public static float getHumidity() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/humidity");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Float.parseFloat(output);

    }

    public static int getDistance() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.11:8080/things/distance");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Integer.parseInt(output);

    }

    public static int getAlcohol() {
        Client client = Client.create();
        WebResource webResource = client
                .resource("http://192.168.1.12:8080/things/alcohol");
        ClientResponse response = webResource.accept("text/plain")
                .get(ClientResponse.class);
        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }
        String output = response.getEntity(String.class);
        return Integer.parseInt(output);
    }
}

E boa!

Ah, se estiver aqui na Campus não esqueca de entrar na rede WIFI do Embedded Panel:

WIFI: iot
PWD: iotiotiot

É assim bem simples começar a usar Internet of Things sem ter que soldar nem programar placas!

Boa Diversão,
Vinicius Senger