Foros del Web » Programación para mayores de 30 ;) » Java »

establecer comunicación con dispositivo ZLAN 6042

Estas en el tema de establecer comunicación con dispositivo ZLAN 6042 en el foro de Java en Foros del Web. Buenas, a ver si podéis echarme una mano. Tengo un dispositivo ZLAN 6042 como este: zlan 6042 Es un dispositivo de entrada y salida. Tiene ...
  #1 (permalink)  
Antiguo 08/01/2019, 10:22
 
Fecha de Ingreso: junio-2011
Mensajes: 148
Antigüedad: 7 años, 6 meses
Puntos: 2
establecer comunicación con dispositivo ZLAN 6042

Buenas,

a ver si podéis echarme una mano. Tengo un dispositivo ZLAN 6042 como este:
zlan 6042
Es un dispositivo de entrada y salida. Tiene una ip y un puerto.
Tengo el applet de java:
Código:
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;

public class testrec extends Applet implements ActionListener,Runnable 
{
	private TextField m_TextFiledIP;
	private TextField m_TextFiledPort;
	private Button m_BtnConnect;
	
	
	private TextArea m_TextAreaRec;

    Socket m_conSocket;
    DataOutputStream m_out;
    DataInputStream m_in;
    int m_iConnect=0;
    
    Thread m_ThreadRec;
	
	protected Button makebutton(String name, GridBagLayout gridbag,GridBagConstraints c) 
	{
		Button btn = new Button(name);
		gridbag.setConstraints(btn, c);
		add(btn);
		return btn;
	}
 
	protected void makelabel(String name, GridBagLayout gridbag,GridBagConstraints c) 
	{
		Label label= new Label(name,Label.LEFT);
		gridbag.setConstraints(label, c);
		add(label);
	}
	protected TextField makeTextField(String name,int len, GridBagLayout gridbag,GridBagConstraints c) 
	{
		TextField field;
		field= new TextField(name,len);
		gridbag.setConstraints(field, c);
		add(field);
		return field;
	}
	protected TextArea makeTextArea(String name,int lenx,int leny, GridBagLayout gridbag,GridBagConstraints c) 
	{
		TextArea field;
		field= new TextArea(name,lenx,leny,TextArea.SCROLLBARS_VERTICAL_ONLY);
		gridbag.setConstraints(field, c);
		add(field);
		return field;
	}
	
	private String GetHostIP()
    {
        
        return getCodeBase().getHost();
        
/*        String s1 = "";
        if(s.length() < 15)
            return s;
        for(int i = 0; i < 16; i += 4)
            s1 = s1 + String.valueOf(Long.valueOf(s.substring(i, i + 3), 16)) + '.';

        return s1.substring(0, s1.length() - 1);
*/
    }
    
	public void init() 
	{
		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints c = new GridBagConstraints();
		setLayout(gridbag);
		c.anchor=GridBagConstraints.NORTHWEST;
		c.insets=new Insets(1,1,1,1);
		c.gridwidth=1;
		makelabel("设备地址:",gridbag, c);
		m_TextFiledIP=makeTextField(GetHostIP(),12,gridbag,c);
		m_TextFiledIP.enable(false);
		makelabel("端口:",gridbag, c);
		m_TextFiledPort=makeTextField("4001",5,gridbag,c);
		c.gridwidth = GridBagConstraints.REMAINDER; //本行结束
		m_BtnConnect=makebutton("连接",gridbag,c);
		m_BtnConnect.addActionListener(this);
		m_BtnConnect.setActionCommand("Connect");
		
		
		makelabel(" ",gridbag, c);
		makelabel("接收数据区:",gridbag, c);
		c.gridwidth = GridBagConstraints.REMAINDER; //本行结束
		m_TextAreaRec=makeTextArea("",5,50,gridbag,c);
		
    	m_conSocket=null;
    	m_out=null;
    	m_in=null;
    	
		m_ThreadRec=new Thread(this,"RecThread");
		m_ThreadRec.start();
    
    	resize(500,400);
	}
    public void destroy()
    {
		m_ThreadRec.stop();
        m_ThreadRec = null;
    }
    
	public byte[] ConvertStrtoHex(String str,int len)
	{
		byte bufarr[]=new byte[len];
		
		for(int i=0;i<len;i++)
		{
			bufarr[i]=Byte.parseByte(str.substring(i*3,i*3+2),16);
		}
		
		return bufarr;
	}
	
	public void actionPerformed(ActionEvent e)
	{
		if(e.getActionCommand()=="Connect")
		{
    		if(m_iConnect==0)
    		{
    			if(TCPInit()==1)
				{
					m_BtnConnect.setLabel("断开");
					m_iConnect=1;

				}
    		}
    		else
    		{
    			TCPClose();
    			m_BtnConnect.setLabel("连接");
    			m_iConnect=0;
    		}
		}
	} 

	public void TCPClose()
	{
		try
		{
			m_conSocket.close();
			m_out.close();
			m_in.close();
		}
		catch(IOException ioexception)
		{
		}
	}
	public int TCPInit()
	{
		try
		{			
			String strip=m_TextFiledIP.getText();
			int port=(int)Integer.parseInt(m_TextFiledPort.getText());
			m_conSocket = new Socket(strip,port);
			m_conSocket.setSoTimeout(2000);
			m_out = new DataOutputStream(m_conSocket.getOutputStream());
			m_in = new DataInputStream(m_conSocket.getInputStream());
		}
		catch(UnknownHostException unknownhostexception)
		{
			System.err.println("Don't know about host: taranis.");
			return 0;
		}
		catch(IOException ioexception)
		{
			System.err.println("Couldn't get I/O for the connection to: taranis.");
			return 0;
		}
		return 1;
	}

