티스토리 뷰

my Programing/J2ME

WMA 2.0과 Push Registry

Gandawon 2007. 11. 14. 16:04
WMA 2.0과 Push Registry

MIDP 2.0의 push registry는 MIDlets가 사용자의 개시(initiation) 없이 자동으로 론치되도록 스스로를 설정할 수 있게 해줍니다. 즉, push registry가 네트워크/타이머에 의한 MIDlet 활성화를 관리하는데, 다시 말해 인바운드 네트워크 커넥션 또는 타이머 기반 경보가 잠자고 있던 MIDlet을 깨워주는 것이라고 생각하시면 됩니다.

기본 구현이 필요한 지원을 제공할 경우, MIDlets는 들어오는 WMA 커넥션에 의해 활성화될 수 있습니다. MIDlets가 활성화되려면 반드시 먼저 정적 또는 동적 등록 방식을 이용하여 push registry에 등록해야 합니다. 정적 등록은 JAD 또는 MANIFEST 파일 내에 MIDlet-Push-n 엔트리를 배치함으로써 이루어지며, 동적 등록은 PushRegistry 오브젝트의 registerConnection() API를 이용하여 런타임 시에 이루어집니다.

다음은 정적 등록을 이용하는 예제입니다.

...
MIDlet-Push-1: sms://:50000, MyWmaMIDlet, +123456789
MIDlet-Push-2: cbs://:50001, MyWmaMIDlet, *
MIDlet-Push-3: mms://:com.j2medeveloper.MyMmsApp, MyWmaMIDlet, *
...
 

첫 번째 속성 값은 로컬(서버) 커넥션 URL, 즉 서버 프로토콜과 포트 번호 또는 애플리케이션 ID입니다. 두 번째 값은 지정된 커넥션 URL에 대해 들어오는 메시지를 처리하는 MIDlet 클래스의 이름이며, 세 번째는 MIDlet을 활성화할 수 있는 송신자를 제한하는 데 사용되는 필터입니다. 다음 코드 단편은 동적 등록을 이용하는 방법을 보여줍니다.

...
//  Identify the MIDlet class
String midletClassName = this.getClass().getName();
//  Register a static connection
String url = "sms://:50000";
//  Use a filter for SMS
String filter = "+123456789"; // only allow messages from +123456789
...

try {
    PushRegistry.registerConnection(url, midletClassName, filter);
} catch (IOException ioe) {
    // Handle the exception
} catch (ClassNotFoundException ioe) {
    // Handle the exception
}
...
 

MIDlet 인보케이션 전반에 걸쳐 제한이 유지되기 때문에, push 커넥션이 더 이상 필요치 않을 경우에는 unregisterConnection() 메소드를 호출하여 등록 해제하는 것이 중요합니다.

...
String url = "sms://:50000";
...

try {
    // unregisterConnection returns true if successful, false if not
    status = PushRegistry.unregisterConnection(url);
}
catch(SecurityException e) {
    // Handle the exception
}
...
 

listConnections() 메소드를 호출하여 MIDlet이 활성화되었는지 여부를 알아낼 수 있습니다. pushed 커넥션을 모두 찾아내어 처리하는 helper 메소드 processPushConnections()를 정의해 보기로 합시다. 보통 이 메소드는 애플리케이션 시동 과정에서 인보크하면 됩니다.

/**
 * Discover whether there are pending push inbound connections
 * and, if so, process
 */
public void processPushConnectionsThreaded() {
    Thread th = new Thread() {
        public void run() {
            String[] connections =
                PushRegistry.listConnections(true);
            if (connections != null && connections.length > 0) {
                for (int i=0; i<connections.length; i++) {
                    String connUrl = connections[i];
                    if ((connUrl.startsWith("sms")) ||
                        (connUrl.startsWith("cbs")) ||
                        (connUrl.startsWith("mms"))) {
                        try {
                            MessageConnection messageConnection;
                            messageConnection = (MessageConnection)
                                Connector.open(connUrl);
                            readMessage(messageConnection);
                        } catch (IOException ioe) {
                          // Ignore
                        }
                    }
                }
            }
        }
    };
    th.start();
}
 

시스템 쓰레드와의 경쟁을 피하고 메시지 처리를 serialize하여 메시지가 수신될 때와 동일한 순서로 처리될 수 있도록 하기 위해 processPushConnectionsThreaded() 메소드는 자체 실행 쓰레드 상에서 실행된다는 점에 유의하십시오. push registry의 API를 이용하는 구체적인 방법에 관해서는 "The MIDP 2.0 Push Registry(영문)"를 참조하시기 바랍니다.

보안

WMA는 보안 메커니즘을 정의하지 않는 대신 기본 플랫폼의 보안 프레임워크를 이용합니다. MIDP 2.0을 포함한 일부 플랫폼에서는 네트워킹 오퍼레이션이 특권 오퍼레이션으로 간주되는데, 이는 커넥션을 열거나 메시지를 송수신하려면 반드시 애플리케이션이 허가를 요구하고 플랫폼이 이를 수락해야 함을 의미합니다(구체적인 내용은 구현 상태에 의해 좌우됩니다). MIDP 2.0의 경우, 허가는 JAD 또는 manifest를 통해 요구되고 오퍼레이션(우리의 경우에는 open, send, receive)이 인보크될 때 사용자에 의해 수락(또는 거부)됩니다. 서명된 MIDlet의 경우에는 허가가 반드시 manifest에서 정의되어야 한다는 점에 유의하십시오.

다음은 JAD 또는 manifest를 통해 WMA 허가를 요구하는 예제입니다.

...
MIDlet-Permissions: javax.microedition.io.Connector.sms,
javax.wireless.messaging.sms.receive,
javax.wireless.messaging.sms.send,
javax.microedition.io.Connector.cbs,
javax.wireless.messaging.cbs.receive,
javax.microedition.io.Connector.mms,
javax.wireless.messaging.mms.receive,
javax.wireless.messaging.mms.send,
javax.microedition.io.PushRegistry
...
 

WMA는 애플리케이션에 대해 플랫폼 서비스를 인보크할 때 마주치는 허가 예외를 통지하기 위해 SecurityException 클래스를 정의합니다. 이 예외는 다음과 같이 throw될 수 있습니다.

  • javax.microedition.io.Connector: 애플리케이션이 플랫폼 보안 서비스에 의해 정의된 바에 따라 주어진 메시지 프로토콜을 위한 커넥션 생성 허가를 받지 않은 경우
  • MessageConnection.send(): 애플리케이션이 지정된 포트로 메시지를 송신하는 허가를 받지 않은 경우
  • MessageConnection.receive(): 애플리케이션이 지정된 포트로 메시지를 수신하는 허가를 받지 않은 경우

MIDP 2.0 허가에 관한 자세한 내용은 WMA 기술 페이지(영문)에 게시된 MIDP 2.0 스펙 및 WMA 권고 사항(Recommended Practices)을 참조하십시오.

'my Programing > J2ME' 카테고리의 다른 글

MathFP Class  (0) 2009.09.15
How to get IMEI in Java ME  (0) 2007.11.14
Java ME FAQ From Forum Nokia Wiki  (0) 2007.11.14
Supported Encodings  (0) 2007.10.29
댓글