GPS logger does not connect to BT747

I have been using an application called BT747 to read gps information out of a GPS logger on many versions of Suse. It is written in java.

The logger is recognised by the system correctly.

usb 3-7: New USB device found, idVendor=0e8d, idProduct=3329, bcdDevice= 1.00
usb 3-7: New USB device strings: Mfr=3, Product=4, SerialNumber=0
usb 3-7: Product: GPS Receiver
usb 3-7: Manufacturer: MTK
cdc_acm 3-7:1.1: ttyACM0: USB ACM device

After a fresh install of Leap 15.5 the program starts as normal, but it no longer connects to the logging device.

BT747 uses a serial connection over USB, in my case it uses /dev/ttyACM0.

The BT747 website mentions the program needs access to /var/lock, probably to ensure it can use the serial port without other programs trying to use it at the same time.

I have added the user to usergroups “dialout” and “lock” for that reason. This used to work in previous Suse versions.

user@sys600:~> groups
users dialout lock

When I run the program as su it works as expected. Running it via sudo does not work.
This looks like a permission issue to me, but I am lost as to what permissions are missing.

user@sys600:/var> ls -al |grep lock
lrwxrwxrwx 1 root root    9  8 nov 11:27 lock -> /run/lock

ls -al /dev/ttyACM0
crw-rw---- 1 root dialout 166, 0 12 nov 22:13 /dev/ttyACM0

When I do cat /dev/ttyACM0 I see data coming in, so it seems permissions for this device are correct.

Here is a snippet of /var/messages

