2017-06-21 5 views
0

Ich hatte eine Hardware in C, die unsigned Bytes für die Kontrolle zu erhalten. um diese Befehle zu debuggen, habe ich eine JavaFX-Schnittstelle erstellt.Socket DataOutputStream scheint nur das erste Byte korrekt zu senden

Ich habe Probleme, weil die Hardware nur auf den ersten Befehl reagiert, den ich sende. Zum Einschalten muss ich zum Beispiel die App starten, den ON-Befehl senden und neu starten, um sie erneut zu senden. Wenn ich die App nicht neu starte, reagiert das Gerät nicht auf die anderen Befehle.

package interfaceautomacaojavafx; 

import java.lang.Integer; 
import java.io.*; 
import java.net.*; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Label; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextArea; 
import javafx.scene.shape.Circle; 
import javafx.scene.paint.Color; 
import java.math.BigInteger; 
import java.net.ConnectException; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.util.Arrays; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.ResourceBundle; 


public class FXMLDocumentController implements Initializable { 

private Socket socket;    
private DataOutputStream dataOut; 
private DataInputStream dataIn; 
private String commandStr; 
private char command[]; 
private String hostname; 
private int portNumber; 

@FXML 
private Label lblIP, lblIPMask, lblGateway, lblPort, lblConnectionStatus, 
     lblPingStatus; 
@FXML 
private Button btnPing, btnSend; 

@FXML 
private TextField txtIP0, txtIP1, txtIP2, txtIP3, 
     txtIPMask0, txtIPMask1, txtIPMask2, txtIPMask3, 
     txtGateway0, txtGateway1, txtGateway2, txtGateway3, 
     txtPort, txtSendCommand ; 

@FXML 
private TextArea txaCommandHistory; 

@FXML 
private Circle circleConnection; 



@Override 
public void initialize(URL url, ResourceBundle rb) { 
    System.out.println("App initialized"); 
} 

@FXML 
private void buttonPingHalndler(ActionEvent event){ 
    System.out.println("Button Ping clicked!"); 
    lblPingStatus.setText("Btn. Ping Clicked"); 
} 

@FXML 
private void buttonClearTxaHistoryHandler(ActionEvent event){ 
    txaCommandHistory.clear(); 
} 

@FXML 
private void buttonSendCommandhandler(ActionEvent event) { 

    btnSend.setDisable(true); 
    System.out.println("=== Button SendCommand clicked! ==="); 
    lblConnectionStatus.setText("Conexão iniciada..."); 
    circleConnection.setFill(Color.DODGERBLUE); 

    hostname = txtIP0.getText(); 
    System.out.println("Hostname: " + hostname); 

    portNumber = Integer.parseInt(txtPort.getText()); 
    System.out.println("Port: " + portNumber); 


    byte buffer[] = { 0x02, 0x0C, 0x06, 0x01, (0x81 - 256), 
     (0x81 - 256), (0x80 - 256), (0x80 - 256), (0x80 - 256), (0x80 -256), (0x80 - 256), (0x80 - 256) }; 

    System.out.println("buffer: " + Arrays.toString(buffer)); 
    lblConnectionStatus.setText("Tentanto conexão..."); 

    try { 
     socket = new Socket(hostname, portNumber);    
     dataOut = new DataOutputStream(socket.getOutputStream()); 

     System.out.println("Objetos de conexão instanciados (Conexão aceita)."); 

     dataOut.write(buffer); 

     txaCommandHistory.appendText(Arrays.toString(buffer)); 
     txaCommandHistory.appendText("\n"); 
     lblConnectionStatus.setText("Comando enviado."); 
     circleConnection.setFill(Color.LIGHTGREEN); 


     dataIn = new DataInputStream(socket.getInputStream()); 

     while(dataIn.available() > 0) { 
      txaCommandHistory.appendText(dataIn.readUTF()); 
      txaCommandHistory.appendText("\n"); 
     } 

     txaCommandHistory.setVisible(true); 
     txaCommandHistory.setDisable(false); 

     dataIn.close(); 
     dataOut.close(); 
     socket.close();    

    } catch (ConnectException ce) { 
     lblConnectionStatus.setText("Conexão rejeitada..."); 
     circleConnection.setFill(Color.LIGHTGRAY); 
     ce.printStackTrace(); 

    } catch (EOFException eofe) { 
     lblConnectionStatus.setText("Erro de conexão."); 
     eofe.printStackTrace(); 
     System.out.println("EndOfFile Exception ocurred.");    

    } catch(UnknownHostException uhe) { 
     lblConnectionStatus.setText("Host desconhecido."); 
     System.out.println("Host unknown: " + uhe.getMessage()); 

    } catch (IOException ioe) { 
     lblConnectionStatus.setText("Erro de conexão..."); 
     System.out.println("---- IOException ocurred. ----"); 
     ioe.printStackTrace(); 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe); 

    } finally { 
     System.out.println("--- Bloco Finally: ---"); 
     lblConnectionStatus.setText("Conexão Encerrada..."); 
     btnSend.setDisable(false); 
     circleConnection.setFill(Color.LIGHTGRAY); 
    } 
} 

