我必须控制一个用C语言制作的硬件,它接收无符号字节用于控制。 为了调试这些命令,我创建了一些JavaFX接口。
我遇到了麻烦,因为硬件只响应我发送的第一个命令。要打开例如我必须启动应用程序,发送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中流动的通信。
- 我有三个按钮,所以我在其中一个按钮中添加了.flush()方法,但没有区别。
- 我将.close()方法改为最终阻塞其中一个,但它也没有区别。
Wireshark命令:Wireshark command
答案 0 :(得分:0)
在分析了Wireshark数据之后,我将关闭这个问题,因为似乎Java应用程序正在正确地发送命令。