2023-11-13T11:25:10.635053+01:00 sys600 systemd[1876]: Started BT747D - MTK GPS-Device control (Desktop).
2023-11-13T11:25:10.781953+01:00 sys600 plasmashell[7223]: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
2023-11-13T11:25:10.782008+01:00 sys600 plasmashell[7223]: PATH = /home/user/bin:/usr/local/bin:/usr/bin:/bin
2023-11-13T11:25:10.924986+01:00 sys600 java[7223]: Theme parsing error: gtk.css:1552:16: '-gtk-icon-size' is not a valid property name
2023-11-13T11:25:10.925067+01:00 sys600 java[7223]: Theme parsing error: gtk.css:1555:16: '-gtk-icon-size' is not a valid property name
2023-11-13T11:25:11.123631+01:00 sys600 java[7223]: Theme parsing error: gtk.css:1552:16: '-gtk-icon-size' is not a valid property name
2023-11-13T11:25:11.123758+01:00 sys600 java[7223]: Theme parsing error: gtk.css:1555:16: '-gtk-icon-size' is not a valid property name
2023-11-13T11:25:11.851818+01:00 sys600 plasmashell[7223]: 1073 - BT747 2.1.4 Build:BT747_mdeweerd.4.20120512145721073
2023-11-13T11:25:11.851893+01:00 sys600 plasmashell[7223]: 1073 - Initial: 1053x598  Screen: 1920x1080 Final: 1053x598
2023-11-13T11:25:11.851914+01:00 sys600 plasmashell[7223]: 1073 - Linux
2023-11-13T11:25:11.851933+01:00 sys600 plasmashell[7223]: 1073 - amd64
2023-11-13T11:25:11.851951+01:00 sys600 plasmashell[7223]: 1073 - 5.14.21-150500.55.36-default
2023-11-13T11:25:11.851987+01:00 sys600 plasmashell[7223]: 1073 - 11.0.21
2023-11-13T11:25:11.852011+01:00 sys600 plasmashell[7223]: 1073 - 64
2023-11-13T11:25:11.852181+01:00 sys600 plasmashell[7223]: 1074 - Fail
2023-11-13T11:25:11.852214+01:00 sys600 plasmashell[7223]: Fail
2023-11-13T11:25:11.852237+01:00 sys600 plasmashell[7223]: Fail
2023-11-13T11:25:11.852259+01:00 sys600 plasmashell[7223]: Success
2023-11-13T11:25:11.852281+01:00 sys600 plasmashell[7223]: javax.swing.plaf.metal.MetalLookAndFeel
2023-11-13T11:25:11.852307+01:00 sys600 plasmashell[7223]: javax.swing.plaf.nimbus.NimbusLookAndFeel
2023-11-13T11:25:11.852328+01:00 sys600 plasmashell[7223]:
2023-11-13T11:25:11.852350+01:00 sys600 plasmashell[7223]:
2023-11-13T11:25:11.891532+01:00 sys600 java[7223]: gtk_render_frame_gap: assertion 'xy0_gap >= 0' failed
2023-11-13T11:25:11.960065+01:00 sys600 java[7223]: gtk_render_frame_gap: assertion 'xy0_gap >= 0' failed
2023-11-13T11:25:13.778136+01:00 sys600 plasmashell[7223]: java.lang.UnsatisfiedLinkError: /usr/lib64/ /usr/lib64/ undefined symbol: minor thrown while loading
2023-11-13T11:25:13.778266+01:00 sys600 plasmashell[7223]: Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: /usr/lib64/ /usr/lib64/ undefined symbol: minor
2023-11-13T11:25:13.778380+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
2023-11-13T11:25:13.778404+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.ClassLoader$NativeLibrary.load(
2023-11-13T11:25:13.778425+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(
2023-11-13T11:25:13.778445+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.ClassLoader.loadLibrary0(
2023-11-13T11:25:13.778465+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.ClassLoader.loadLibrary(
2023-11-13T11:25:13.778485+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.Runtime.loadLibrary0(
2023-11-13T11:25:13.778505+01:00 sys600 plasmashell[7223]: #011at java.base/java.lang.System.loadLibrary(
2023-11-13T11:25:13.778525+01:00 sys600 plasmashell[7223]: #011at<clinit>(
2023-11-13T11:25:13.778547+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSRxTxPort.isValidPort(
2023-11-13T11:25:13.778564+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSRxTxPort.getPortFromPrefixes(
2023-11-13T11:25:13.778585+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSRxTxPort.getUsbPort(
2023-11-13T11:25:13.778602+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSRxTxPort.openPort(
2023-11-13T11:25:13.778622+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSrxtx.myOpenPort(
2023-11-13T11:25:13.778639+01:00 sys600 plasmashell[7223]: #011at gps.connection.GPSrxtx.setUSBAndOpen(
2023-11-13T11:25:13.778656+01:00 sys600 plasmashell[7223]: #011at bt747.model.Controller.setUsb(
2023-11-13T11:25:13.778677+01:00 sys600 plasmashell[7223]: #011at bt747.j2se_view.BT747Main.openPort(
2023-11-13T11:25:13.778696+01:00 sys600 plasmashell[7223]: #011at bt747.j2se_view.BT747Main.btConnectActionPerformed(
2023-11-13T11:25:13.778713+01:00 sys600 plasmashell[7223]: #011at bt747.j2se_view.BT747Main.access$300(
2023-11-13T11:25:13.778738+01:00 sys600 plasmashell[7223]: #011at bt747.j2se_view.BT747Main$7.actionPerformed(
2023-11-13T11:25:13.778756+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.AbstractButton.fireActionPerformed(
2023-11-13T11:25:13.778773+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(
2023-11-13T11:25:13.778794+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(
2023-11-13T11:25:13.778811+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.DefaultButtonModel.setPressed(
2023-11-13T11:25:13.778828+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(
2023-11-13T11:25:13.778850+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Component.processMouseEvent(
2023-11-13T11:25:13.778868+01:00 sys600 plasmashell[7223]: #011at java.desktop/javax.swing.JComponent.processMouseEvent(
2023-11-13T11:25:13.778885+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Component.processEvent(
2023-11-13T11:25:13.778911+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Container.processEvent(
2023-11-13T11:25:13.778929+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Component.dispatchEventImpl(
2023-11-13T11:25:13.778946+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Container.dispatchEventImpl(
2023-11-13T11:25:13.778966+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Component.dispatchEvent(
2023-11-13T11:25:13.778984+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(
2023-11-13T11:25:13.779002+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(
2023-11-13T11:25:13.779024+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(
2023-11-13T11:25:13.779041+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Container.dispatchEventImpl(
2023-11-13T11:25:13.779058+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Window.dispatchEventImpl(
2023-11-13T11:25:13.779075+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.Component.dispatchEvent(
2023-11-13T11:25:13.779097+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue.dispatchEventImpl(
2023-11-13T11:25:13.779114+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue$
2023-11-13T11:25:13.779131+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue$
2023-11-13T11:25:13.779148+01:00 sys600 plasmashell[7223]: #011at java.base/ Method)
2023-11-13T11:25:13.779171+01:00 sys600 plasmashell[7223]: #011at java.base/$JavaSecurityAccessImpl.doIntersectionPrivilege(
2023-11-13T11:25:13.779189+01:00 sys600 plasmashell[7223]: #011at java.base/$JavaSecurityAccessImpl.doIntersectionPrivilege(
2023-11-13T11:25:13.779206+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue$
2023-11-13T11:25:13.779223+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue$
2023-11-13T11:25:13.779240+01:00 sys600 plasmashell[7223]: #011at java.base/ Method)
2023-11-13T11:25:13.779261+01:00 sys600 plasmashell[7223]: #011at java.base/$JavaSecurityAccessImpl.doIntersectionPrivilege(
2023-11-13T11:25:13.779278+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventQueue.dispatchEvent(
2023-11-13T11:25:13.779295+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(
2023-11-13T11:25:13.779314+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(
2023-11-13T11:25:13.779331+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(
2023-11-13T11:25:13.779351+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventDispatchThread.pumpEvents(
2023-11-13T11:25:13.779369+01:00 sys600 plasmashell[7223]: #011at java.desktop/java.awt.EventDispatchThread.pumpEvents(
2023-11-13T11:25:13.779386+01:00 sys600 plasmashell[7223]: #011at java.desktop/

Any help would be appreciated!

This is a symbolic link. Which means that you get the information you want to show us with

ls -al /run/lock

In any case it looks as if the group of the file is root and not lock as you suggested you think it was by adding the user to the lock group in the past. That might have changed thus.

Hm, on my Leap 15.5 it is

henk@boven:~> ls -ld /run/lock
drwxrwxr-x 5 root lock 140 Nov 13 08:24 /run/lock

Thus lock is the real group.

Thanks for your reply.

I did see that the group for /var/lock is root.
I have tried to change the /var/lock group to “lock” with chown, but the group still remains to be “root”.
Since the world also has rwx permissions, I did not expect that to be causing the problem.

I noticed that the symbolic link points to /run/lock.
Looking at the permissions for /run/lock is see this that group permissions are set to “lock”

drwxrwxr-x  5 root   lock    140 12 nov 22:13 lock

BTW I also checked another system still running Leap 15.4, the situation is the same as described above, so I probably have to look further.

Yes, because you did not show the target of the link I also thought it might have changed. But this is not the case.

The program I am running is actually BT747D, the desktop version of the program.
Underneath it is a program called BT747.

When I run that from the terminal, I get the following:

ser@sys600:/> BT747
User not in group 'uucp'. Serial access may not work.
Current path : /home/user/.bt747
Fatal Error when running applet: there is an error in the constructor of the class BT747 and it could not be instantiated. Stack trace: 
java.lang.VerifyError: (class: waba/fx/NativeMethods4JDK, method: soundClipStop signature: (Lwaba/fx/SoundClip;)Z) Incompatible argument to function
        at waba.fx.Font.<init>(
        at waba.fx.Font.getFont(
        at waba.ui.MainWindow.<clinit>(
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(
        at waba.applet.Applet.init(
        at waba.applet.Applet.main(

Group “uucp” no longer exists, but in my previous installation on 15.4 I did not need this either.

I do not think that builtin warning is of any significance anymore.

I guess the ther messages are of more importance, but I have no idea, being a Java noob.

BTW, that file .bt747 in your (?) home directory. I do not know if that is a left over from earlier usage, but you could try to mv that to another name to see if a freshly created one is better.

I checked the .bt747 directory - it is empty…

I think this is the main message. But, not having any Java knowledge, I can say nothing about it. I hope others tune in.

I have the same device “idVendor=0e8d, idProduct=3329” and I use mtkbabel.
It’s from the “Application:Geo”-Repository which has the URL

Reading the data from the device to a file:
mtkbabel -p /dev/ttyACM0 -f filename -c

Erasing the track from the device:
mtkbabel -p /dev/ttyACM0 -E

But the program did not work on USB3 ports of one rather new computer. I had to use an USB2-HUB or a different (older) PC to make it work. By replacing the program line
my $SIZEOF_CHUNK = 0x800;
my $SIZEOF_CHUNK = 0x400;
the problem could be solved for the new computer too.

The reason is the speed of the copying process from the device to a buffer which is in turn read by the program. If the data is not processed fast enough, the buffer overflows. The problem might be similar for bt747 as both programs were made in the good old times when everything was much slower.

I have tried mtkbabel as you suggested.

I get output from the gps device, I did not even have to change the speed.
The most recent information (which I know is there) does not come out. This could be because the logger memory is set to be in a round robin mode, overwriting the oldest information when the memory is full.

So a lot of thanks for your contribution. At least I can still use the gps logger.

From the list of dependencies I noticed that mtkbabel seems to use perl-Device-SerialPort to access the ttyACM0 device. BT747 seems to use rxtx-java.

(What still bothers me is the fact that BT747 does work when run as root.)

I just noticed that BT747 provides a kind of log (usually this tab is not visible on my screens)

Here is some of the log information, showing up after trying to connect to the logger:-

77087 - isValidPort('/dev/cu.serial-0001')?: false -1
77088 - isValidPort('/dev/cu.SLAB_USBtoUART')?: false -1
77088 - isValidPort('/dev/cu.iBTAGPS-SPPslave')?: false -1
77088 - isValidPort('/dev/ttyUSB0')?: false -1
77088 - isValidPort('/dev/ttyUSB1')?: false -1
77089 - isValidPort('/dev/ttyUSB2')?: false -1
77089 - isValidPort('/dev/ttyUSB3')?: false -1
77089 - isValidPort('/dev/ttyUSB4')?: false -1
77089 - isValidPort('/dev/ttyUSB5')?: false -1
79198 - isValidPort('/dev/cu.serial-0001')?: false -1
79199 - isValidPort('/dev/cu.SLAB_USBtoUART')?: false -1
79200 - isValidPort('/dev/cu.iBTAGPS-SPPslave')?: false -1
79200 - isValidPort('/dev/ttyUSB0')?: false -1
79200 - isValidPort('/dev/ttyUSB1')?: false -1
79201 - isValidPort('/dev/ttyUSB2')?: false -1
79201 - isValidPort('/dev/ttyUSB3')?: false -1
79201 - isValidPort('/dev/ttyUSB4')?: false -1
79202 - isValidPort('/dev/ttyUSB5')?: false -1

It does not seem to find (or look for) /dev/ttyACM0. No wonder it does not connect…

That seems to be a very old problem:

It looks like a recurring problem indeed. Strange that things have been working until recently.

I will revert to your suggestion and use mtkbabel for now.

Thanks for all your help.