Mudanças entre as edições de "Trabalho da Jessica"
(→Linux) |
|||
(9 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 194: | Linha 194: | ||
*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. | *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/ | **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 | ||
+ | <syntaxhighlight lang=java> | ||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *2° código: leitura de dados da porta serial | ||
+ | <syntaxhighlight lang=java> | ||
+ | |||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==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. |
Edição atual tal como às 12h28min de 18 de dezembro de 2013
Etapas da Fase 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;
- Instalar uma base de dados MySQL e criar uma tabela para armazenamento dos dados do sensor;
- Modificar o programa Java para inserir o dado na base de dados;
- Modificar o programa Java receptor para receber o dado transmitido pelo programa do Arduíno;
- Usar um cliente MySQL para consultar a base e verificar o correto armazenamento;
- Avaliar o sistema em conjunto com o Giulio e com a equipe
Bibliografia
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:
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.