私はトランザクション処理用の Ingenico 端末に取り組んでいます。メインサーバーとの通信にはソケットとシリアルポートを使用しています。
ソケットとシリアル ポートは相互に通信します。つまり、シリアル ポートで受信したデータはすぐにソケットの出力ストリームに書き込まれ、ソケットで受信したデータはシリアル ポートに書き込まれます。
発生するこのダイアログのシーケンスがあります: 例: ソケットがメッセージをシリアル ポートに送信すると、シリアル ポートは特定のミリ秒数以内に ACK で応答し、シリアル ポートは別のメッセージをソケットに送信し、その逆です。逆。
特定の時間制限 (数ミリ秒) 内に ACK を受信したかどうかをチェックするタイムアウト メカニズムが必要です。これを行うために、Timer と TimerTask を使用しました。そして、これを行うためにシリアルポートから条件付き読み取りを行います。私の質問は、これが機能するかどうかです。私は正しい軌道に乗っていますか?
これまでのコード:
public void serialEvent(SerialPortEvent event)
{
byte[] BytesFromSerialPort = null;
//timeout of 500ms to get either an ACK or NAK from the serial port or the socket on port 6000
int timeout = 10;
if(event.isRXCHAR() && event.getEventValue() > 0)
{
BytesFromSerialPort = new byte[event.getEventValue()];
try
{
if(IsAckExpected)
BytesFromSerialPort = serialPort.readBytes(event.getEventValue(), 1000*timeout);
else
BytesFromSerialPort = serialPort.readBytes(event.getEventValue());
//print statements
System.out.printf("SERIAL RX %04d: ", event.getEventValue());
for(byte b : BytesFromSerialPort)
System.out.printf("%c", (char)b);
System.out.println();
}
}
条件: 予想される次のメッセージが ACK の場合、タイムアウトを設定します。