* 저자: Bruce Hopkins
민간 산업 부문뿐만 아니라 미 국방부에서도 낮은 데이터율(그리고 그 결과로서 일어나는 낮은 전력 소모)의 무선 통신이 필요한 애플리케이션이 몇 가지 있습니다. 예를 들어, 대부분의 현대 수송 수단에는 타이어 압력 감시 시스템을 포함하고 있습니다.
타이어 압력 센서 데이터가 어떻게 각각의 타이어로부터 차량 내부의 임베디드 컴퓨팅 시스템으로 또한 최종적으로 대시보드로 전달되는지 궁금했던 적은 없습니까? 타이어의 센서를 대시보드의 데이터 버스로 연결하는 와이어는 분명히 없습니다. 따라서, 타이어 압력 센서로부터 센서 데이터를 가져오기 위해서 사용할 수 있는 메커니즘이 몇 가지 필요합니다. 게다가, 그러한 메커니즘은 무선이어야 하며 중지되지 않고 오랜 시간동안 작동할 수 있어야 합니다.
이 테크팁에서 우리는 센서 데이터를 읽는 저대역폭 무선 시스템을 개발하기 위한 자바 ME와 썬 SPOT 기술의 용법을 살펴 볼 것입니다. 다음의 이미지에서는 SPOT 중 하나를 25센트 동전과 비교하여 보여줍니다.

