Programing/JAVA

JAVA 자바 CGI 호출 방식 장비 제어 방법

리커니 2016. 11. 2.
반응형

 

JAVA 자바 CGI 호출 방식 장비 제어

 

프로젝트를 진행다다보면 특정 장비의 제어를 요청 받는 경우가 있다.

 

보통의 장비들은 TCP 통신을 통해 제어를 하지만

이번의 경우 CGI 방식을 사용해야만 했다.

 

그럼 CGI 방식이 무엇인지 부터 알아보자.

 

CGI (Common Gateway Interface) 는 웹 서버 상에서 사용자 프로그램을 동작시키기 위한 조합이다.

웹 서버 프로그램의 기능의 주체는 미리 준비된 정보를 클라이언트의 요구에 응답해 보내는 것이다. 그 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려하는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리결과를 클라이언트에 송신하는 방법이 고안되었다. 이를 실현하기 위한 서버 프로그램과 외부 프로그램과의 연계법을 정한 것이 CGI이다.....

 

참조 : wikipedia

 

뭐 간단히 말하면 URL 을 사용하여 데이터를 주고 받는 통신 방식 중의 하나이다.

 

그럼 이제 통신을 위한 구현을 시작해보자.

 

스크립트에서 특정 값을 받아 장비로 보내는 예이다.

 

-- 장비ip를 받아 데이터를 만드는 부분 .java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
try{
    //장비 ip를 받아 장비의 cgi 주소를 url로 만든다.
    String url = "http://"+장비ip+"장비의 cgi 주소";
 
    //장비의 프로토콜을 참조해 전송할 데이터를 만든다.
    //9바이트 데이터 전송
    byte[] data = new byte[9];
    data[0= (byte)0x50;
    data[1= (byte)0xa7;
    data[2= (byte)0x89;
    data[3= (byte)0x14;
    data[4= (byte)0x00;
    data[5= (byte)0x02;
    data[6= (byte)0x00;
    data[7= (byte)0x01;
    data[8= (byte)0x47
 
    /* check sum의 경우 아래와 같이 구한다. data[7] -> checkSum
    for (int i=2; i<6; i++{  //2번째부터 5 번째까지 checkSum을 8번째 바이트에 등록
    data[7] += data[i]
    } */
    sendData(url, data);
 
    }catch(Exception e){
        e.printStackTrace();
}
cs

 

 

 

-- 데이터를 전송하는 부분 .java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public void sendData(String url, byte[] data){
 
    URL url = null;  
    URLConnection uc = null;
    HttpURLConnection huc = null;
    OutputStream os = null;
    DataOutputStream dos = null;
 
    try{
        //url 주소를 받아 url객체 생성
        url = new URL(url);
 
        //데이터 전달을 위한 커낵션 생성
        uc = url.openConnection();
 
        //url 호출
        huc = (HttpURLConnection) uc;
 
        //어떤 방식으로 데이터전달할지 설정 post방식
        huc.setRequestMethod("POST");
 
        //출력스트림을 사용할 지 설정(데이터 전송의 경우) 입력의 경우 huc.setDoInput(true);
        //해당 장비는 return값이 없었다..
        huc.setDoOutput(true);
        //post방식의 데이터가 인코딩 되었다는 설정
        huc.setRequestProperty("Content-Type""application/x-www-form-urlencoded");
 
        //데이터를 전송할 outputStream 생성
        os = huc.getOutputStream();
 
        //바이너리 타입 데이터를 출하기 위한 필터스트림 생성
        dos = new DataOutputStream(os);
 
        try{
            //데이터 전송
            dos.write(data);
            //출력스트림을 내보내고 강제로 버퍼된 출력 바이트를 기록
            dos.flush();
        } finally {
            //출력 스트림을 닫고 스트림과 연관된 시스템 자원을 해제
            dos.close();
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}
cs

 

로우별로 주석을 달아 놓았으니 이해가 안되는 부분은 아마도(?!) 없을 것이다.

 

어려운 부분은 없다. 프로토콜 정의서가 맞다면..원하는 프로토콜을 넣어 장비를 제어 하면 된다.

 

필자의 경우 잘못된 프로토콜 정의서 정보로 하루 이상 고생했다..

너무 맹신하지 말고 안될 경우 바로 문의하자....

 

여기서 몇가지 더 확인 하고 넘어가자.

자바의 경우 1byte의 범위는 -128 ~ 127 까지 이다. (총 255)

1,2,3....127까지 증가하다가 128이 들어오면 -128이 되고 1씩감소하여 255는 -1이 된다.

넣은 데이터가 c언어와 다르게 표출된다고 이상하다 생각하지 말자..

이진 데이터로 바뀔경우 패킷은 같은 값이 넘어간다.

 

그럼 cgi방식으로 넘어가는 데이터가 바르게 넘어가는지 어떻게 확인할까?

방법은 아래의 Link를 참고하자.

 

Link : 전송 패킷 확인 툴 Wireshark

 

반응형

댓글

💲 추천 글