2017-06-21 5 views
0

制御用に符号なしバイトを受け取ったCで作成したハードウェアを制御する必要がありました。 これらのコマンドをデバッグするために私はいくつかのJavaFXインターフェイスを作成しました。ソケットDataOutputStreamは、最初のバイトだけを正しく送信しているようです。

ハードウェアが私が送信する拳コマンドに応答しているだけなので、問題があります。例えば、私はアプリを起動してde ONコマンドを送信し、再起動するために再起動する必要があります。アプリを再起動しないと、機器は他のコマンドに応答しません。

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); 
    } 
} 
} 

インタフェース: Interface JavaFX

追加情報:私はWiresharkの中を流れる通信を参照してくださいボタンをクリックし-When

- 私は3つのボタンを持っているので、それらのうちの1つに.flush()メソッドを追加しましたが、それは何の違いもありません。

-I .close()メソッドを変更して、それらのうちの1つで最終的にブロックしましたが、それはまた何の違いもありません。

Wiresharkのコマンド:Javaアプリケーションが正しくコマンドを送信しているようですので、私はこの質問を終了しますWireshark command

+0

JAVAからCに移行するときにビットが反転する可能性があります。これを考慮する必要があります。 – ZeldaZach

+0

しかし、画像では、コマンドが常に同じであることを確認することは可能です(もし私が正しいと思えば)。なぜそれが最初の漫画を起こすことができるのでしょうか?送信されたバッファはローカルなので、アクションの後に破棄されます。 – Rique

+2

Wiresharkを使用してネットワークトラフィックを調べたとします。再起動後の2番目の "ON"コマンドと "ON"コマンドの違いは何ですか?あなたはあなたのアプリケーションを2回実行しようとしており、両方で "ON"を実行しています(本当に問題がJAVA側にあるかどうかを確認するだけです)。 – Robert

答えて

0

Wiresharkのデータを分析した後。

関連する問題