2008년 7월 11일 금요일

MoteDaemon - Wii Mote를 소켓프로그래밍으로 사용하기 (Access Wii Mote by network socket API)

Picture 1.png

MoteDaemon은 WII Mote를 Mac에 연동해서 쉽게 사용할 수 있게 해 주는 프로그램이다.

지금까지 나온 유사한 종류의 프로그램들은 대부분 모트를 마우스 대용으로 사용하거나 리모컨 용도로 사용할 수 있게 해 주었지만 자신이 직접 만든 프로그램에서 자유롭게 사용하기는 쉽지 않았다.

특히 플래쉬로 프로그램을 만드는 경우 플래쉬에서 위 모트와 직접 인터페이스를 할 방법이 없었다.

위의 그림은 플래쉬로 만들어 진 샘플 프로그램으로 먼저 MoteDaemon을 실행한 다음 WII Cockpit을 실행하면 위와 같은 화면이 나오게 되고 모트의 1과 2 버튼을 동시에 누른 다음 화면의 Connect를 눌러주면 된다. 정상적으로 연결되고 나면 모트를 움직이면 그에 반응해 화면의 계기들이 움직인다.

(MoteDaemon은 맥에서만 동작하고 윈도우에서는 동일한 역할을 해 주는 프로그램으로 WiiFlash가 있다. 다만 WiiFlash는 메세지 포멧으로 XML대신 binary를 사용하고 있다.)

MoteDaemon은 모트와 인터페이스를 담당하고 그 결과를 소켓 인터페이스를 통해 XML 메세지로 바꿔 전달해 준다. 즉 MoteDaemon이 모트와의 연결관리, 블루투스를 통한 데이터 교환을 담당해 주기 때문에 어느 프로그램에서건 별도로 블루투스 프로그래밍을 배울 필요 없이 일반 네트웍 소켓 프로그래밍 하는것과 동일한 방법으로 위 모트의 입력을 전달받을 수 있다.

사용자 삽입 이미지

사용자 삽입 이미지

물론 대부분의 경우는 MoteDaemon과 Client는 같은 컴에서 실행되지만 다른 컴퓨터에서 실행되도 관계 없다.

클라이언트와 서버간 통신은 간단한 XML 프로토콜을 사용한다.


XML 메세지 포맷

MoteDaemon은 다음의 프로토콜을 사용한다. MoteDaemon에서 클라이언트로 보내는 각각의 메세지는 다음의 XML root element 타입중에 하나를 가지게 된다.

<device />

이 element는 한번에 여러개의 axis values를 가지게 된다. 메시지를 보내는 리모트의 주소를 값으로 가지는 attribute와 각 축의 값을 가지는 여러개의 axisValue 타입의 child element를 포함하게 된다. X,Y,Z 축의 가속도 센서와 조이스틱의 값은 0~255 사이의 정수이다. Pitch와 Roll 축은 +- 사인을 가지는 부동소수점으로 도(degree)로 표현된다.

<buttonChange />

리모트 컨트롤러의 버튼 이벤트를 나타낸다. state attribute는 버튼의 상태 변화를 나타낸다. (버튼이 눌리면 1, 눌린 버튼이 띠어지면 0). ID attribute는 상태가 변한 버튼이 어떤 것인지 알려준다.

<disconnect />

리모트 컨트롤러와의 association이 어떤 이유에서건 취소되었다는걸 알려준다.

<error />

서버에 에러가 발생하면 <error /> 메시지로 알려주게 된다.


XML 메세지 예제

아래 메세지 예를 보면 어떤 식으로 데이터가 전달되는지 쉽게 알 수 있을 것이다.

Listing 1: Record combined with axis data

<device address="00-19-1d-62-36-84">

<!-- Accelometer of WII remote control -->

<axisValue axis='wx' value='128' /> <!-- X-Axis -->

<axisValue axis='wy' value='124' /> <!-- Y-Axis -->

<axisValue axis='wz' value='100' /> <!-- Z-Axis -->

<axisValue axis='wp' value='0.01' /> <!-- Pitch axis -->

<axisValue axis='wr' value='-10.2' /> <!-- Roll axis -->

<!-- Nunchuk Accelometer -->

<axisValue axis='nx' value='128' /> <!-- X-Axis -->

<axisValue axis='ny' value='128' /> <!-- Y-Axis -->

<axisValue axis='nz' value='90' /> <!-- Z-Axis -->

<axisValue axis='np' value='4.4' /> <!-- Pitch axis -->

<axisValue axis='nr' value='-1.2' /> <!-- Roll axis -->

<!-- Joystick -->

<axisValue axis='jx' value='62' />

<axisValue axis='jy' value='65' />


Listing 2: Button, Disconnect and error event

<!-- Button 5 of remote control 00-19-1d-62-36-84 goes low -->

<buttonChange state='1' id='5' address='00-19-1d-62-36-84' />

<!-- Button 5 of remote control 00-19-1d-62-36-84 goes high -->

<buttonChange state='0' id='5' address='00-19-1d-62-36-84' />

<!-- Connection to remote control 00-19-1d-62-36-84 finished -->

<disconnect address='00-19-1d-62-36-84' />

<!-- error message -->

<error type='discovery' message='A Bluetooth error occured. Please remove all RVL-CNT-01 devices from Bluetooth preferences and try again.' />


댓글 없음:

댓글 쓰기