javamakefileserial-porttinyos

How to fix an error : 'Could not load library 'toscomm': no toscomm in java.library.path'?


I am getting familiar with Tiny OS enviroment, currently I am at lesson 4 "Mote-PC serial communication and SerialForwarder" and I am stuck with the part where I have to listen to serial port for any incoming data. I am trying to implement a simple example where I need to use TestSerial script to listen for any incoming messages however when I run

java TestSerial -comm serial@/dev/ttyUSB0:iris

my output looks like that:

Error loading the TinyOS JNI libraries the conventional way!
Attempting to load library 'toscomm'
Could not load library 'toscomm': no toscomm in java.library.path
----------
java.lang.UnsatisfiedLinkError: no toscomm in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1119)
    at net.tinyos.util.TOSLibraryLoader.load(TOSLibraryLoader.java:85)
    at net.tinyos.comm.TOSCommJNI.<clinit>(TOSCommJNI.java:14)
    at net.tinyos.comm.NativeSerial.getTOSCommMap(NativeSerial.java:207)
    at net.tinyos.comm.TOSSerial.<init>(TOSSerial.java:277)
    at net.tinyos.packet.SerialByteSource.openStreams(SerialByteSource.java:67)
    at net.tinyos.packet.StreamByteSource.open(StreamByteSource.java:61)
    at net.tinyos.packet.Packetizer.openSource(Packetizer.java:149)
    at net.tinyos.packet.AbstractSource.open(AbstractSource.java:78)
    at net.tinyos.packet.Packetizer.open(Packetizer.java:142)
    at net.tinyos.packet.PhoenixSource.run(PhoenixSource.java:178)
----------

In order to load the library 'toscomm' Java tries to locate the file 'libtoscomm.so' in one of the following paths:
/usr/java/packages/lib/i386:/lib:/usr/lib

The operating system is 'Linux' (i386)

Trying to locate the file 'linux_x86_toscomm.lib' in the classpath
Temporary file created: '/tmp/toscomm3780740783398787473.lib'
Library copied successfully. Let's load it.
Library loaded successfully
serial@/dev/ttyUSB0:57600: resynchronising
Sending packet 0
Sending packet 1

instead of having

Sending packet 1
Received packet sequence number 4
Sending packet 2
Received packet sequence number 5

as it described in tutorial

I am concerned about the warnings I get when I run this script, particularly this one

Attempting to load library 'toscomm'
Could not load library 'toscomm': no toscomm in java.library.path

According to tutorial, this error can be resolved by running

sudo tos-install-jni,

however when I type this, I get the error that tos command not found. I tried to go to tinyos-2.x/tools/tinyos/java. directory and typed sudo make and sudo make install, nevertheless that did not work either giving me the following error:

make[1]: Entering directory '/home/wsn/tinyos-main/tools'
/bin/sh ./config.status --recheck
running CONFIG_SHELL=/bin/sh /bin/sh ./configure --no-create --no-recursion
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking dependency style of g++... gcc3
checking for ranlib... ranlib
checking for a Python3 interpreter with version >= 3.0... python3
checking for python3... /bin/python3
checking for python3 version... 
checking for python3 platform... linux
checking for python3 script directory... ${prefix}/lib/python3.4/site-packages
checking for python3 extension module directory... /lib/python/site-packages
checking for a Python interpreter with version >= 2.5... python2
checking for python2... /bin/python2
checking for python2 version... 2.7
checking for python2 platform... linux2
checking for python2 script directory... ${prefix}/lib/python2.7/site-packages
checking for python2 extension module directory... (cached) /lib/python/site-packages
checking for perl... /bin/perl
checking for python2... /bin/python2
checking for python3... /bin/python3
checking for python2.7-config... /bin/python2.7-config
checking for dot... no
configure: I can't find dot. dot is required for documentation.
checking for nescc... /bin/nescc
checking for cygwin... no
checking for JDK location... configure: error: java not found
Makefile:377: recipe for target 'config.status' failed
make[1]: *** [config.status] Error 1
make[1]: Leaving directory '/home/wsn/tinyos-main/tools'
Makefile:374: recipe for target '../../config.status' failed
make: *** [../../config.status] Error 2

When I try to run the same command for BaseStation script, the program gives the same warning and just gets frozen at this point:

serial@/dev/ttyUSB0:57600: resynchronising

So I don't even see any packets sent or received!

I am not sure what is the problem here, please help.

I am using Virtual Machine with Fedora OS

I am trying to run the program on mib520 platform and I use iris motes

my java version

openjdk version "1.8.0_31" OpenJDK Runtime Environment (build 1.8.0_31-b13) OpenJDK Server VM (build 25.31-b07, mixed mode)


Solution

  • I do not think your issue is with toscomm, as long as the library ends up being loaded successfully you should not be getting any issues. I always used to get the same exception that you are seeing being thrown over there everytime I used the serial but never bothered to fix it as it didn't really hamper the operation of the serial port.

    In the end, I got rid of the exception by copying libtoscomm from the {TOS_ROOT}/tools/tinyos/java/serial/ directory to one of the directories that TinyOS is looking for libraries in. In your case you would put a copy of the libtoscomm file in one of the directories /usr/java/packages/lib/i386 , /lib or /usr/lib.

    You can try doing that and seeing if that resolves the exception issue for you.

    What I suspect might be causing your issue is that you do not have TestSerialAppC loaded onto you mote and connected to the serial port. Have you made sure the mote is connected to the serial port?

    I loaded ran the application on a mote and got the output below, so the issue is not with TestSerialAppC

    serial@/dev/tty.usbserial-FTYRYAHT:115200: resynchronising
    Sending packet 0
    Received packet sequence number 3
    Sending packet 1
    Received packet sequence number 4
    Sending packet 2