Movable Code

Trade, Robot, Policy

Update : 차량관제 TCP-URL 변환기 ZeroSrv

with 3 comments

ZeroSrv 시스템이 업그레이드 되었습니다.

주요 업데이트 내용은 아래와 같습니다

  • Acceptor / Initiator 모드 추가. (서버/클라이언트 역할)
  • 설정확장
    • mode : acceptor / initiator
    • remote_ip : 접속할 서버 주소
    • remote_port : 접속할 서버 포트
    • reconnect_interval : initiator 로 작동시 체크간격 (초단위)

다음은 확장된 ZeroSrv 의 메뉴얼입니다.

소스 및 실행환경은 해당 윈도우즈 서버 C:\LBC\zero 에 위치해있습니다.
하위 디렉토리는 다음과 같습니다.

  • bin : 실행환경
  • include : 라이브러리 인클루드 화일
  • lib : 라이브러리 바이너리
  • obj : 컴파일용 임시 디렉토리
  • ZeroServer : 소스 디렉토리

bin 디렉토리에서 JobMan.exe 를 서버에 항상 띄어두면 설정된 타임테이블에 따라 알아서 ZeroSrv 를 기동/종료 시킵니다. JobMan.cfg 화일을 수정하면 타임테이블을 원하는대로 조정이 가능합니다. 현재는 항상 기동해있는 모드입니다.

서버에는 항상 JobMan.exe 가 떠있어야 하며, 작업리스트에서 해당 프로세스를 항상 확인합시다.

JobMan.cfg 의 설정방법

[ProcessJobs]
srv_running = ./ZeroSrv.exe,ZEROSRV,false,0001,2359

이름 = 실행화일,윈도우타이틀,강제종료여부,시작시각,종료시각

현재는 0시1분부터 23: 59분까지 ZeroSrv.exe 를 실행시키되 지정한 시간이 지나도 강제종료를 하지 않습니다.즉, 특별한 문제가 없는한 항상 떠있습니다.

zero.cfg 설정방법

[setting]
mode = acceptor
port = 1980
remote_ip = 127.0.0.1
remote_port = 8899
reconnect_interval = 5
log_packet = 1
address = http://mobile.korex.co.kr
webpage = /GMDAT_GPS

  • mode: acceptor (서버모드), initiator (클라이언트모드)
  • mode = acceptor, 서버모드로 작동시
    • port: TCP 수신용 listen 포트
  • mode = initiator, 클라이언트모드로 작동시
    • remote_ip : 클라이언트모드로 작동시 접속할 서버주소
    • remote_port : 클라이언트모드로 작동시 접속할 서버포트
    • reconnect_interval : 클라이언트모드로 작동시 재접속/요청 간격 (초단위)
  • log_packet: 수신받은 패킷을 로그에 기록할지 여부. 데이터양이 많아 로그화일이 너무 커지면 이 부분을 0 으로 세팅해서 로그에 기록하지 마십시요.
  • address: URL 변환할 주소
  • page:URL 변환될 페이지

최종 URL 은 address + page + 파라미터 입니다. 위의 예제같은 경우

http://mobile.korex.co.kr/GMDAT_GPS?v1=12&v2=TDL&….

처럼 URL 이 변환됩니다.

log 화일

로그화일은 bin 디렉토리 밑의 log 디렉토리에 날짜별로 쌓입니다.

PS.

아래 Comment 로 추가된 부분의 설명중 사용자가 직접 추가작성해야할 소스는 아래와 같이 주석으로 표시했슴.

///////////////////////////////////////////////
//
직접작성할부분
///////////////////////////////////////////////

Advertisements

Written by soyul's papa

10월 28, 2007 , 시간: 11:48 오전

Computing에 게시됨

3개의 답글

