我想对nanoCUL868 USB设备进行一次小型测试,以便将一些信号传输到远程设备。该摇杆可与某些第三方软件一起使用,并且我能够与远程设备进行通信。我现在想用JAVA中的以下代码测试这支棍子:
package de.saltest.home;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Logger;
import org.openmuc.jrxtx.Parity;
import org.openmuc.jrxtx.SerialPort;
import org.openmuc.jrxtx.SerialPortBuilder;
public class SomfyCULTest {
private static final Logger log = Logger.getLogger(SomfyCULTest.class.getName());
public static void main(String[] args) throws IOException {
log.info("Opening port ttyUSB0");
SerialPort port = SerialPortBuilder.newBuilder("/dev/ttyAMA0").setBaudRate(9600).setParity(Parity.NONE).build();
OutputStream out = port.getOutputStream();
String commandLEDOn = "l01\n";
String commandLEDOff = "l00\n";
String encryptionKey = "A1";
// C - Command (1 = My, 2 = Up, 4 = Down, 8 = Prog)
String command = "2";
String rollingCode = "001D";
String address = "000029";
String somfyCommand = "Ys" + encryptionKey + command + "0" + rollingCode + address + "\n";
out.write(somfyCommand.getBytes());
out.close();
port.close();
log.info("Closed port");
}
}
我已经在Rasperry Pi 3上安装了Oracle Java,并且还通过apt-get获得了librtrx-java。 dpkg-query -L librxtx-java
产生:
/usr/lib/jni/librxtxRS485.so
/usr/lib/jni/librxtxRaw.so
/usr/lib/jni/librxtxI2C.so
/usr/lib/jni/librxtxParallel.so
/usr/lib/jni/librxtxSerial.so
/usr/share/java/RXTXcomm.jar
因此,我假设为正确的平台正确安装了这些库。 如果我使用javac编译我的代码:
我收到以下错误消息:
javac -classpath /usr/lib/jni -cp /usr/share/java/RXTXcomm.jar:. src/main/java/de/saltest/home/SomfyCULTest.java
src/main/java/de/saltest/home/SomfyCULTest.java:7: error: package org.openmuc.jrxtx does not exist
import org.openmuc.jrxtx.Parity;
^
我也有一个maven项目,使用此代码可以很好地进行编译,但是由于以下错误,我无法执行它:
mvn exec:java -Dexec.mainClass=de.saltest.home.SomfyCULTest
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ serialTest ---
Okt 07, 2018 3:25:41 PM de.saltest.home.SomfyCULTest main
INFORMATION: Opening port ttyUSB0
Could not load lib from jar and from system.
gnu.io.LibLoadException: directory does not exist /libs
at gnu.io.LibraryLoader.loadLib(LibraryLoader.java:65)
at gnu.io.LibraryLoader.loadLibsFromJar(LibraryLoader.java:48)
at gnu.io.LibraryLoader.loadRxtxNative(LibraryLoader.java:29)
at gnu.io.RXTXCommDriver.<clinit>(RXTXCommDriver.java:85)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:104)
at org.openmuc.jrxtx.JRxTxPort.openSerialPort(JRxTxPort.java:50)
at org.openmuc.jrxtx.SerialPortBuilder.build(SerialPortBuilder.java:166)
at de.saltest.home.SomfyCULTest.main(SomfyCULTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:282)
at java.lang.Thread.run(Thread.java:748)
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
从这里我迷路了。我已经尝试了很多类似将库复制到其他地方所建议的操作。我还更改了类路径和其他我能想到的东西。但是,似乎没有任何效果。我唯一奇怪的是,我尝试使用java.io。但是代码尝试加载gnu.io。可能有一些不匹配? 任何帮助或解决方案都非常感谢。
谢谢!
答案 0 :(得分:1)
解决方案似乎是向maven构建中添加一个插件,该插件将生成包含所有依赖项的JAR。如此处所述:https://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/ 但是,仍然很奇怪,您必须添加如上所述的库路径:
-Djava.library.path=/usr/lib/jni
据我了解,这不再是必需的。但是,如果没有路径,它将无法正常工作。
答案 1 :(得分:0)
您是否尝试将库的本机路径添加为开始参数:
-Djava.library.path=/usr/lib/jni
答案 2 :(得分:0)
我面临着同样的问题,对于解决这些问题,对我有用的步骤
Step1. add RXTXcomm.jar and RXTXcomm-2.2pre2.jar in JAVA_HOME/jre/lib/ext
Step2:- create war file using eclipse or anything
Step3: On the client environment these jar should be store in same location
Step4: Add RXTXcomm.jar and RXTXcomm-2.2pre2.jar in JAVA_HOME/jre/lib/ext of client environment.
注意:-如果未从串行设备获取数据,请检查串行端口上的锁,这可能是其他线程或进程已被占用或未释放锁。
要检查端口上的锁,
命令是fuser /dev/ttyS0
,然后
kill -9 PID
我希望这会成功。 使用centos7