Ir al contenido principal

Te puede intersar

Conectando ESP8266 a la nube de Amazon(AWS) - Core IOT

Un complemento más para el alcoholimetro [JAVA+ARDUINO]

Continuando con el alcoholimetro que realizamos anteriormente, el cual te recomiendo que visites dando clic AQUI para poder seguir lo que haremos a continuación,  esta vez realizaremos una conexión de nuestro programa con una interfaz remota en otro ordenador usando una comunicación de cliente servidor.

(Interfaz que realizamos en la entrada anterior)


Para ello utilizaremos la interfaz gráfica que realizamos antes y le adicionaremos un socketServer con la finalidad de monitoriar conexiones entrantes de un software cliente el cual también programaremos,  una vez se establezca esta conexión (cliente - servidor) veremos las mediciones realizadas por nuestro alcoholimetro desde la interfaz de nuestro cliente, claro si es que hay mediciones validas, entonces comenzemos.

Realizando los cambios a la interfaz de java

Primero vamos al código que realizamos anteriormente y agregamos el siguiente codigo:


//Hilo para iniciar el servidor
public class iniciarServidor implements Runnable{
    //Parametros para el servidor
    int puerto = 5000;
    ServerSocket serv;
    Socket soc;
    String mensaje;
	    
    //Metodo principal del hilo
    public void run (){
    //declaramos canales de entrada y salida de datos
    DataInputStream entrada;
    DataOutputStream salida;
			
    try {
        //asignamos el puerto por el cual escucha el servidor
	serv = new ServerSocket(puerto);
        //Creamos un socket para manejar el servidor
	soc = new Socket();
	//Ingresamos texto en la caja de incidencias.
	txaLog.append("*Servidor iniciado\n");
				
	while(true) {
	    //Aceptamos la conexion entrante
	    soc = serv.accept();
					
	    //Creamos los canales de entrada y salida
	    entrada = new DataInputStream(soc.getInputStream());
	    salida = new DataOutputStream(soc.getOutputStream());
					
	    //Enviamos data al cliente 
	    salida.writeUTF(lblDato.getText());
	    //Cerramos conexion
	    soc.close();
	}
    }catch(Exception e) {
        System.err.print(e);
    }
    }
}


Ahora en el metodo public void conectar(String portName) realizamos la siguiente modificacion:


public void conectar(String portName) throws Exception{
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
    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 puertoSerial = (SerialPort) commPort;
		puertoSerial.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                
		in = puertoSerial.getInputStream();
		out = puertoSerial.getOutputStream();
 
		(new Thread(new SerialReader(in))).start();
                        //Agregamos esta linea para iniciar el hilo de servidor
		(new Thread(new iniciarServidor())).start();
	    }else
		System.out.println("Error: Only serial ports are handled by this example.");
    }     
}

Con estos cambios ya tenemos lista nuestra interfaz principal, ahora realicemos nuestro cliente.Creamos un nuevo proyecto o una nueva clase en java, y escribimos el siguiente código:


//Importamos las librerias necesarias
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class cliente extends JFrame implements ActionListener{
	
    //Variables globales
	String host;
	int puerto = 5000;
	Socket sc;
	DataOutputStream salida;
	DataInputStream entrada;
	
	JLabel lblIp;
	JTextField txtIp;
	JButton btnEst;
	JButton btnPar;
	
	JLabel lbltxa;
	JLabel lblValor;
	int l;
	
    //Metodo constructor
	public cliente() {
    	//Especifamos el diseño de nuestra interfaz
		setTitle("Alcoholimetro remoto");
		setSize(360,200);
		setLayout(null);
		setLocationRelativeTo(null); 
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		lblIp = new JLabel("IP SERVIDOR:");
		lblIp.setBounds(10, 25, 80, 20);
		
		txtIp = new JTextField();
		txtIp.setBounds(90, 25, 120, 20);
		
		btnEst = new JButton("Conectar");
		btnEst.setBounds(225,10,100,20);
		btnEst.addActionListener(this);
		
		btnPar = new JButton("Parar");
		btnPar.setBounds(225, 35, 100, 20);
		btnPar.addActionListener(this);
		
		lbltxa = new JLabel("Medida del alcoholimetro:");
		lbltxa.setBounds(10, 100, 200, 30);
		lbltxa.setFont(new Font("Calibri",3,16));
		
		lblValor = new JLabel();
		lblValor.setBounds(200,100,100,30);
		lblValor.setFont(new Font("Calibri",3,20));
		
		this.add(lblIp);
		this.add(txtIp);
		this.add(btnEst);
		this.add(lbltxa);
		this.add(lblValor);
		this.add(btnPar);
	}
	
    //Hilo para iniciar cliente
	public class iniciarCliente implements Runnable {
		//Metodo principal del hilo
		public void run() {
			//Ejecutamos este bloque hasta que se pulse el boton parar
			while(true) {	
				try {
					sc = new Socket(host,puerto);
					entrada = new DataInputStream(sc.getInputStream());
					salida = new DataOutputStream(sc.getOutputStream());
					
					String mensaje = entrada.readUTF();
					
					if(mensaje.equals("")) {
						lblValor.setText("N/A");
					}else {
						lblValor.setText(mensaje);		
					}
					//Validamos si el boton para se ha pulsado
					if(l == 1){
						sc.close();
						break;
					}
	
					sc.close();
				}catch(Exception e) {
					System.err.print(e);
				}
			}
		}
	}
	//Metodo principal de nuestro programa
	public static void main(String[] args) {
		cliente c = new cliente();
		c.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
    	//En caso se presione el boton Conetar
		if(e.getSource().equals(btnEst)) {
			l = 0;
			host = txtIp.getText();
			if(host.equals("")) {
				JOptionPane.showMessageDialog(null,"Agrege la direccion ip del servidor");
			}else {
				(new Thread(new iniciarCliente())).start();			
			}
		}
		//En caso se presione el boton Parar
		if(e.getSource().equals(btnPar)){
			l = 1;
			lblValor.setText("");
		}
		
	}
}

Al ejecutar nuestro programa veremos la siguiente interfaz:

Veamos ahora como funciona:

Primero debemos ejecutar nuestro programa principal de alcoholimetro, le damos en conectar y en iniciar, empezara a tomar mediciones. 

Seguidamente vamos al programa de cliente, especificamos la ip del servidor y damos en conectar, ahora veremos la data que esta sensando nuestro alcoholimetro desde nuestro cliente en otro computador. 

Si queremos para el programa le damos en Parar y para reanudar nuevamente en continuar.

Y Listo!! con esto acabamos  por ahora.

Para finalizar

Como hemos podido ver hasta ahora estos programas son algo simples pero cumplen su objetivo el cual es comunicar un arduino con una interfaz en java y como adicional mandar información a través de red aunque claro hoy en dia existen otras opciones que nos permitirían enviar data por red tales como el shield ethernet de arduino o un modulo esp32 entre otros, sin embargo esta es una opción valida ya que solo necesitamos nuestra pc. Mirando a otra parte en este proyecto hemos usado un sensor MQ3 pero tenemos la libertad de usar otros sensores ademas de no limitarnos a solo 1 dependiendo de la versión de arduino que utilices puedes usar múltiples de ellos. Entonces a partir de ahora podemos jugar con los sensores que tengamos, cambiar nuestra interfaz gráfica y probar con diferentes elementos o conocimientos que tengamos  para así hacer nuevos proyectos.

Muchas gracias por tu tiempo.


Descarga el código utilizado dando clic en el botón de abajo


Comentarios

Entradas populares