制御用に符号なしバイトを受け取った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
JAVAからCに移行するときにビットが反転する可能性があります。これを考慮する必要があります。 – ZeldaZach
しかし、画像では、コマンドが常に同じであることを確認することは可能です(もし私が正しいと思えば)。なぜそれが最初の漫画を起こすことができるのでしょうか?送信されたバッファはローカルなので、アクションの後に破棄されます。 – Rique
Wiresharkを使用してネットワークトラフィックを調べたとします。再起動後の2番目の "ON"コマンドと "ON"コマンドの違いは何ですか?あなたはあなたのアプリケーションを2回実行しようとしており、両方で "ON"を実行しています(本当に問題がJAVA側にあるかどうかを確認するだけです)。 – Robert