2013-02-06 2 views
0

프로그램을 실행하는 동안 라이브러리 고유 함수 OpenSSPComPortUSB()를 호출하면 \. \ COM208 포트를 열 수 없습니다. 왜 내가 PortNumber = 7을 전달했는지와 같이 \. \ COM208을 반환합니다. 아래 자바 코드와 내 목표는 hoper와 스마트 통신 직렬 통신을 시작하기 위해 포트 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

귀하의 통신 속도는 64 비트 숫자가 아닙니다. 대신에'int' 또는'NativeLong'을 사용하십시오. 웹상의 다른 참고 문헌들은'PortNumber'가 JNA에서'byte' 필드를 필요로하는'char'이라는 것을 나타냅니다. 비교를 위해 C 헤더 파일에서 함수/구조체 선언을 가지고 있습니까? – technomage

+0

구조체 파일 전송 속도가 길고 PortNumber가 JNA에서 char입니다. hava는 BaudRate를 NativeLong 및 PortNumber로 변경하지만 바이트는 변경되지 않습니다. –

+0

이것은 바보 같은 질문 일 수 있지만 7 대신 포트 번호 6을 사용해 보셨습니까? 나는이 특정 API에 대해 아무것도 모르는 것이지만 포트 식별자의 숫자 식별자는 0이 아닌 1에서부터 계산됩니다. –

답변

1

JNA 구조체 정의가 네이티브 정의의 레이아웃과 일치하지 않습니다.

JNA의 필드 순서는 원래 정의와 정확히 일치해야합니다 (JNA의 최신 버전은 실제로 필드 순서를 명시 적으로 선언하는 메소드를 구현해야합니다).

실수로 PortNumberTimeout 필드를 바꿨습니다.

+0

답장을 보내 주셔서 감사합니다. 작동하지 않습니다. –

+1

'Structure.size()'와'sizeof (SSP_COMMAND)'를 비교해 보겠습니다. 그것들이 다른 경우, JNA 구조체 정의를 조정하여 모든 필드가 올바르게 정렬되도록해야합니다. – technomage

+0

이 메서드를 호출하는 방법 sizeof (SSP_COMMAND cmd) 오류가 발생합니다 –

1

이 응답하지 않을 수 있습니다; 그러나 아직도 당신에게 약간의 제안을 준다.

클라이언트를 통해 포트에 연결하려고하면; 이 포트는 먼저 서버 프로그램에 의해 연결되어야하며 클라이언트를 청취해야합니다.

따라서 아래 명령을 사용하여 포트가 시작되었는지 확인하십시오.

netstat -lpn | 그렙 8080

에서 netstat -f는 가

당신이

TCP와 같은 출력 뭔가를 얻을 수 있습니다

0 0 0.0.0.0:8080 13098이/자바 LISTEN 0.0.0.0:* 창

에 대한 명령입니다

여기 내 프로세스 ID는 13098이며 포트 8080

포트가 시작되지만 방화벽이 연결하도록 클라이언트를 차단하고 그래서 당신은 IPTA을 중지 할 수 있습니다 가능성이 있습니다를 사용하는 과정입니다 ble 서비스를 사용하여 방화벽을 중지하십시오. 그 다음 해당 포트는 네트워크 수준에서 차단 된 클라이언트에 아직 사용할 수없는 경우

서비스의 iptables가

중지 (예 : 라우터)

어떻게 포트가 차단되지 않았거나 알 수 ?

클라이언트 시스템의 telnet 명령을 사용하여 포트가 수신 대기 중인지 여부를 확인하십시오.

텔넷 IP 포트 (창 cmd를)

우리는 무엇을 모든 포트 루트 루트 14223 14206 processName

-p 14223 lsof를

(특정 프로세스가 사용 찾을 수 있습니다 프로세스 PID)

출력 :
processName 142 23 root 5u IPv4 349373 0t0 UDP hostName.COM : 7575은

의 IPv4는 아니오

7575은 서버 프로세스에서 무료로 포트를 확인하지 않으려면 포트와 포트를 사용하고 대답; 다음 명령을 사용하여 프로세스를 종료합니다 :

는 sudo는 13,098

지금 포트 8080 무료 죽인다.

+0

답장을 보내 주셔서 감사합니다. 그러나 Windows에서 32 비트 시스템으로 작업 할 때 cmd에서 thiese 명령을 실행하는 방법 –

+0

@AJAYMAHALLE 이러한 명령의 대부분은 Linux 기반입니다. 내가 준 텔넷 명령은 윈도우 용입니다. –

+0

@AJAYMAHALLE은 서버 프로세스가 Windows에서 실행되고 있습니까 ?? 및 클라이언트도 Windows ?? –

관련 문제