0

プログラムの実行中にライブラリのネイティブ関数 OpenSSPComPortUSB() を呼び出して、ポート \.\COM208 を開くことができないポップアップを取得します。PortNumber = 7; を渡すと、\.\COM208 が返される理由 以下は 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;
4

2 に答える 2

1

これは答えではないかもしれません。それでもいくつかの提案をします。

クライアント経由で PORT に接続しようとしたとき。そのポートは、最初にサーバー プログラムによって接続され、クライアントをリッスンする必要があります。

以下のコマンドを使用して、ポートが開始されていることを確認します。

netstat -lpn | grep 8080

netstat -f は Windows 用のコマンドです。

このような出力が得られます

tcp 0 0 0.0.0.0:8080 0.0.0.0:* リッスン 13098/java

ここで私のプロセスIDは13098で、ポート8080を使用しているプロセスです

ポートが開始されている可能性がありますが、ファイアウォールがクライアントの接続をブロックしているため、iptable サービスを停止してファイアウォールを停止できます。

サービス iptables 停止

それでもクライアントが利用できない場合、そのポートはネットワーク レベルでブロックされます (ルーターなど)。

ポートがブロックされているかどうかを知る方法は?

クライアント マシンから telnet コマンドを使用して、ポートがリッスンしているかどうかを確認します。

telnet ip ポート (windows コマンド)

特定のプロセスがすべてのポートを使用していることがわかります 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 が解放されました。

于 2013-02-06T07:12:23.730 に答える
1

JNA 構造定義がネイティブ定義のレイアウトと一致しません。

JNA のフィールドの順序は、ネイティブ定義の順序と正確に一致する必要があります (JNA の最新バージョンでは、フィールドの順序を明示的に宣言するメソッドを実際に実装する必要があります)。

PortNumberうっかりとTimeoutフィールドを交換してしまいました。

于 2013-02-06T14:36:36.300 に答える