다음에 몇 가지 썬 SPOT 스펙이 있습니다. - 왜 필자가 이러한 새로운 컴퓨팅 플랫폼에 애플리케이션을 작성 및 배치하는 것에 대해 흥미를 갖게 되었는지 알 수 있을 것입니다.
Java ME CLDC 1.1 JVM (Squawk VM)
180 MHz 32 bit 프로세서
512K RAM
4M Flash 메모리
IEEE 802.15.4 무선 통신(통합 안테나 있음)
3-축 가속도계(accelerometer)
온도 센서
광센서
6개의 아날로그 입력(ADC 있음)
2 개의 사용자가 프로그램할 수 있는 스위치
충전지
썬 SPOT는 802.15.4 스펙을 따름에도 불구하고 ZigBee 프로토콜의 상위 계층을 구현하지 않았기 때문에 진정한 ZigBee 장치와는 완전히 맞지는 않는다는 점에 유의하십시오. 많은 사람들에게 ZigBee는 매우 생소하므로, 좀 더 보편적인 무선 통신 프로토콜과 비교해 봅시다. 아래 표는 WiFi, Bluetooth 및 ZigBee를 비교한 것입니다.
위에서 보듯이 ZigBee(또는 기타 다른 IEEE 802.15.4에서 파생된 것들)는 무선 센서 애플리케이션을 위한 이상적인 프로토콜입니다. 이러한 애플리케이션들은 원하는 센서 또는 센서 어레이(예: 타이어 압력 센서)로 물리적 연결을 하기에는 비현실적이거나 맞지 않는다는 시나리오로 특징지어 집니다. 썬 SPOT SDK에는 (3) SPOT 장치가 포함됩니다. 그 중 하나는 컴퓨터에 USB 케이블로 연결되며, 나머지 두 개는 자유롭게 옮겨다닐 수 있는 한편 이것은 베이스 스테이션으로서의 역할을 합니다.
이 테크팁은 두 개의 완전히 작동하는 애플리케이션을 소개합니다. 첫 번째 것은 베이스 스테이션 애플리케이션으로, 두번째 애플리케이션인 자유롭게 옮겨다니는(free roaming) 무선 썬 SPOT으로부터 데이터를 수신합니다. 이 시나리오에서 두 장치가 서로를 찾는 디스커버리 메커니즘은 실행하지 않습니다. 필자는 이미 베이스 스테이션과 프리 로밍 SPOT 모두의 ZigBee 어드레스를 알고 있으므로 그것들이 서로 직접 어드레스를 지정하도록 할 것입니다. SPOT은 CLDC JVM을 가지고 있으므로 베이스 스테이션에서 프리 로밍 SPOT으로의 커넥션을 오픈하기 위해 GCF(Generic Connection Framework)를 사용합니다.
Connector.open("radiostream://0014.4F01.0000.1447:55");
위에서 보듯, 프리 로밍 SPOT의 무선 주소는 0014.4F01.0000.1447입니다. 이 애플리케이션에서는 포트 번호 55를 임의로 선택했으나 애플리케이션을 위한 포트 번호로 31과 127 사이의 어떠한 숫자 값이든 자유롭게 사용할 수 있습니다.
다음은 베이스 스테이션 애플리케이션을 위한 전체 소스인 HostReceiver.java입니다. 여기에서는 프리 로밍 SPOT 장치로 무선 커넥션을 오픈하고 원격 장치에서 온도 기록을 10번 수신합니다.
package receiver;
import com.sun.spot.peripheral.*;
import com.sun.spot.peripheral.radio.*;
import com.sun.spot.io.j2me.radio.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.IEEEAddress;
import java.io.DataInputStream;
import javax.microedition.io.InputConnection;
import com.sun.spot.util.*;
import java.io.*;
import javax.microedition.io.*;
public class HostReceiver {
/**
* Print out our radio address.
*/
public void run() throws IOException{
IEEEAddress zigbeeAddress = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress());
System.out.println("The Host station Zigbee radio address = " + zigbeeAddress.asDottedHex());
StreamConnection streamConnection = (StreamConnection) Connector.open("radiostream://0014.4F01.0000.1447:55");
for(int i=0; i<10; i++){
DataInputStream data_input_stream = streamConnection.openDataInputStream();
double value = data_input_stream.readDouble();
System.out.println("The temperature is: " + value + "F");
data_input_stream.close();
Utils.sleep(3000);
}
streamConnection.close();
System.exit(0);
}
/**
* Start up the host application.
*
* @param args any command line arguments
*/
public static void main(String[] args) throws Exception {
HostReceiver app = new HostReceiver();
app.run();
}
}
다음은 온보드 온도 센서를 사용하여 주위 온도를 추출하는 프리 로밍 SPOT을 위한 코드입니다. 온도를 10회 추출하여 그 데이터를 베이스 스테이션으로 전송합니다. 이 애플리케이션은 외부 LED를 여러 가지 색으로 켜서 오퍼레이터가 SPOT이 적절하게 작동하고 있는지 또는 예외 상황이 발생했는지 알 수 있도록 하는 등 몇 가지 부가적인 작업도 수행합니다. 이 모든 코드는 SpotSender.java 파일에 들어 있습니다.
package sender;
import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.sensorboard.io.ITemperatureInput;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import java.io.*;
import javax.microedition.io.*;
public class SpotSender extends MIDlet {
public StreamConnection streamConnection = null;
public ITemperatureInput temperatureSensor = null;
public IEEEAddress zigbeeAddress = null;
public SpotSender(){
try {
streamConnection = (StreamConnection) Connector.open("radiostream://0014.4F01.0000.1709:55");
temperatureSensor = EDemoBoard.getInstance().getADCTemperature();
zigbeeAddress = new IEEEAddress(Spot.getInstance().getRadioPolicyManager().getIEEEAddress());
System.out.println("Our radio address = " + zigbeeAddress.asDottedHex());
} catch (IOException e){
System.out.println("exception in constructor");
}
}
protected void startApp() throws MIDletStateChangeException {
// get a reference to the LED array
ITriColorLED [] leds = EDemoBoard.getInstance().getLEDs();
// set LED2 to green
leds[2].setRGB(0,100,0);
for(int i=0; i<10; i++){
// turn all LEDs off
leds[2].setOff();
leds[3].setOff();
leds[4].setOff();
// turn LED2 on
leds[2].setOn();
Utils.sleep(250);
try{
DataOutputStream data_output_stream = streamConnection.openDataOutputStream();
data_output_stream.writeDouble(temperatureSensor.getFahrenheit());
data_output_stream.close();
// set the color to blue
leds[3].setRGB(0,0,100);
leds[3].setOn();
} catch (Exception e){
// set the color to red
leds[4].setRGB(100,0,0);
leds[4].setOn();
}
leds[2].setOff();
Utils.sleep(3000);
}
try{
streamConnection.close();
} catch (IOException e){
}
}
protected void pauseApp() {
// This will never be called by the Squawk VM
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// Only called if startApp throws any exception other than MIDletStateChangeException
}
}
이제 이 코드를 직접 전개하고 실행하면 어떤 결과가 나타날까요? 베이스 스테이션 애플리케이션으로부터 다음과 같은 결과를 얻을 수 있을 것입니다.
The Host station radio address = 0014.4F01.0000.1709
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.5F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.95F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.05000000000001F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.5F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.95F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.05000000000001F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.5F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.05000000000001F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.5F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
[radiostream] Adding: Input from 0014.4F01.0000.1447 on port 55
The temperature is: 90.5F
[radiostream]Removing: Input from 0014.4F01.0000.1447 on port 55
성공입니다.
* 이 아티클의 영문 원본은
http://blogs.sun.com/mobility_techtips/ ··· ion_with
에서 보실 수 있습니다.
"Java ME" 카테고리의 다른 글
- 블루투스와 GPS 사용: 1부 - 무선 직렬 포트 데이터 읽기 (댓글 0개 / 트랙백 0개) 2008/08/11
- 서비스 지향 아키텍처 및 자바 ME (댓글 7개 / 트랙백 0개) 2007/04/10
- destroyApp()는 당신의 친구 (댓글 0개 / 트랙백 0개) 2009/09/28
- 자바 ME 장치 매트릭스로 필터 사용 (댓글 0개 / 트랙백 0개) 2008/03/13
- Java ME를 사용한 블루레이 디스크 애플리케이션 개발 제 1 부: 나만의 애플리케... (댓글 0개 / 트랙백 0개) 2008/10/13
- 모바일 플랫폼의 비교: Java ME와 Adobe Flash Lite (댓글 0개 / 트랙백 1개) 2008/06/03
- NetBeans Mobility Pack 5.0 입문을 위한 속성 가이드 (댓글 5개 / 트랙백 0개) 2006/09/26
- 모바일 자바 플랫폼의 현재와 미래 (댓글 5개 / 트랙백 1개) 2006/07/26
- MIDlet의 로깅과 모니터링을 위한 간단한 전략 (댓글 0개 / 트랙백 0개) 2009/10/22
- 아프리카에서 전하는 소식: 이 지역에서 자바 ME 플랫폼에 주어진 과제와 기회 (댓글 0개 / 트랙백 0개) 2008/12/16
댓글을 달아 주세요