@FXML 
private void buttonSendOnCommandHalndler(ActionEvent event){ 

    btnSend.setDisable(true); 
    System.out.println("=== Button SendOnCommand clicked! ==="); 
    lblConnectionStatus.setText("Conexão iniciada..."); 
    circleConnection.setFill(Color.DODGERBLUE); 

    hostname = txtIP0.getText(); 
    System.out.println("Hostname: " + hostname); 

    portNumber = Integer.parseInt(txtPort.getText()); 
    System.out.println("Port: " + portNumber); 


    byte buffer[] = { 0x02, 0x04, 0x01, 0x01 };   

    System.out.println("buffer: " + Arrays.toString(buffer)); 

    try { 
     socket = new Socket(hostname, portNumber);    
     dataOut = new DataOutputStream(socket.getOutputStream()); 
     dataIn = new DataInputStream(socket.getInputStream()); 

     dataOut.flush(); 
     dataOut.write(buffer); 
     dataOut.flush(); 

     lblConnectionStatus.setText("Comando enviado."); 
     circleConnection.setFill(Color.LIGHTGREEN); 
     String txaMessage = Arrays.toString(buffer); 

     txaCommandHistory.setVisible(true); 
     txaCommandHistory.setDisable(false); 
     txaCommandHistory.appendText(txaMessage); 
     txaCommandHistory.appendText("\n"); 

     dataIn.close(); 
     dataOut.close(); 
     socket.close();    

    } catch (ConnectException ce) { 
     lblConnectionStatus.setText("Conexão rejeitada..."); 
     circleConnection.setFill(Color.LIGHTGRAY); 
     ce.printStackTrace(); 

    } catch (EOFException eofe) { 
     lblConnectionStatus.setText("Erro de conexão."); 
     eofe.printStackTrace(); 
     System.out.println("EndOfFile Exception ocurred.");    

    } catch(UnknownHostException uhe) { 
     lblConnectionStatus.setText("Host desconhecido."); 
     System.out.println("Host unknown: " + uhe.getMessage()); 

    } catch (IOException ioe) { 
     lblConnectionStatus.setText("Erro de conexão..."); 
     System.out.println("---- IOException ocurred. ----"); 
     ioe.printStackTrace(); 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe); 

    } finally { 
     System.out.println("--- Bloco Finally: ---"); 
     lblConnectionStatus.setText("Conexão Encerrada..."); 
     btnSend.setDisable(false); 
     circleConnection.setFill(Color.LIGHTGRAY); 
    } 
} 

