ImJa 솔루션
ImJa 보드에서 ImJa 라이브러리를 사용하면 자바 언어도 유닉스에서 UDS를 이용하여 내부 프로세스끼리 통신할 수 있습니다. 자바에서 UDS 통신하는 방법을 이전 글에서 소개했습니다만, 이클립스에서 프로그램을 작성하고 컴파일해서 실행하는 과정만 보여 드렸습니다. 이번 시간에는 이전 글에서 소개한 샘플을 자세히 설명하겠습니다.
UDS는 내부 프로세스 간의 통신으로 샘플에서는 문자열을 수신하는 udsSample와 문자열을 전송하는 udsTester로 나누어 작성했습니다. 다시 말씀 드려서 프로세스끼리의 통신이라 두 개의 어플리케이션을 만든 것이죠.
UDS는 같은 시스템 안에서 실행하는 프로세스 끼리의 통신이기 때문에 IP 주소 같은 시스템 고유 정보를 사용해서는 통신할 수 없습니다. 그래서 UDS는 프로세스끼리 서로 다른 파일 이름을 이용하여 구별하 수 있도록 했습니다.
샘플을 자세히 보면 udsSample은 /tmp/1st.uds 파일을 사용하고 udsTester은 /tmp/2nd_uds 파일을 사용합니다. 만일 udsSample에서 udsTester로 정송할 데이터가 있다면 /tmp/2nd_uds 파일을 통해 전달하면 됩니다. udsTester도 마찬가지입니다. /tmp/1st.uds 파일을 이용하여 udsSample로 데이터를 전송할 수 있습니다.
이해를 돕기 위해 udsSample 패키지에서 주용 부분만 보시겠습니다.
package udsSample; public class UdsSampleMain extends Uds { public UdsSampleMain(String udsFileName) { ............ } public int onRead(long handle) { --------------(3) int readBytes = this.read(bufUdpRead); // 수신된 데이터 읽기 byte[] buf = new byte[readBytes]; // byte배열 설정 bufUdpRead.flip(); // 읽은 데이터 설정 bufUdpRead.get(buf); // 데이터를 byte배열에 설정 System.out.print("received:"); // 받은데이터 문자열 출력 System.out.println(new String(buf)); // 받은데이터 문자열 출력 bufUdpRead.compact(); // bytebuff포지션 재설정 bufUdpWrite.put(buf); // 받은 데이터를 송신 버퍼에 설정 bufUdpWrite.flip(); // 송신 데이터 설정 this.write(bufUdpWrite, "/tmp/2nd.uds");// 데이터 송신 bufUdpWrite.compact(); // 송신 bytebuff포지션 재설정 return readBytes; } public void run () { while (true) { ----------- (2) poll.pollDoLoop(100); } } public static void main(String args[]) { new UdsSampleMain("/tmp/1st.uds").run(); -------- (1) } }
(1) /tmp/1st.uds 파일을 지정하여 UDS 객체를 생성했습니다.
(2) UDS 객체 상태를 poll 객체로 확인합니다. 만일 수신된 데이터가 있다면 onRead() 함수가 자동 호출됩니다.
(3) 버퍼에 쌓여 있는 수신 데이터를 받아서 /tmp/2nd.uds 파일을 통해 udsTester로 전송합니다.
어떻습니까? 코드 내용이 이해되시나요? 이번에는 udsTester입니다. udsTester은 /tmp/1st.uds 파일을 이용하여 udsSample로 문자열을 전송합니다.
package udsTester; public class UdsTesterMain extends Uds { public UdsTesterMain(String udsFileName) { ................ } public int onRead(long handle) { ................ } public void run () { long tmCurrent = 0L; long tmBefore = 0L; while (true) { poll.pollDoLoop(100); tmCurrent = System.currentTimeMillis(); if ((tmCurrent - tmBefore) > 1000) { ----------(2) tmBefore = tmCurrent; bufUdpWrite.put( "2nd message".getBytes()); bufUdpWrite.flip(); this.write(bufUdpWrite, "/tmp/1st.uds"); bufUdpWrite.compact(); } } } public static void main(String args[]) { new UdsTesterMain("/tmp/2nd.uds").run(); ----------(1) } }
(1) /tmp/2nd.uds 파일을 이용하는 UDS 객체를 생성합니다.
(2) 시간을 계산하여 1초마다 /tmp/1st.uds 파일을 통해 udsSample로 문자열을 전송합니다.
어떻습니까? 간단하지요?