Mudanças entre as edições de "Trabalho da Jessica"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 319: Linha 319:
  
 
*Compilação : javac -cp /usr/share/java/RXTXcomm.jar:. Nome_do_Código.java
 
*Compilação : javac -cp /usr/share/java/RXTXcomm.jar:. Nome_do_Código.java
 
 
 
*Execução: java -Djava.library.path=/usr/lib/jni -cp /usr/share/java/RXTXcomm.jar:. Código_compilado
 
*Execução: java -Djava.library.path=/usr/lib/jni -cp /usr/share/java/RXTXcomm.jar:. Código_compilado
 
  
 
==Problemas Encontrados==
 
==Problemas Encontrados==
Linha 335: Linha 332:
 
ln -sf /dev/ttyACM0 /dev/ttyUSB0  
 
ln -sf /dev/ttyACM0 /dev/ttyUSB0  
  
 
+
OBS: O Arduino as vezes para de reconhecer a porta ttyUSB0.
OBS: o Arduino as vezes para de reconhecer a porta ttyUSB0.
 
 
 
  
 
==Possível Solução==
 
==Possível Solução==

Edição atual tal como às 12h28min de 18 de dezembro de 2013

Etapas da Fase 1

  1. Estudar e implementar um exemplo básico de programa Java transmissor-receptor (periódico) de um dado simples (struct com time stamp e valor float) usando o protocolo UDP;
  2. Instalar uma base de dados MySQL e criar uma tabela para armazenamento dos dados do sensor;
  3. Modificar o programa Java para inserir o dado na base de dados;
  4. Modificar o programa Java receptor para receber o dado transmitido pelo programa do Arduíno;
  5. Usar um cliente MySQL para consultar a base e verificar o correto armazenamento;
  6. Avaliar o sistema em conjunto com o Giulio e com a equipe


Bibliografia

  1. Exemplo de programa Java UDP [1]
  2. Instalação e criação de tabela MySQL no Linux [2];


Etapas

Data:26/09 - última reunião
Data:27/09 - 05/10 - Pesquisa e estudo de conceitos novos em Java, conceitos de redes,entre outros.
305/10- 7/10 - implementação da Aplicação Java com Banco de Dados (erro para conexão da aplicação Java com o Banco).
08/10 - Erro com a conexão RESOLVIDO!

SEMANA DO DIA 26/09 ­ 08/10

Atualmente o projeto se resume em duas partes:

  • A parte onde teremos o sensor e o Arduino enviando Dados para uma máquina(Giulio), para fins de melhor compreensão essa máquina será o “cliente”, dentro do que chamamos de arquitetura Cliente/Servidor.
  • A outra parte seria as aplicações em Java rodando no “cliente” e no servidor. Essas aplicações vão se comunicar por um protocolo (TCP/UDP) que ainda não foi definido. No lado da máquina “cliente” teremos uma aplicação Java que será responsável por:
    • Receber dados do sensor e do Arduino;
    • Tratar esses dados(que tipo de dado?,quais dados?...);
    • enviar essas dados para a Aplicação Java que está no Servidor via a algum protocolo ainda não definido (como TCP ou UDP);
  • O servidor será responsável por:
    • receber os dados do “cliente”;
    • enviar esses dados para o Banco de Dados (SQL+JAVA);
    • OBS: para a aplicação Java poder se comunicar com o Banco de Dados é preciso instalar um Drive de comunicação, é este drive que será a interface da aplicação Java com o Banco de Dados. Requisitos:
    • Servidor MySQL ( Já está Instalado!);
    • PHPMyAdmin ­ gerenciador do Banco de Dados(Já está Instalado!);
    • Drive de Conexão com o MySql (Já instalado!);
    • Aplicação Java ­ Servidor (Iniciado mas ainda não terminado!);

Problemas encontrados:

  • Driver de Conexão com o MySql: como já havia citado anteriormente para a aplicação Java que está “rodando” no servidor se comunicar o Banco de Dados precisa ser instalado um Driver de acordo com o Banco Usado, no nosso caso um driver específico para o MySql, esse driver assim como toda a interface que fará essa comunicação será o JDBC e seu driver será o msql.JDBC.Driver, que pode ser baixado no site do mySql:
     http://dev.mysql.com/downloads/connector/j/#downloads
  • Escolha a plataforma de acordo com o sistema operacional que está sendo usado, como no nosso projeto estamos usando Linux, escolhemos plataforma independente, extraimos o arquivo escolhemos o arquivo já compilado .jar e adicionamos no Eclipse (editor de código para Java): Project > Properties > Java Build Path > Add External JARs.