@FXML 
private void buttonSendOffCommandHalndler(ActionEvent event){ 

    btnSend.setDisable(true); 
    System.out.println("=== Button SendOffCommand clicked! ==="); 
    lblConnectionStatus.setText("Conexão iniciada..."); 
    circleConnection.setFill(Color.DODGERBLUE); 

    hostname = txtIP0.getText(); 
    System.out.println("Hostname: " + hostname); 

    portNumber = Integer.parseInt(txtPort.getText()); 
    System.out.println("Port: " + portNumber); 


    byte buffer[] = { 0x02, 0x04, 0x01, 0x00 };   

    System.out.println("buffer: " + Arrays.toString(buffer)); 

    try { 
     socket = new Socket(hostname, portNumber);    
     dataOut = new DataOutputStream(socket.getOutputStream()); 
     dataIn = new DataInputStream(socket.getInputStream()); 

     dataOut.write(buffer); 
     dataOut.flush(); 

     lblConnectionStatus.setText("Comando enviado."); 
     circleConnection.setFill(Color.LIGHTGREEN); 
     String txaMessage = Arrays.toString(buffer); 

     txaCommandHistory.setVisible(true); 
     txaCommandHistory.setDisable(false); 
     txaCommandHistory.appendText(txaMessage); 
     txaCommandHistory.appendText("\n"); 



    } catch (ConnectException ce) { 
     lblConnectionStatus.setText("Conexão rejeitada..."); 
     circleConnection.setFill(Color.LIGHTGRAY); 
     ce.printStackTrace(); 

    } catch (EOFException eofe) { 
     lblConnectionStatus.setText("Erro de conexão."); 
     eofe.printStackTrace(); 
     System.out.println("EndOfFile Exception ocurred.");    

    } catch(UnknownHostException uhe) { 
     lblConnectionStatus.setText("Host desconhecido."); 
     System.out.println("Host unknown: " + uhe.getMessage()); 

    } catch (IOException ioe) { 
     lblConnectionStatus.setText("Erro de conexão..."); 
     System.out.println("---- IOException ocurred. ----"); 
     ioe.printStackTrace(); 
     Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ioe); 

    } finally { 

     try { 
      dataIn.close(); 
      dataOut.close(); 
      socket.close(); 
     } catch (IOException ioe){ 
      ioe.printStackTrace(); 
     } 

     System.out.println("--- Bloco Finally: ---"); 
     lblConnectionStatus.setText("Conexão Encerrada..."); 
     btnSend.setDisable(false); 
     circleConnection.setFill(Color.LIGHTGRAY); 
    } 
} 
} 

Schnittstelle: Interface JavaFX

Zusätzliche Informationen:

-Wenn die Schaltflächen klicken i die Kommunikation in Wireshark fließen sehen.

-Ich habe drei Tasten, so habe ich die .flush() -Methode in einem von ihnen hinzugefügt, aber es macht keinen Unterschied.

-Ich habe die .close() -Methoden geändert, um endlich in einem von ihnen zu blockieren, aber es macht auch keinen Unterschied.

Wireshark Befehl: Wireshark command

+0

Es ist möglich, dass die Bits umgedreht werden, wenn Sie von JAVA zu C wechseln, vielleicht müssen Sie dies berücksichtigen. – ZeldaZach

+0

Aber im Bild ist es möglich zu sehen, dass die Befehle immer gleich sind (wenn ich richtig sehe). Warum könnte das nach dem ersten Befehl geschehen? Der gesendete Puffer ist lokal, daher werden sie nach der Aktion gelöscht. – Rique

+2

Sie haben gesagt, dass Sie den Netzwerkverkehr mit Wireshark untersucht haben. Was war der Unterschied zwischen dem zweiten "ON" -Befehl und dem "ON" -Befehl nach dem Neustart? Haben Sie versucht, Ihre App zweimal auszuführen und "ON" in beiden auszuführen (nur um zu sehen, ob das Problem wirklich auf JAVA-Seite ist). – Robert

Antwort

0

Nach dem Wireshark Daten analysieren ich diese Frage zu schließen, weil scheint, dass die Java-Anwendung, die Befehle korrekt sendet.

Verwandte Themen