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
Es ist möglich, dass die Bits umgedreht werden, wenn Sie von JAVA zu C wechseln, vielleicht müssen Sie dies berücksichtigen. – ZeldaZach
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
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