	public void PutBytetoTextField(byte[] bufarr,int len)
	{
		String str=new String(bufarr);
		m_TextAreaRec.appendText(str);
	}
	void Delay(int i)
    {
        try
        {
            Thread.sleep(i);
        }
        catch(Exception exception) { }
    }
    public void run()
	{
		String curRunning=Thread.currentThread().getName();
		if(curRunning.equals("RecThread"))
		{
			while(true)
			{
				if(m_iConnect==1)
				{
					byte recbuf[]=new byte[1024];
					int len;
					try
					{
			           len = m_in.read(recbuf,0,1024);
			           PutBytetoTextField(recbuf,len);
					}
					catch(IOException ioexception)
					{
						Delay(1000);
					}
				}
				else
				{
					Delay(1000);
				}
			}			
		}
	}

	public void paint(Graphics g) 
	{
		//g.drawString("Welcome to Java!!", 50, 60 );
	}
}
Tengo también el index.htm
Código HTML:
<HTML>
<HEAD>
<TITLE>
ZLSN2000 Module
</TITLE>
</HEAD>
<BODY>
<APPLET
  CODEBASE = "."
  CODE     = "testrec.class"
  NAME     = "ZLSN2000 Module"
  WIDTH    = 500
  HEIGHT   = 400
  HSPACE   = 0
  VSPACE   = 0
  ALIGN    = middle
>
<PARAM NAME = "HostIP" VALUE = "000.000.000.000">
</APPLET>
</BODY>
</HTML> 
Qué tengo que hacer ahora para realizar una comunicación???

La verdad que es que me llamó la atención esto y lo quise probar pero no sé por dónde empezar la verdad.
No sé si tengo que realizar un socket, si tengo que conectarme a una base de datos.
Yo le he conectado un cable de alimentación y el puerto ehernet. También un pulsador porque quería hacer algo en plan que si pulso el pulsador que me cambie de imágen o algo del estilo pero no sé por dónde empezar.
La guía tampoco dice mucho.

EDIT: Veo que lo que he puesto ya tiene un socket creado e imagino que los tiros van por ahí, pero no sé lo que tengo que hacer.
Yo imagino que el aparato hace como de servidor y se queda a la espera de que se conecte un cliente, y en el momento que se conecte un cliente da una respuesta. Eso sí, ni idea de qué tengo que hacer.
Veo que hay un Socket creado y un Hilo también. EL método init() parece que hace la inicialización de todo pero no veo un main. Es eso lo que falta??? deberia hacer el main y en ese main llamar al init()??? Eso imagino que inicializa el servidor, pero luego en el cliente qué es lo que tengo que hacer, sólo conectarme y ya está???

A ver si alguien puede guiarme

Otro saludo

Última edición por elpre; 09/01/2019 a las 03:38
  #2 (permalink)  
Antiguo 11/01/2019, 19:30
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 10 años
Puntos: 11
Respuesta: establecer comunicación con dispositivo ZLAN 6042

Deberías empezar por quitar los applets, están obsoletos.
  #3 (permalink)  
Antiguo 13/01/2019, 15:49
 
Fecha de Ingreso: junio-2011
Mensajes: 148
Antigüedad: 7 años, 6 meses
Puntos: 2
Respuesta: establecer comunicación con dispositivo ZLAN 6042

Cita:
Iniciado por abrahamhs Ver Mensaje
Deberías empezar por quitar los applets, están obsoletos.
Ahora mismo estoy utilizando sólo eclipse. El código que está puesto, funciona correcto. Se conecta y se queda a la espera de recibir cosas.
Antes de probar eso, realicé un cliente sencillito
Código:
try
        {
            //Flujo de datos hacia el servidor
            salidaServidor = new DataOutputStream(cs.getOutputStream());

            //Se enviarán dos mensajes
            for (int i = 0; i < 2; i++)
            {
                //Se escribe en el servidor usando su flujo de datos
                salidaServidor.writeUTF("Este es el mensaje número " + (i+1) + "\n");
                Thread.sleep(4000);
            }

            cs.close();//Fin de la conexión

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
En el aparato se veía que recibía bien las cosas, porque las luces que se tenían que encender, lo hacían, ahora ya he probado el código que puse en el primer mensaje y parece que también funciona.
Ahora mismo lo que me falta es hacer una función de leer una de las entradas digitales, ya que ahí sí que no tengo ni idea de cómo hacerlo.
He leído el manual pero la verdad que no lo entiendo:
Manual
En la página 10, el apartado 5 explica el protocolo pero no sé cómo aplicarlo a java. La entrada que utilizo es la DI1 pero en java no sé cómo decirle, "cada vez que te llegue algo de DI1, pon el mensaje de que has pulsado" (algo del estilo). O por ejmplo que mire los estado de todas las entradas y que cuando note un cambio (que se ha pulsado algo) que me lo diga. En eso sí que estoy perdido perdido.



La zona horaria es GMT -6. Ahora son las 15:05.