Technology & Developer 02 Technology & Developer 자바를활용한 M2M 디바이스제어 ORACLE KOREA MAGAZINE Summer 2013 64 자바를활용한 M2M 디바이스제어 웨어러블디바이스, 스마트워치, 스마트그리드, 전기자동차등 M2M 열풍이불고있다. 한조사에 의하면, 2020 년경에는 M2M 디바이스의개수가 500 억개를넘어설것이라고한다. 이제 M2M 은 우리와멀리떨어진기술이아닌, 우리생활속에서개개인의생활패턴이나기호를분석하고, 이를 바탕으로삶을더욱편리하고의미있게만드는여러형태의서비스의가장기본이된다고볼수 있다. 이런다양한디바이스의출현의바탕은여러가지이유가있겠지만, 우선 HW 기술의발달로 우수한성능의하드웨어를개발자들이값싸게구입할수있고이를바탕으로다양한디바이스를 제공하는것이가능해졌다. 많은개발자들이과거에많은비용과노력이들어가서시도하지 못했던여러아이디어들을값싸고구하기쉬운하드웨어를바탕으로개인이 M2M 프로젝트를 시작할수있는환경이만들어진것이다. 최근에이런다양한개발용디바이스들을우리주변에서 값싸고쉽게구입할수있다. 대표적인것이 2012 년첫출시가되어 1 년동안백만대이상이팔린 라즈베리파이 (Raspberry Pi) 를들수있다. 저자 - 김홍일컨설턴트, 한국오라클 Java Embedded GSU(hong-il.kim@oracle.com) M2M 개발환경의진화 라즈베리파이의경우 25~35$ 라는저렴한가격에서도우수한성능의 ARM 프로세서를내장하고있으며, HDMI, Ethernet, USB, Audio, RCA Video 등다양한 Output 단자를가지고있으며, 또한 GPIO, UART, I2C, SPI 등과같은주변기기인터페이스를지원해서다른기기들을제어하거나통신하는데우수한환경 을가지고있다. 이디바이스하나로 1080p 의 full hd 동영상재생이가능하면서, 최대 3.5W 의전력소모를 가진다는것은여러면에서많은가능성을보여준다. < 그림 1> 은필자가현재보유하고있는 HW 의종류들로우리주변에서쉽게구매할수있으며현재다양 한데모나테스트용도로사용하고있다.
KEIL MCBSTM32F20 Oracle SunSpot Raspberry Pi Beagleboard-xM Pandaboard-ES ARM Cortex-M3 ARM 9 ARM 11 ARM Cortex-A8 ARM Cortex-A9 < 그림 1> M2M 개발용하드웨어 이렇게다양한 HW 환경속에서 M2M 에대한개발환경은나날이좋아지고있지만실제현업에서일하고 있는 SW 엔지니어들의이야기를들어보면, 디바이스개발이그리쉬운것만은아니다. 과거보다는많이 개발환경이개선이되었지만아직개인이아이디어하나만을가지고프로젝트를시작하기에는많은어려 움이있다. 각디바이스들이가지는표준화되지않은 API 들과개발환경, 빠르게발전하는하드웨어환경과부족한 라이브러리, 그리고아직활성화되지않은개발자커뮤니티들은개발의주요지연요소이고, 그결과로비 슷한프로젝트를진행하더라도, 다른개발환경에서발생하는문제들때문에프로젝트가지연되는것을 종종볼수있다. < 그림 2> M2M 개발을위한 SW 환경 CPU Proprietary API 이에이들 M2M 디바이스들의환경을통합할수있는플랫폼에대한시도가많아지고있고현재오라클 의 Java Embedded 솔루션의경우, 표준화된 API 를지원하면서다양한 HW 사양과우수한개발환경을 지원하는 M2M 의주요플랫폼으로자리잡고있다. Programming Language RTOS 65
66 Java ME Embedded Java ME Embedded 는스마트미터와같은작은 M2M 디바이스를대상으로만든오라클의 Java Embedded 솔루션들중의하나이다. Java ME(Mobile Edition) 의경우이미오랜기간, 수많은휴대폰에 탑재되어게임, 미디어플레이어, 네비게이션등다양한애플리케이션이만들어져왔고지금도많은개발 자들이이환경아래서여러애플리케이션들을만들고있다. Java ME Embedded 의경우, 기존 Java ME 에서일부기능들을그대로사용하고, M2M 에특화된기능들을새로추가하여만들어졌다. 다음은 Java ME Embedded 의 SW 구조이다. < 그림 3> 에서보면, 검정색으로된부분이 Java ME 로부터 가져온부분이고, 붉은색으로표시된부분이 M2M 을위해새롭게구현된부분이다. Runtime Environment Device Port OEM APIs AMS APIs < 그림 3> Java ME Embedded SW 구조 Logging APIs Access point APIs Device Access APIs IMP-NG CLDC-HI Virtual Machine Porting Layer 위모든기능들이포함이된 Binary 가약 2MB 의크기를가지고있으며, XML, Messaging, Security & Trust, Location, Web Services, PIM and File 와같은모듈들은옵션으로구성이되어있어서, 더 작은메모리의디바이스에도탑재가가능하다. 그럼작은 M2M 디바이스에탑재가가능한 Java ME Embedded 를이용하여개발하는방법에대해알아보자. Java ME Embedded 의경우, Emulator 를포함한 SDK 를제공해주기때문에, 디바이스가아직준비가되 어있지않다고하더라도, 개발자가애플리케이션개발을시작할수가있다. 그리고 Eclipse 와 Netbeans 와같은통합환경을지원하는 Plug-in 도지원이되기때문에여러분이익숙한통합개발환경을통해, 프로 그램의디버깅과프로파일링, 디바이스로의애플리케이션설치및관리를쉽게할수있다. XML Security & Trust Web Services Messaging Location PIM and File On-Device Debugging Tools Java Me SDK Test, Emulate NetBeans IDE Develop, Debug, Profile
< 그림 4> Java ME Embedded / Mobile Emulator 개발환경준비 Java ME SDK의경우에는자바가탑재된휴대폰을위한 Java ME Mobile Emulator와 M2M 디바이스를위한 Java ME Embedded Emulator가들어있다. 하나의환경으로 2가지종류의서로다른종류의애플리케이션개발이가능한것이다. Java ME SDK는 Java ME SDK 다운로드사이트에서에서다운로드를할수있으며, 가장최신버전은 Java ME SDK 3.3 Early Access 버젼이다. 미리말씀드리지만, 이글이세상에나올때는 Early Access 버전이아닌, 공식버전이나와있을수있다. Java ME SDK 3.3 Early Access 버전은공식버전은아니지만, 정식버전인 Java ME SDK 3.2에비해아래와같은주요기능들이추가가되었다. 라즈베리파이, KEIL보드 (MCBSTM32F20) 용 Java ME 3.3 바이너리호환 Java ME Embedded 3.3 주변기기 IO API 추가 : UART, ADC/DAC, AT command 애플리케이션메모리모니터링, 애플리케이션로그기능추가 이클립스 Plug-in 기능보강 Java SE SDK 설치자바애플리케이션을개발하기위해서는자바컴파일러와여러툴들이포함된 JDK(Java Development Kit) 이필요하다. Java SE 다운로드사이트에서 JDK를다운받아설치를한다. Java ME SDK 설치 JDK를설치완료하였다면, 앞서언급한 Java ME 다운로드링크에서 Java ME SDK 3.3 Early Access 버전 (oracle-java-me-sdk-3-3-rr-win-bin.exe) 과 Java ME SDK 3.3 Plugins for NetBeans(nb-builduc-oracle-java-me-sdk-3-3) 를다운로드받고, Java ME SDK 3.3 Early Access 버전을설치한다. NetBeans 설치 NetBeans의경우, 다양한종류의자바애플리케이션을지원하는통합개발환경이다. 최근에는 HTML5 개발에대한기능들을추가지원하는 NetBeans 7.3 버전을발표하였다. NetBeans 공식사이트를통해다운로드하고설치해보자. NetBeans Plugin 설치 nb-build-uc-oracle-java-me-sdk-3-3.zip 파일의압축을원하는디렉토리에풀고, NetBeans 를실행하 67
68 < 그림 5> NetBeans Plug-in Manager < 그림 6> NetBeans Plug-in Installation < 그림 7> Java ME Embedded 프로젝트생성 여, NetBeans의메뉴 Tools> Plugins를선택해서 Plugin Manager 를연다. Plugin 메뉴는 < 그림 5> 와같이구성되어있는데, 아래와같이 Downloaded 탭을선택하고, Add Plugins 버튼을눌러서압축해제된모든.nbm (NetBeans Modules) 파일들을선택한다. < 그림 6> 과같이모듈들이선택된상태에서, Install 버튼을눌러플러그인들을설치한다. 지금까지 Java ME Embedded 개발환경을구성하는방법에대해서알아보았다. 이제실제로 Java ME Embedded 애플리케이션을개발해보자. 자바애플리케이션개발본격적으로 Java ME Embedded 애플리케이션을만들어볼차례이다. NetBeans를실행하여, 메뉴 File > New Project를선택해서 Categories에서 Java ME를선택한다. < 그림 7> 의오른쪽창의 Projects: 에서 Embedded Application을선택해서, 프로젝트를만들게되면새로운 Java ME Embedded 애플리케이션을만들수있다. Next 버튼을누르고, 다음창에서 Finish를눌러, 애플리케이션을만들어보자. 아래와같은기본코드가생성되면서프로젝트가생성되었다. 아래의코드에서볼수있듯이, Java ME Embedded 애플리케이션의경우, 모두 MIDlet 클래스로부터상속을받고, start/pause/destroy 와같은기본라이프사이클을가진다. 애플리케이션이시작할때필
public class IMlet extends MIDlet { public void startapp() { } public void pauseapp() { } public void destroyapp(boolean unconditional) { } } Paused Active < 그림 8> Java ME Embedded 애플리케이션라이프사이클 < 그림 9> 샘플애플리케이션, GPIO Demo 생성 요한동작은 startapp() 메서드안에, 멈출때동작을 pauseapp() 에, 마칠때동작을 destroyapp() 안에정의를한다. < 그림 8> 은 Java ME Embedded 애플리케이션의라이프사이클을그림으로표현한것이다. Destroyed 샘플애플리케이션 SDK 안에는기본적으로제공되는샘플애플리케이션들이포함되어있다. 이샘플애플리케이션을통해 Java ME Embedded 애플리케이션의기본동작을확인하실수있다. < 그림 9> 와같이, New Project 창에서 Samples의 Java ME SDK 3.3을선택하고, GPIO Demo를선택해서프로젝트를만들어보자. GPIODemo 프로젝트가생성되면서, GPIODemo. 69
70 < 그림 10> GPIODemo 실행하기 < 그림 11> GPIODemo 가실행된 Java ME SDK emulator java 를통해, Java ME Embedded API 를사용한예제코드를확인해볼수있다. 이제 GPIODemo 프로젝트를선택하고, 마우스오른쪽클릭하여서브메뉴에서 Run을선택하여실행시켜보자. Java ME Embedded Emulator < 그림 11> 과같이여러개의 tab이보이는 Java ME Embedded 에뮬레이터가동작을하고, 에뮬레이터를통해 GPIODemo 의상태나동작을확인해보실수있다. 각탭의내용은다음과같다. AMS : 설치된 Java ME Embedded 애플리케이션의상태및동작을제어할수있다. GPIO Pins : GPIO (General Purpose I/O) 핀들이 Input/Output용인지, 그리고그상태를보여준다. GPIO Ports : GPIO Port가 Input/Output 용인지, 최대값과현재값을보여준다. I2C : I2C(Inter-Integrated Circuit) 을통해보내진데이터를다시전달하는단순한에뮬레이션을지원한다. SPI : SPI(Serial Peripheral Interface) 도 I2C 와마찬가지로보내진데이터를에코, 다시돌려받는기능을지원한다. MMIO : MMIO(Memory-Mapped I/O) 의경우, 4개 (TEST_DEVICE, WDOGLOG, RTC, BIG_ENDIAN_ DEVICE) 의다른디바이스종류를지원한다. ADC : ADC(Analog-to-Digital Converter) 의경우, 각채널의정보를보여주고, 그값을보여준다. DAC : DAC(Digital-to-Analog Converter) 의경우, 각채널의정보를보여주고, 해당데이터를그래프로보여준다. Pulse Counters : 입력에대해, Rising Edge/Falling Edge를선택해서그횟수를센다. External Events Generator < 그림 12> 에서붉은원으로표시된, External Events Generator Icon을누르게되면, External Events Generator 창이열리게된다.
External Events Generator 는에뮬레이션할때, 외부장치 ( 버튼, GPIO Input, GPS 값, 등 ) 에의한값을가상으로입력받아애플리케이션에게전달할수있도록만드는프로그램이다. 이중에서 GPIO가연결된버튼을조작해서, Application 에서의동작을확인해보겠다. < 그림 12> External Events Generator 를이용해 GPIODemo 애플리케이션상의 GPIO 입력값확인 < 그림 13> GPIO 의 Wave Generator 를이용해이벤트전달 < 그림 12> 와같이애플리케이션창과 External Events Generator 창모두 GPIO 탭을선택하고, BUTTON1 의버튼을눌러보자. 버튼의표시가 High/Low로변하고, 왼쪽창의 BUTTON1 Value의값도변하는것을볼수있다. 실제디바이스에서 HW GPIO Port 0에연결된 BUTTON1을눌렀을경우, 해당입력이애플리케이션에전달되어상태값이변하는것을볼수있다. 이번에는 < 그림 13> 과같이 BUTTON1 아래 Frequency 에 10을, Duration 에 1000을넣고, 아래 Run 버튼을눌러보자. 버튼의눌림이 1초동안에 10번반복되는것을볼수있다. 이제 AMS탭을선택해서, Stop버튼을누르게되면, 실행하던애플리케이션이멈추어사라지는것을볼수있다. 이렇게디바이스없이도,, External Events Generator 를통해가상의이벤트를만들어애플리케이션개발과테스트에적용할수있는환경을제공한다. 71
72 < 그림 14> Device Selector 를이용해실제디바이스연결 < 그림 15> Device Selector 를이용해실제디바이스연결 < 그림 16> Device Selector 에연결된 Keil 보드 실제디바이스에서의개발 NetBeans 상에서실제디바이스와연결해서개발을하기위해서는, 해당기기를 NetBeans에등록을해야한다. < 그림 14> 와같이 Tools > Java ME > Device Selector를선택하게되면, 그림의왼쪽아래와같이 Device Selector 창이나타나게된다. 여기서붉은원으로표시된 Add External Device 아이콘을클릭하게되면, Add External Device 버튼을누르게되면, < 그림 15> 과같이 Add Device 창이열리면서, 연결하고자하는디바이스의 IP주소입력창이나타난다. 주소를입력하고, Next를누르면자동으로 Java ME Embedded 가탑재된디바이스를검색하게되고, 찾게되면 Finish를눌러등록을할수있다. 현재 < 그림 16> 는 Keil이라는디바이스를등록한화면이다. 이렇게 Java ME Embedded 의경우, 간단한방법으로여러개의다른종류의디바이스를등록해서사용할수있고, 모든디바이스들에게같은개발환경을제공한다. 이디바이스에 GPIODemo 프로젝트를설치해서동작하는방법은 GPIODemo 프로젝트에마우스오른쪽버튼클릭으로 Property를선택한후, < 그림 17> 와같이 Device 를 Keil로선택을하고, Run시키면된다. 이렇게실행시키면, 선택된애플리케이션이디바이스에자동으로설치되고, 디바이스상에서테스트해볼수있다. 이
< 그림 17> 등록한 Keil 보드를이용해서애플리케이션실행 외에도, 디바이스상에서의디버깅, 프로파일링, 애플리케이션메모리사용모니터링, 애플리케이션로그등다양한기능을 Emulator 를사용할때와같은방법으로사용할수있다. 개발가능한디바이스앞서언급하였듯이, 현재 Java ME Embedded 3.3 binary 가제공되는디바이스들은다음과같다. 라즈베리파이 Keil MCBSTM32F200 < 그림 18> 라즈베리파이 < 그림 19> KEIL MCBSTM32F200 보드 위디바이스들의 Java ME 바이너리는아래그림과같이 Java ME 다운로드사이트를통해다운받으실수있고, 라스베리파이나 Keil보드의경우인터넷을통해쉽게구매할수있다. < 그림 20> 라스베리파이, KEIL 보드용 Java ME Embedded 바이너리다운로드링크 73
74 위링크들로부터다운로드받은 Java ME Embedded 바이너리를설치, 사용하는기본적인방법은아래링크된비 디오에잘나와있다. Getting started with Java ME Embedded 3.3 on the Keil Board. PART I http://www.youtube.com/watch?v=liudwtlzz3i Getting started with Java ME Embedded 3.3 on the Keil Board. PART II http://www.youtube.com/watch?v=sgiulmq_dpy Getting Started with Oracle Java ME Embedded and Raspberry Pi http://www.youtube.com/watch?v=na7amutk9se 결론 앞서이글을시작할때언급한것처럼, 하드웨어와소프트웨어환경은최근 M2M 영역에서도빠르게발전해나가고 있다. 아이디어하나로시작해서 M2M 제품을개발하는것이더이상남의일이아니다. M2M 영역도기존의 B2B 환경에서 B2C 환경으로옮겨가고있는것이다. 과거휴대폰의다양한플랫폼에서스마트폰플랫폼과같은표준화된 플랫폼으로옮겨오면서앱스토어를통해많은성공사례를보여주었듯이, M2M 도이제는우수한소프트웨어플랫폼 을기반으로많은기회를제공할것으로본다. 이런시장환경에서경쟁력을갖추기위해서는 Java ME Embedded 와같은우수한 M2M 개발환경은이제선택이 아닌필수라고생각한다. Java ME SDK 다운로드사이트 http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/index.html Java ME 다운로드사이트 http://www.oracle.com/technetwork/java/embedded/downloads/javame/index.html Java SE 다운로드사이트 http://www.oracle.com/technetwork/java/javase/downloads/index.html NetBeans 공식사이트 http://netbeans.org