Terá duas possibilidades de Driver o da Oracle ou do MySql, a principio o problema de comunicação que estava dando é que estava sendo usado o Driver errado (o da Oracle ao invés do MySql), esse driver deve ser adicionado no código java de conexão assim como se segue:

        “com.mysql.jdbc.Driver”


A imagem a seguir demonstra como o projeto está estruturado atualmente:


FigTrabalhoJessica1.png

Código de Conexão com o Banco:

package conexao;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConBanco {

	Connection conexao = null;

	public ConBanco(Connection con) {

		con = this.conexao;
	}

	public Connection getConnection() {

		try {

			String url = "jdbc:mysql://localhost:3306/"; // 3306 e a porta do MySql
								 
			String dbName = "energia";
			String driver = "com.mysql.jdbc.Driver";
			String user = "root";
			String senha = "jessica2604"; // senha do banco de dados

			Class.forName(driver).newInstance();
			this.conexao = DriverManager.getConnection(url + dbName, user, senha);
			System.out.println("Conectado " + this.conexao + ".");

		} catch (Exception e) {
			System.out.println("Erro ao se conectar com o Banco");
			e.printStackTrace();
		}
		return this.conexao;
	}

}

Código do Servidor - armazena na base um dado simples passado no objeto da classe principal:

package conexao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import conexao.ConBanco;

public class Servidor {

	double pot;
	int identificador;

	public Servidor(int id, double dado) {

		this.pot = dado;
		this.identificador = id;
	}

	public void EnviaDado() {

		Connection con = null;
		ConBanco conecta = new ConBanco(con);
		Statement stmt;

		con = conecta.getConnection();
		try {

			stmt = con.createStatement();
			stmt.executeQuery("Use energia");
			String sql = "INSERT INTO Dado(id,potencia) " + "VALUES('" + this.identificador + "', '" + this.pot + "')";
			stmt.executeUpdate(sql);
			stmt.close();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Dado Enviado");

	}

}

Class MainServidor:

package conexao;

public class MainServidor {

	public static void main(String args[]) {

		Servidor server = new Servidor(1,23); //passa o id e o valor da potência
		server.EnviaDado();

	}
}

Etapas da Comunicação Serial com o Java

Assim como no Banco de Dados com o Java, para o Java poder reconhecer e trabalhar com as portas seriais como a COM1,COM2 e USB foi preciso instalar uma API especifica do JAVA para este fim. Há duas APIs disponíveis a Javacomm (da SUN) e a RXTX, a escolhida neste projeto foi a RXTX (versão 2.2pre2). Abaixo está o link para download desta API:

Linux

Tive muitos problemas para a instalação desta API no linux, primeiramente tentei usar o arquivo .jar no Eclipse assim como tinha feito com o JDBC (Banco de Dados), tentei o próprio plugin do eclipse que é oferecido no link, mas não tive bons resultados. Outro problema encontrado é que o Linux versão 12.04 -64 bits não aceita qualquer versão da API, a única que não deu problema foi a citada anteriormente e 2.2pre2. A seguir está descrito todos os passos necessário para a instalação correta da API RXTX.

Instalação (Linux - 64 bits)

  • Após o download entre no diretório e descompacte o arquivo com o seguinte comando (neste caso o arquivo é .zip):
    • unzip nome_do_arquivo.zip
  • Entre dentro da pasta descompactada com o seguinte comando:
    • cd nome_da_pasta ou cd caminho_relativo/nome_da_pasta
  • Copie o arquivo RXTXcomm.jar para os seguintes diretórios:
    • 1°: usr/share/java com o seguinte comando: cp nome_do_arquivo /usr/share/java
    • 2°: /usr/lib/jvm/java-versao-do-java/jre/lib/ext/ com o comando cp nome_do_arquivo /usr/lib/jvm/java-versao-do-java/jre/lib/ext/
  • Copie o arquivo librxtxSerial.so para o jvm (máquina virtual do Java). Mas tome cuidado esse arquivo tem que ser de acordo com a arquitetura do processador, no nosso caso o arquivo teve que ser referente a arquitetura x86_64 que estava no diretório de mesmo nome.
    • Entre na pasta x86_64.. e copie o arquivo com o seguinte comando: cp librxtxSerial.so /usr/lib/jvm/java-versao-do-java/jre/lib/amd64/

Códigos

