我在运行时调用库本机函数OpenSSPComPortUSB() 程序弹出窗口无法打开端口\。\ COM208。为什么会回来 \。\ COM208因为我已经传递PortNumber = 7;下面是Java代码和我的 目标是打开端口COM7以启动与智能的串行通信 料斗中。
// AccessITLLib.java
public class AccessITLLib
{
public static class SSP_COMMAND extends Structure
{
SSP_FULL_KEY Key;
public NativeLong BaudRate;
public byte PortNumber;
public NativeLong Timeout;
public byte SSPAddress;
public byte RetryLevel;
public byte EncryptionStatus;
public byte CommandDataLength;
public byte[] CommandData = new byte[255];
public byte ResponseStatus;
public byte ResponseDataLength;
public byte[] ResponseData = new byte[255];
public byte IgnoreError;
}
public interface ITLLib extends Library
{
ITLLib INSTANCE = (ITLLib) Native.loadLibrary("ITLSSPproc",
ITLLib.class);
public int OpenSSPComPort(SSP_COMMAND p);
public int OpenSSPComPortUSB(SSP_COMMAND p);
public int CloseSSPComPort();
public int CloseSSPComPortUSB();
}
public static void main(String[] args)
{
SSP_COMMAND commandStruct = new SSP_COMMAND();
commandStruct.BaudRate = new NativeLong(9600);
commandStruct.PortNumber =7;
commandStruct.Timeout = 500;
commandStruct.RetryLevel = 3;
commandStruct.IgnoreError = 1;
commandStruct.SSPAddress =16;
ITLLib.INSTANCE.CloseSSPComPort();
ITLLib.INSTANCE.CloseSSPComPortUSB();
ITLLib.INSTANCE.OpenSSPComPort(commandStruct);
ITLLib.INSTANCE.OpenSSPComPortUSB(commandStruct);
}
}
here are the c structures
typedef struct{
SSP_FULL_KEY Key;
unsigned long BaudRate;
unsigned long Timeout;
unsigned char PortNumber;
unsigned char SSPAddress;
unsigned char RetryLevel;
unsigned char EncryptionStatus;
unsigned char CommandDataLength;
unsigned char CommandData[255];
unsigned char ResponseStatus;
unsigned char ResponseDataLength;
unsigned char ResponseData[255];
unsigned char IgnoreError;
}SSP_COMMAND;
typedef struct{
unsigned long long FixedKey;
unsigned long long EncryptKey;
}SSP_FULL_KEY;
答案 0 :(得分:1)
这可能不是答案;但仍然给你一些建议。
当您尝试通过客户端连接到PORT时;该端口应首先由服务器程序连接,并应该监听客户端。
因此,请使用以下命令检查该端口是否已启动。
netstat -lpn | grep 8080
netstat -f是windows的命令
你会得到像这样的输出
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13098 / java
这里我的进程ID是13098,它是使用端口8080的进程
端口可能已启动但防火墙阻止客户端连接,因此您可以停止iptable服务以停止防火墙。
service iptables stop
如果客户端仍然无法使用该端口,则该端口在网络级别被阻止(例如路由器)
如何知道端口是否被阻止?
使用客户端计算机上的telnet命令知道端口是否正在侦听。
telnet ip port(windows cmd)
我们可以发现一个特定的进程正在使用所有端口 root root 14223 14206 processName
lsof -p 14223(进程PID)
输出:
processName 14223 root 5u IPv4 349373 0t0 UDP hostName.com:7575
IPv4表示正在使用端口,端口号为7575
使端口免受服务器进程的影响;使用以下命令终止进程:
sudo kill 13098
现在端口8080是免费的。
答案 1 :(得分:1)
您的JNA结构定义与本机定义的布局不匹配。
JNA中的字段顺序必须与本机定义的字段顺序完全匹配(最新版本的JNA实际上要求您实现一个显式声明字段顺序的方法)。
您无意中交换了PortNumber
和Timeout
字段。