Hi people,
Sorry if this was addressed before. This is my first take on the new Serial
Transport, and I decided to adapt the good old NetCat Example as a first
attempt. These were my steps:
1) downloaded mina-core-2.0.0-M1-20070822.130904-57.jar from the trunk;
2) started a new project using that Mina 2.0 snapshot with the NetCat Example
files taken from the website;
3) Made the necessary adjustments on the code (as the API changed a bit from
1.x) and put the example to work. Worked fine as expected;
4) Downloaded the rxtx pack and installed the DLL (I'm coding on WindowsXP).
5) Changed Main.java to use a SerialConnector instead of a SocketConnector,
following instructions on the Serial Tutorial.
6) Run the program.
And this is what I get:
Native lib Version = RXTX-2.1-7pre20
Java lib Version = RXTX-2.1-7
WARNING: RXTX Version mismatch
Jar version = RXTX-2.1-7
native lib Version = RXTX-2.1-7pre20
Experimental: JNI_OnLoad called.
Exception in thread "VmPipeIdleStatusChecker" java.lang.NullPointerException
at
org.apache.mina.common.IdleStatusChecker.notifyIdleSession(IdleStatusChecker.java:86)
at
org.apache.mina.common.IdleStatusChecker.access$200(IdleStatusChecker.java:33)
at
org.apache.mina.common.IdleStatusChecker$Worker.run(IdleStatusChecker.java:77)
Apparently there is a version mismatch with RXTX, but I haven't been able to
identify why. Any hints on how to sort that out will surely help. Plus, there
is the Exception above. I ignored it at first because the program was "cat'ing"
whatever text was sent to the serial port, as expected, with either Socket or
Serial.
But then I noticed: sessionIdle() was never called when I used a
SerialConnector (and the exception is thrown). When I use the SocketConnector,
no Exception is thrown and sessionIdle() is called appropriately.
My Main.java is as follows:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(RXTXVersion.getVersion());
IoConnector connector = new SerialConnector();
connector.setHandler( new NetCatProtocolHandler() );
connector.setConnectTimeout(10);
SerialAddress portAddress=new SerialAddress( "COM3", 9600, 8,
SerialAddress.StopBits.BITS_1, SerialAddress.Parity.NONE,
SerialAddress.FlowControl.NONE );
ConnectFuture future = connector.connect( portAddress );
future.await();
IoSession session = future.getSession();
}
}
The NetCatProtocolHandler() used is as follows:
public class NetCatProtocolHandler extends IoHandlerAdapter {
public void sessionOpened(IoSession session) {
// Set reader idle time to 10 seconds.
// sessionIdle(...) method will be invoked when no data is read
// for 10 seconds.
session.getConfig().setIdleTime(IdleStatus.READER_IDLE, 10);
}
public void sessionClosed(IoSession session) {
// Print out total number of bytes read from the remote peer.
System.err.println("Total " + session.getReadBytes() + " byte(s)");
}
public void sessionIdle(IoSession session, IdleStatus status) {
// Close the connection if reader is idle.
if (status == IdleStatus.READER_IDLE)
session.close();
}
public void messageReceived(IoSession session, Object message) {
ByteBuffer buf = (ByteBuffer) message;
// Print out read buffer content.
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
System.out.flush();
}
}
Any ideas on what could be throwing the exception and probably hindering
sessionIdle() from being called when using the SerialConnector?
Thanks in advance.
Fernando