我正在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,那么我会在它上设置一个超时
基本上就是您在com端口重定向中尝试做的。首先,您不阻塞读/写,以确保应用程序永远不会陷入串行操作。其次,考虑使用Thread.sleep和重试次数,使算法更加强大。
尝试使用java中的串行通信管理器库进行串行端口通信。请参阅github源代码中xmodem的实现,因为它包含超时和基于ACK的读/写。
此外,他们的端口重定向驱动程序正是你想要做的。如果你的项目允许,可以考虑他们。另请参阅端口服务器,它的功能与您需要的完全相同。如果您将使用TCP/IP的简单套接字,则还需要添加安全性。