  • 1° código: Listagem das portas seriais
import gnu.io.*;

public class ListCommPorts {

    @SuppressWarnings("unchecked")
    static void listPorts()
    {
        java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
        while ( portEnum.hasMoreElements() ) 
        {
            CommPortIdentifier portIdentifier = portEnum.nextElement();
            System.out.println(portIdentifier.getName()  +  " - " +  getPortTypeName(portIdentifier.getPortType()) );
        }        
    }
    
    static String getPortTypeName ( int portType )
    {
        switch ( portType )
        {
            case CommPortIdentifier.PORT_I2C:
                return "I2C";
            case CommPortIdentifier.PORT_PARALLEL:
                return "Parallel";
            case CommPortIdentifier.PORT_RAW:
                return "Raw";
            case CommPortIdentifier.PORT_RS485:
                return "RS485";
            case CommPortIdentifier.PORT_SERIAL:
                return "Serial";
            default:
                return "unknown type";
        }
    }

	public static void main(String[] args) {
		listPorts();
	}
}
  • 2° código: leitura de dados da porta serial
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ReadSerialPort {

	public ReadSerialPort() {
		super();
	}
	
    void connect (String portName) throws Exception {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
	System.out.println("Conectou");
        if ( portIdentifier.isCurrentlyOwned() ){
            System.out.println("Error: Port is currently in use");
        } else {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
            
            if ( commPort instanceof SerialPort ) {
                SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.FLOWCONTROL_NONE);
                
                InputStream in = serialPort.getInputStream();
                (new Thread(new SerialReader(in))).start();

            } else {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }     
    }

    
    /** */
    public static class SerialReader implements Runnable {
        InputStream in;
        BufferedReader reader;
        
        public SerialReader ( InputStream in ) {
            this.in = in;
            this.reader = new BufferedReader(new InputStreamReader(in));
        }
        
        public void run () {
            String line = null;
            try{
               while ((line = reader.readLine()) != null) {
            	   System.out.println("Read line with " + line.length() + " characters: \"" + line + "\"");
               }
            }
            catch ( IOException e ) {
                e.printStackTrace();
            }            
        }
    }

	public static void main(String[] args) {
        try {
            (new ReadSerialPort()).connect("/dev/ttyS0");
        } catch ( Exception e ) {
            e.printStackTrace();
        }
	}
}

Compilação

Os códigos foram compilados e executados via terminal com os seguintes comandos:

  • Compilação : javac -cp /usr/share/java/RXTXcomm.jar:. Nome_do_Código.java
  • Execução: java -Djava.library.path=/usr/lib/jni -cp /usr/share/java/RXTXcomm.jar:. Código_compilado

Problemas Encontrados

No Linux as portas COM1,COM2 e USB são reconhecidas da seguinte forma: ttyS0 - COM1; ttyS1 - COM2; ttyUSB0 - USB;

Como em nosso projeto estamos usando o Arduino e o módulo Xbee, a placa do Arduino é reconhecida pelo sistema como ACM0, mas como o Java reconhece apenas ttyUSB0 tivemos que criar um link para que a ACM0 apontasse para a ttyUSB0, através do seguinte comando:

ln -sf /dev/ttyACM0 /dev/ttyUSB0

OBS: O Arduino as vezes para de reconhecer a porta ttyUSB0.

Possível Solução

Ao invés de baixar os arquivos binários foi baixado outro pacote com os arquivos ainda não compilados no mesmo link citado no começo do texto. A parte da biblioteca continua a mesma a única diferença é que na pasta onde fica as classes seriais no gnu.io foi modificado o arquivo RXTXCommDriver.java foi uncluido na linha 581: "ttyACM", Desse jeito o RXTX deverá reconhecer esta porta sem precisar mais do link simbólico. Depois disso na pasta raiz do RXTX foi feito os seguintes comandos para configurar e compilar a alteração feita:

  • sh ./configure
  • make

Depois de feito isso será gerado o RXTX.jar, apague o RXTX.jar anterior dos diretórios citados nos passos da instalação e coloque esse novo arquivo gerado no lugar deles.