Subscribe to comments with RSS.

  1. 추가된 소스 화일
    packet_header.h —- 패킷헤더
    socket_v1.h —- 추가된 initiator 소켓헤더
    socket_v1.cpp —- 추가된 initiator 소켓 CPP

    Sangmin Lee

    10월 28, 2007 at 11:53 오전

  2. 작업은 아래순서로 진행합니다.

    packet_header.h 에 추가할 프로토콜 구조체 작성. (packet_v1 구조체로 되어있슴)
    Zero.cfg 설정화일을 아래와 같이 확장

    mode = initiator 로 변경
    remote_ip 를 접속할 서버 주소로 변경
    remote_ip 를 접속할 서버 포트로 변경
    reconnect_interval 를 접속/query 할 간격 (초단위)

    Socket_v1.cpp 변경

    Socket_v1::OnParseReceive 변경.

    ////////////////////////////////////////
    // 데이터를 어떻게 짤라야 할지를 코딩
    // 자르면서 다음패킷처리를 위해 반드시 m_seek=0, bsize=(자르는 크기) 로 설정해야한다.
    // ex) 100 바이트를 잘라냈으면, m_seek=0,bsize=100 으로 설정
    // 아래 예제는 NULL 문자가 패킷의 끝으로 간주하는 경우임.
    while (m_seek<size) {
    if (data[m_seek]==0x00) {
    bsize=m_seek+1;
    m_seek=0;
    if (Socket_v1::s_logflag) LOG(" cut-in data : %d",bsize);
    break;
    }
    else ++m_seek;
    }
    ////////////////////////////////////////

    Socket_v1::OnReceive변경.

    ////////////////////////////////////////
    // 잘라진 패킷을 처리하는 부분
    packet_v1* pmsg = (packet_v1*) src; // 받은 데이터를 구조체로 매핑
    packet_v1& msg = (*pmsg); // 처리의 편의성을 위해 reference 로 매핑
    if (Socket_v1::s_logflag) WriteLog(msg); // 파일에 로그를 기록한다
    if (m_srv) m_srv->Process(msg); // 프로세싱한다 (URL posting...)
    ////////////////////////////////////////

    ZeroSrv.cpp 변경

    ZeroSrv::Process(packet_v1& msg) 변경.

    ////////////////////////////////////////
    // 데이터 처리부분, 윗부분의 소스를 참고
    try {
    WebForm wf;
    wf.setHost(m_host.c_str());
    wf.setScriptFile(m_page.c_str());
    // URL 을 조립한다. 예제는 void ZeroSrv::Process(katana& msg) 를 참고
    //setValue(wf,"v1",msg._pid); // 프로세서ID
    //
    }catch(WebFormException ex) {
    LOG("web form exception occurs ... %s",ex.getMessage().c_str());
    }
    ////////////////////////////////////////

    Sangmin Lee

    10월 28, 2007 at 11:55 오전

  3. 즉, packet_header.h 에 프로토콜의 구조를 추가하고, Socket_c1.cpp 화일내에 주석으로 표기된 부분을 프로토콜에 따라 코드를 추가작성. ZeroSrv.cpp 의 Process 메소드에 URL 조립부분을 추가하면 된다. 접속하는 서버에 데이터를 요청하는 프로토콜이 필요하다면 아래부분에 해당 내용을 기술하면 된다.


    void Socket_v1::OnTimer(Time& now)
    {
    ////////////////////////////////////////
    // 타이머 이벤트
    if (getState()==asConnected) { // 연결되어 있다면 query 전송(?)
    Buffer b(1024);
    // 패킷작성

    Send(b); // 전송
    }
    else if (getState()==asClosed) { // 종료되어 있다면 연결시도
    Connect( getSrv()->getRemoteAddress(), getSrv()->getRemotePort() );
    }
    ////////////////////////////////////////
    }

    reconnect_interval 에 기술한 초단위로 불리워지는 이벤트이며 소켓이 연결되어 있는 상태라면, 필요한 query 를 작성해서 보낸다.

    필요하면 아래 메신저로 문의할것.

    MSN ID: l_sangmin@hotmail.com
    NateOn ID : l_sangmin@nate.com

    Sangmin Lee

    10월 28, 2007 at 1:00 오후


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: