Article
The Wireless Messaging API 2.0
 
ÀúÀÚ C. Enrique Ortiz
 

WMA(Wireless Messaging API)´Â MIDP(Mobile Information Device Profile) ±â¹Ý ¾ÖÇø®ÄÉÀ̼ÇÀÌ °£´ÜÇÑ ÅØ½ºÆ®/¹ÙÀ̳ʸ® ¸Þ½ÃÁö¿Í ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö¸¦ ÁÖ°í¹Þµµ·Ï ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â °øÅë ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÕ´Ï´Ù. ÀÌ ¸Þ½ÃÁöµéÀº ÀϹÝÀûÀ¸·Î ¸Þ½ÃÁöÀÇ Àü´ÞÀ» º¸ÀåÇØÁÖ´Â SMS(Short Messaging Service)³ª MMS(Multimedia Messaging Service) °°Àº ÃàÀû Àü¼Û(store-and-forward) ¸Þ½Ã¡ ½Ã½ºÅÛÀÇ ÀϺÎÀÎ °æ¿ì°¡ ´ëºÎºÐÀÔ´Ï´Ù.

Java Community Process¿¡¼­ JSR 120À¸·Î óÀ½ ¼Ò°³µÈ WMA 1.1Àº JSR 205¿¡¼­ WMA 2.0À¸·Î ¹öÀü¾÷ µÇ¾ú½À´Ï´Ù. WMA ±â¼ú ÆäÀÌÁö(¿µ¹®)¿¡¼­ WMA¿¡ °üÇÑ ÀÚ¼¼ÇÑ Á¤º¸¿Í ÂüÁ¶ ±¸Çö(reference implementation)À» º¸½Ç ¼ö ÀÖ½À´Ï´Ù. º» ±â»ç¿¡¼­´Â ¹öÀü 1.1°ú 2.0ÀÇ Â÷ÀÌÁ¡À» ¼³¸íÇϰí ÀÌ ¸Þ½Ã¡ API¸¦ ÃÖ´ëÇÑÀ¸·Î Ȱ¿ëÇÏ´Â ¹æ¹ýÀ» ¼Ò°³ÇÕ´Ï´Ù.

Contents
 
WMA °³°ü
WMA 2.0 ¸Þ½ÃÁö ŸÀÔ
WMA Ä¿³Ø¼Ç
¸Þ½ÃÁö Ä¿³Ø¼Ç »ý¼ºÇϱâ
¸Þ½ÃÁö Ä¿³Ø¼Ç Á¾·áÇϱâ
¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ
ÅØ½ºÆ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ
¹ÙÀ̳ʸ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ
¸ÖƼÆÄÆ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ
¸Þ½ÃÁö ºÎºÐ ÀÛ¼ºÇϱâ
µé¾î¿À´Â ¸Þ½ÃÁö ´ë±âÇϱâ
¸Þ½ÃÁö ó¸®Çϱâ
¸Þ½ÃÁö Áö¼Ó¼º
ºÐÇÒ°ú ÀçÁ¶¸³(SAR)
½Ã½ºÅÛ ¼Ó¼º
WMA 2.0°ú Push Registry
º¸¾È
WMA v2.0 ÂüÁ¶ ±¸Çö(Reference Implementation)
Server-to-Handset ¸Þ½Ã¡
¿ä¾à
Âü°íÀÚ·á

WMA °³°ü

WMA´Â ¹«¼± ¸Þ½ÃÁö¸¦ ÁÖ°í¹ÞÀ» ¼ö ÀÖ´Â ÈÞ´ëÆù µîÀÇ ÀåÄ¡¸¦ °Ü³ÉÇÑ ±â¼ú·Î¼­, °³º° ÅØ½ºÆ®/¹ÙÀ̳ʸ® ¸Þ½ÃÁö»Ó ¾Æ´Ï¶ó ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö Àü¼Û¿¡ ÁÖ·Î »ç¿ëµÇ´Â ¸ÖƼÆÄÆ® ÆäÀ̷ε带 Àü¼ÛÇϱâ À§ÇÑ ¸Þ½Ã¡ APIÀÔ´Ï´Ù.

¸Þ½ÃÁöÀÇ Àü´Þ ¹æ½ÄÀº GSM SMS, GSM CBS, CMDA SMS, MMS µî°ú °°Àº ±âº»ÀûÀÎ Æ®·£½ºÆ÷Æ®(transport) ¶Ç´Â º£¾î·¯(bearer)¿¡ ÀÇÇØ °áÁ¤µË´Ï´Ù. ¸Þ½ÃÁö Æ÷¸Ë°ú Æ®·£½ºÆ÷Æ®´Â °¢°¢ÀÇ Ç¥ÁØ¿¡ ÀÇÇØ Á¤ÀǵÇÁö¸¸, ´ë°³ÀÇ °æ¿ì WMAÀÌ ÀÌ¿Í °°Àº ¼¼ºÎ»çÇ×À» ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇØ º¸´Ù Åõ¸íÇÏ°Ô ¸¸µé¾îÁÝ´Ï´Ù. ÇÑÆí, SMS¿Í MMS Æ®·£½ºÆ÷Æ®´Â ½ÇÁ¦·Î ³×Æ®¿öÅ© »ó¿¡¼­ ¼­·Î ´Ù¸¥ ¹æ½ÄÀ¸·Î °ü¸®µÈ´Ù´Â »ç½Ç°ú MMS´Â ´ÜÁö ´õ Å« SMS ÆÐŶÀ» Àü¼ÛÇϱâ À§ÇÑ ¼ö´Ü¿¡ ºÒ°úÇÑ °ÍÀÌ ¾Æ´Ï¶ó´Â Á¡¿¡ À¯ÀÇÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¶ÇÇÑ, WMA´Â ¸Þ½ÃÁö Å©±â µîÀÇ ¿ä¼Ò¿¡ Á¦ÇÑÀ» µÎÁö´Â ¾ÊÁö¸¸, °ð »ìÆìº¸°Ô µÇ´Â °Íó·³ ±âº» Æ®·£½ºÆ÷Æ®´Â ÀÌ·± ¿ä¼Ò¿¡ Á¦ÇÑÀ» µÐ´Ù´Â Á¡À» ¾Ë°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.

WMA´Â GCF(Generic Connection Framework)¸¦ ±â¹ÝÀ¸·Î Çϸç, J2ME ¿É¼Ç ÆÐŰÁö·Î Á¤Àǵ˴ϴÙ. ´Ù½Ã ¸»ÇØ, Ç¥ÁØ ±¸¼ºÀ» ±â¹ÝÀ¸·Î ¼ÒÇÁÆ®¿þ¾î ½ºÅÿ¡ Ãß°¡ÇÒ ¼ö Àִ ƯȭµÈ API¸¦ Æ÷ÇÔÇϰí ÀÖ´Â °ÍÀÔ´Ï´Ù. WMAÀÇ ÃÖ¼Ò °øÅëºÐ¸ð´Â CLDC(Connected Limited Device Configuration)Àε¥, CLDC´Â CDC(Connected Device Configuration)ÀÇ ºÎºÐÁýÇÕÀ̹ǷΠWMA´Â CLDC ¹× CDC ±â¹ÝÀÇ ½ºÅà ¸ðµÎ¿¡ Æ÷Ç﵃ ¼ö ÀÖ½À´Ï´Ù. ±×¸² 1Àº WMA 2.0ÀÇ ±¸¼º¿ä¼ÒµéÀ» °£·«ÇÏ°Ô º¸¿©ÁÖ°í ÀÖ½À´Ï´Ù.

Figure 1: of the Wireless Messaging API 2.0
±×¸² 1: WMA 2.0ÀÇ ±¸¼º¿ä¼Ò (È®´ë À̹ÌÁö º¸±â)
 
WMA - Çʼö ¿É¼Ç ÆÐŰÁö
JTWI´Â ¸ðµç Áعý Çڵ弼Ʈ°¡ ¹Ýµå½Ã Á¦°øÇØ¾ß ÇÏ´Â ÃÖ¼Ò/°øÅëÀÇ Æ¯¼ºÀ» Á¤ÀÇÇϸç, WMA 1.1 Áö¿øÀ» ¿ä±¸ÇÏ´Â ¹Ý¸é WMA 2.0 Áö¿øÀº ¿ä±¸ÇÏÁö ¾Ê½À´Ï´Ù. ¸ð¹ÙÀÏ ¾ÆÅ°ÅØÃ³ÀÇ ÁøÈ­¸¦ °è¼Ó À̾´Â MSAÀÇ °æ¿ì, WMA 2.0À» Çʼö ÆÐŰÁö·Î ¸í½ÃÇϰí ÀÖ½À´Ï´Ù.
 

WMA ±× ÀÚü´Â Java ME(Java Platform, Mobile Edition)ÀÇ ¿É¼Ç ÆÐŰÁö·Î Á¦°øµÇÁö¸¸, JTWI(Java Technology for the Wireless Industry) ½ºÆåÀÎ JSR 185 ±×¸®°í »õ·Î¿î CLDC¿ë MSA(Mobile Service Architecture)ÀÎ JSR 248À» ÁؼöÇØ¾ß ÇÏ´Â Çڵ弼Ʈ(ÈÞ´ëÀüÈ­ ´Ü¸»±â)¿¡´Â Àǹ«ÀûÀ¸·Î žÀçÇØ¾ß ÇÕ´Ï´Ù.

WMA ƯÀ¯ÀÇ ÀÎÅÍÆäÀ̽º¿Í Ŭ·¡½º´Â ¸ðµÎ ¹«¼± ÅØ½ºÆ®/¹ÙÀ̳ʸ®/¸ÖƼÆÄÆ® ¸Þ½ÃÁö¸¦ ÁÖ°í¹Þ´Â µ¥ ÇÊ¿äÇÑ ¸ðµç API¸¦ Á¤ÀÇÇÏ´Â ÇϳªÀÇ ÆÐŰÁö javax.wireless.messaging¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. Ç¥ 1Àº ÀÌ ÆÐŰÁö¸¦ ¿ä¾àÇÑ °ÍÀÔ´Ï´Ù.

Interface
Description
Methods
1.1
2.0
Message
BinaryMessage, TextMessage, MultipartMessage µîÀÇ ¼­ºêÀÎÅÍÆäÀ̽º°¡ ÆÄ»ýµÇ´Â ±âº» ¸Þ½ÃÁö ÀÎÅÍÆäÀ̽º
getAddress()
getTimestamp()
setAddress()
X
X
BinaryMessage
¹ÙÀ̳ʸ® ¸Þ½ÃÁö¸¦ Ç¥ÇöÇÏ°í ¹ÙÀ̳ʸ® ÆäÀ̷ε带 set/getÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÏ´Â MessageÀÇ ¼­ºêÀÎÅÍÆäÀ̽º
getPayloadData()
setPayloadData()
X
X
TextMessage
ÅØ½ºÆ® ¸Þ½ÃÁö¸¦ Ç¥ÇöÇϰí ÅØ½ºÆ® ÆäÀ̷ε带 set/getÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÏ´Â MessageÀÇ ¼­ºêÀÎÅÍÆäÀ̽º
getPayloadText()
setPayloadText()
X
X
MessageConnection
MessagesÀÇ ÆÑÅ丮¿Í Messages¸¦ send/receiveÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÏ´Â GCF ConnectionÀÇ ¼­ºêÀÎÅÍÆäÀ̽º
newMessage()
receive()
send()
setMessageListener()
numberOfSegments()
X
X
MessageListener
Message ¿ÀºêÁ§Æ®ÀÇ ºñµ¿±â ÅëÁö¸¦ ±¸ÇöÇÏ´Â ¸®½º³Ê ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇ
notifyIncomingMessage()
X
X
MessagePart
MultipartMessage¿¡ Ãß°¡µÉ ¼ö ÀÖ´Â ¸Þ½ÃÁö ºÎºÐÀ» Á¤ÀÇ
getContent()
getContentAsStream()
getContentID()
getContentLocation()
getEncoding()
getLength()
getMIMEType()
X
MultipartMessage
¸ÖƼÆÄÆ® ¸Þ½ÃÁö¸¦ Ç¥ÇöÇÏ°í º¹¼öÀÇ ÆäÀ̷ε带 set/getÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÏ´Â MessageÀÇ ¼­ºêÀÎÅÍÆäÀ̽º
addAddress()
addMessagePart()
getAddress()
getAddresses()
getHeader()
getMessagePart()
getMessageParts()
getStartContentId()
getSubject()
removeAddress()
removeAddresses()
removeMessagePart()
removeMessagePartId()
removeMessagePartLocation()
setAddress()
setHeader()
setStartContentId()
setSubject()
X
SizeExceededException
¸ÖƼÆÄÆ® ¸Þ½ÃÁö ³»¿ëÀÌ °¡¿ëÇÑ ¸Þ¸ð¸® ¶Ç´Â Áö¿øµÇ´Â ¸Þ½ÃÁö ºÎºÐÀÇ Å©±âº¸´Ù Ŭ °æ¿ì¿¡ throwµÇ´Â ¿¹¿Ü
--
X
 

WMA ¹öÀü 1.1°ú 2.0ÀÇ Â÷ÀÌ´Â ÁÖ·Î MMS ¸Þ½Ã¡¿¡ »ç¿ëµÇ´Â ¸ÖƼÆÄÆ® ¸Þ½ÃÁöÀÇ Áö¿ø ¿©ºÎ¿Í °ü·ÃÀÌ ÀÖ½À´Ï´Ù. À̾îÁö´Â ¼½¼Ç¿¡¼­´Â WMAÀÇ ´Ù¾çÇÑ ÄÄÆ÷³ÍÆ®¿¡ °üÇØ ¾Ë¾Æº¸µµ·Ï ÇϰÚÀ¸¸ç, °¢ WMA ¸Þ¼Òµå¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº WMA ½ºÆåÀ» Âü°íÇϽñ⠹ٶø´Ï´Ù.

WMA 2.0 ¸Þ½ÃÁö ŸÀÔ

WMA 2.0Àº ³× °¡ÁöÀÇ ¸Þ½ÃÁö Ç¥Çö ¶Ç´Â À¯ÇüÀ» Á¤ÀÇÇÕ´Ï´Ù. ÀÌ¿Í ´õºÒ¾î ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â µ¥ »ç¿ëµÇ´Â ¸ÖƼÆÄÆ® ¸Þ½ÃÁö¸¦ Áö¿øÇÏ´Â ¸Þ½ÃÁö ºÎºÐÀ» Á¤ÀÇÇÕ´Ï´Ù. ´ÙÀ½ 5°³ ¼½¼Ç¿¡¼­´Â ¸Þ½ÃÁö¸¦ Ç¥ÇöÇÏ´Â ÀÎÅÍÆäÀ̽º¿Í ¸Þ½ÃÁö ºÎºÐÀ» Ç¥ÇöÇϴ Ŭ·¡½º¿¡ °üÇØ ¼³¸íÇÕ´Ï´Ù.

The Message ÀÎÅÍÆäÀ̽º
 

javax.wireless.messaging.Message ÀÎÅÍÆäÀ̽º´Â WMA¸¦ ÀÌ¿ëÇÏ¿© Àü´ÞµÇ´Â ¸ðµç ¸Þ½ÃÁö¸¦ À§ÇÑ ±âº» ŸÀÔÀ̸ç, Message´Â ¼Û½Å/¼ö½Å, »ý¼º/¼Ò¸ê(¼Òºñ)µÇ´Â ³»¿ëÀÔ´Ï´Ù. ÀÌ Message´Â ¹ß½ÅÁö/¼ö½ÅÁö ÁÖ¼Ò¿Í ÆäÀ̷ε带 °¡Áö°í ÀÖÀ¸¹Ç·Î ¾î¶² ¸é¿¡¼­´Â µ¥ÀÌÅͱ׷¥°ú À¯»çÇØ º¸ÀÔ´Ï´Ù.

ÇÑÆí, Â÷ÀÌÁ¡µµ ÀûÁö ¾ÊÀºµ¥, WMA Message¿¡´Â ŸÀÓ½ºÅÆÇÁ°¡ Æ÷ÇԵǸç, ¼­ºêÀÎÅÍÆäÀ̽º¿¡¼­ Á¤ÀǵǴ º¹¼öÀÇ ÆäÀ̷εå ŸÀÔÀÌ Áö¿øµË´Ï´Ù. ´õ¿íÀÌ ¹«¼± ¸Þ½Ã¡Àº Åë»óÀûÀ¸·Î SMS³ª MMS °°Àº store-and-forward ½Ã½ºÅÛ »ó¿¡¼­ ±¸ÇöµÇ±â ¶§¹®¿¡ ¸Þ½ÃÁö Àü´ÞÀÌ ½Å·Ú¼ºÀÌ ÀÖ°í ÃßÀûµµ °¡´ÉÇÕ´Ï´Ù.

ÀÎÅÍÆäÀ̽º´Â ¸Þ½ÃÁöÀÇ ¹ß½ÅÁö/¼ö½ÅÁö ÁÖ¼Ò¸¦ get/setÇϰí ŸÀÓ½ºÅÆÇÁ¸¦ getÇÏ´Â ¸Þ¼Òµå¸¦ ÁöÁ¤ÇÕ´Ï´Ù.

  • String getAddress();
  • void setAddress(String address);
  • Date getTimestamp();

WMA 2.0Àº ±×¸² 2¿¡¼­ º¸´Â °Íó·³ MessageÀÇ ¼­ºêÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÕ´Ï´Ù.

Figure 2: The Message Interface and its Subinterfaces
Figure 2: ±×¸² 2: Message ÀÎÅÍÆäÀ̽º¿Í ÇØ´ç ¼­ºêÀÎÅÍÆäÀ̽º (È®´ë À̹ÌÁö º¸±â)
 

ÀÌ ¶§,

  • BinaryMessage´Â ÀϹÝÀûÀ¸·Î SMS¸¦ ÀÌ¿ëÇÏ´Â ´Ü¹® ¹ÙÀ̳ʸ® ¸Þ½ÃÁö¿ëÀÔ´Ï´Ù.
  • TextMessage´Â ÀϹÝÀûÀ¸·Î SMS¸¦ ÀÌ¿ëÇÏ´Â ´Ü¹® ÅØ½ºÆ® ¸Þ½ÃÁö¿ëÀÔ´Ï´Ù.
  • MultipartMessage´Â ÀϹÝÀûÀ¸·Î MMS¸¦ ÀÌ¿ëÇÏ´Â ¸ÖƼŽºÅ· ¸Þ½ÃÁö¿ëÀÔ´Ï´Ù.
BinaryMessage ÀÎÅÍÆäÀ̽º
 

BinaryMessage ¼­ºêÀÎÅÍÆäÀ̽º´Â ¹ÙÀ̳ʸ® ÆäÀ̷ε带 °¡Áö´Â ¸Þ½ÃÁö(ÀϹÝÀûÀ¸·Î SMS ±â¹ÝÀÇ ´Ü¹® ¸Þ½ÃÁö)¸¦ Ç¥ÇöÇϴµ¥, ¹ÙÀ̳ʸ® ÆäÀ̷εå´Â 8ºñÆ® µ¥ÀÌÅ͸¦ ÀÌ¿ëÇÏ¿© ÀÎÄÚµùµÇ¹Ç·Î ¼¼±×¸ÕÆ® ´ç 140¹ÙÀÌÆ® Æ÷Æ® ¹øÈ£¸¦ »ç¿ëÇÒ °æ¿ì 133¹ÙÀÌÆ®¸¦ Çã¿ëÇÕ´Ï´Ù. ¸Þ½ÃÁö ºÐÇÒ¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº º» ±â»ç ÈĹݺÎÀÇ "ºÐÇÒ°ú ÀçÁ¶¸³(About Segmentation and Reassembly)" ¼½¼ÇÀ» ÂüÁ¶ÇϽʽÿÀ. ÀÌ ÀÎÅÍÆäÀ̽º´Â ¹ÙÀ̳ʸ® ÆäÀ̷ε带 ¹ÙÀÌÆ®ÀÇ ¹è¿­·Î set/getÇÏ´Â ¸Þ¼Òµå¸¦ ¼±¾ðÇÕ´Ï´Ù.

  • byte[] getPayloadData();
  • void setPayloadData(byte[] bytes);

¸Þ½ÃÁöÀÇ ÁÖ¼Ò¸¦ set/getÇϰí ŸÀÓ½ºÅÆÇÁ¸¦ getÇÏ´Â ¸Þ¼Òµå´Â ¸ðµÎ Message·ÎºÎÅÍ »ó¼ÓµË´Ï´Ù.

The TextMessage ÀÎÅÍÆäÀ̽º
 

TextMessage ¼­ºêÀÎÅÍÆäÀ̽º´Â ÅØ½ºÆ® ÆäÀ̷ε带 °¡Áö´Â ¸Þ½ÃÁö(ÀϹÝÀûÀ¸·Î SMS ±â¹ÝÀÇ ´Ü¹® ÅØ½ºÆ® ¸Þ½ÃÁö)¸¦ Ç¥ÇöÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â ÅØ½ºÆ®¸¦ StringÀÇ ÀνºÅϽº·Î set/getÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÕ´Ï´Ù.

  • String getPayloadText();
  • void setPayloadText(String data);

±âº» ±¸ÇöÀº ÅØ½ºÆ® ¸Þ½ÃÁö°¡ ¼Û½Å/¼ö½ÅµÇ±â Àü¿¡ StringÀ» ÀûÀýÇÑ Æ÷¸ËÀ¸·Î ÀÎÄÚµù/µðÄÚµùÇÏ´Â ÀÏÀ» ´ã´çÇϸç, »ç¿ëµÇ´Â ¹®ÀÚ ÀÎÄÚµùÀº ¸Þ½ÃÁöÀÇ Å©±â¿¡ ¿µÇâÀ» ÁÝ´Ï´Ù. ¿¹¸¦ µé¾î, GSM 7ºñÆ®´Â ¼¼±×¸ÕÆ® ´ç 160 ¹®ÀÚ, ¶Ç´Â Æ÷Æ® ¹øÈ£¸¦ »ç¿ëÇÒ °æ¿ì 152 ¹®ÀÚ¸¦ Çã¿ëÇÏ´Â ¹Ý¸é, UCS-2´Â ¼¼±×¸ÕÆ® ´ç 70 ´õºí ¹ÙÀÌÆ® ¹®ÀÚ, ¶Ç´Â Æ÷Æ® ¹øÈ£¸¦ »ç¿ëÇÒ °æ¿ì 66 ¹®ÀÚ¸¦ Çã¿ëÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº "ºÐÇÒ°ú ÀçÁ¶¸³(About Segmentation and Reassembly)" ¼½¼ÇÀ» ÂüÁ¶ÇϽʽÿÀ. BinaryMessageÀÇ °æ¿ì, ¸Þ½ÃÁöÀÇ ÁÖ¼Ò¸¦ set/getÇϰí ŸÀÓ½ºÅÆÇÁ¸¦ getÇÏ´Â ¸Þ¼Òµå´Â Message·ÎºÎÅÍ »ó¼ÓµË´Ï´Ù.

MultipartMessage ÀÎÅÍÆäÀ̽º
 

MultipartMessage ¼­ºêÀÎÅÍÆäÀ̽º´Â º¹¼ö ºÎºÐÀ¸·Î ±¸¼ºµÇ´Â ¸Þ½ÃÁö(ÀϹÝÀûÀ¸·Î MMS ±â¹ÝÀÇ ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö)¸¦ Ç¥ÇöÇÕ´Ï´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â Çϳª ÀÌ»óÀÇ MessageParts ÄÁÅ×À̳ʸ¦ Á¤ÀÇÇÏ°í ¹ß½ÅÀÚ/¼ö½ÅÀÚ ÁÖ¼Ò, ¸Þ½ÃÁöÀÇ Çì´õ, ¡®start message¡¯ ÄÁÅÙÆ® ID, ¸Þ½ÃÁöÀÇ ºÎºÐ µîÀ» °ü¸®ÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÕ´Ï´Ù.

  • boolean addAddress(String type, String address);
  • void addMessagePart(MessagePart messagePart) throws SizeExceededException;
  • String getAddress();
  • String[] getAddresses(String type);
  • String getHeader(String headerField);
  • MessagePart getMessagePart(String contentID);
  • MessagePart[] getMessageParts();
  • String getStartContentId();
  • String getSubject();
  • boolean removeAddress(String type, String address);
  • void removeAddresses();
  • void removeAddresses(String type);
  • boolean removeMessagePart(MessagePart messagePart);
  • boolean removeMessagePartId(String contentID);
  • boolean removeMessagePartLocation(String contentLocation);
  • void setAddress(String address);
  • void setHeader(String headerField, String headerValue);
  • void setStartContentId(String contentID);
  • void setSubject(String subject);

MultipartMessage´Â Message·ÎºÎÅÍ »ó¼Ó¹Þ´Â ¸Þ½ÃÁöÀÇ ÁÖ¼Ò¸¦ set/getÇÏ´Â ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÕ´Ï´Ù.

¸ÖƼÆÄÆ® ¸Þ½ÃÁö´Â ±×¸² 3¿¡¼­ º¸´Â °Íó·³ W3C(World Wide Web Consortium)°¡ RFC2045 ¹× RFC2046¿¡¼­ Á¤ÀÇÇÑ MIME(Multipurpose Internet Mail Extensions) Ç¥ÁØ¿¡ ±âÃÊÇÑ RFC822 ±â¹Ý Çì´õ ¹× º¹¼ö ºÎºÐÀ¸·Î ±¸¼ºµÇ´Â Ç¥ÁØ À̸ÞÀÏÀÇ Æ÷¸ËÀ» µû¸¨´Ï´Ù.

Figure 3: Structure of an MMS Multipart Message
±×¸² 3: MMS ¸ÖƼÆÄÆ® ¸Þ½ÃÁöÀÇ ±¸Á¶ (È®´ë À̹ÌÁö º¸±â)
 

MultipartMessage ÀÎÅÍÆäÀ̽º´Â ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö¿Í Çì´õ¸¦ Ç¥ÇöÇÏ´Â ¹Ý¸é MessagePart Ŭ·¡½º ÀνºÅϽº´Â °¢°¢ÀÇ °³º° MIME ºÎºÐÀ» Ç¥ÇöÇÕ´Ï´Ù.

MessagePart Ŭ·¡½º
 

À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, MessagePart´Â ¸Þ½ÃÁöÀÇ ÇÑ ºÎºÐÀ» Ç¥ÇöÇÕ´Ï´Ù. ÀÌ Å¬·¡½º´Â ´Ù¾çÇÑ »ý¼ºÀÚ(constructor) ¿Ü¿¡µµ ÄÁÅÙÆ®¸¦ °Ë»öÇÏ´Â ¸Þ¼Òµå¿Í ÄÁÅÙÆ®¿¡ °üÇÑ Á¤º¸¸¦ Á¦°øÇÕ´Ï´Ù.

  • MessagePart(byte[] contents, int offset, int length, String mimeType, String contentId, String contentLocation, String encoding) throws SizeExceededException;
  • MessagePart(byte[] contents, String mimeType, String contentId, String contentLocation, String encoding) throws SizeExceededException;
  • MessagePart(java.io.InputStream is, String mimeType, String contentId, String contentLocation, String encoding) throws IOException, SizeExceededException;
  • public byte[] getContent();
  • public InputStream getContentAsStream();
  • public String getContentID();
  • public String getContentLocation();
  • public String getEncoding();
  • public int getLength();
  • public String getMIMEType();

¸Þ½ÃÁö ºÎºÐÀº RFC2046¿¡¼­ Á¤ÀÇµÈ MIME ŸÀÔ, ÄÁÅÙÆ® ID, ÄÁÅÙÆ® ·ÎÄÉÀ̼Ç, ±×¸®°í ÄÁÅÙÆ® ÀÚü·Î ±¸¼ºµÇ¸ç, ¹ÙÀÌÆ® ¹è¿­ ¶Ç´Â java.io.InputStreamÀ¸·ÎºÎÅÍ MessagePart¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.

WMA Ä¿³Ø¼Ç

Wireless Messaging API¿¡¼­ ÀÎDz, ¾Æ¿ôDz ¹× ³×Æ®¿öÅ© ¿¬°áÀº GCF(Generic Connection Framework)¸¦ ±â¹ÝÀ¸·Î Çϰí, WMA Ä¿³Ø¼ÇÀº ´ÙÀ½ ±×¸²¿¡¼­ º¸´Â °Íó·³ GCFÀÇ javax.microedition.io.ConnectionÀÇ ¼­ºêÀÎÅÍÆäÀ̽ºÀÎ MessageConnection ÀÎÅÍÆäÀ̽º¿¡ ±â¹ÝÀ» µÓ´Ï´Ù.

Figure 4: The <code>MessageConnection</code> and Its Relationship to the GCF
±×¸² 4: MessageConnection, ±×¸®°í GCF¿ÍÀÇ °ü°è
 

MessageConnection ÀÎÅÍÆäÀ̽º´Â TextMessages, BinaryMessages, MultipartMessages ÀÛ¼ºÀ» À§ÇÑ ÆÑÅ丮 ¸Þ¼Òµå, ¸Þ½ÃÁö Àü¼Û¿¡ ÇÊ¿äÇÑ ÇÁ·ÎÅäÄÝ ¼¼±×¸ÕÆ®ÀÇ ¼ö¸¦ °è»êÇÏ´Â ¸Þ¼Òµå, ¸Þ½ÃÁö¸¦ ¼ö½Å/¼Û½ÅÇÏ´Â ¸Þ¼Òµå, ÀÌ Ä¿³Ø¼ÇÀ» À§ÇÑ ¸Þ½ÃÁö ¸®½º³Ê¸¦ setÇÏ´Â ¸Þ¼Òµå µîÀ» Á¤ÀÇÇÕ´Ï´Ù.

  • Message newMessage(String type);
  • Message newMessage(String type, String address);
  • int numberOfSegments(Message message);
  • Message receive() throws IOException, InterruptedIOException;
  • void send(Message message) throws IOException, InterruptedIOException;
  • void setMessageListener(MessageListener messageListener) throws IOException;

¾Æ¿ï·¯, ÀÌ ÀÎÅÍÆäÀ̽º´Â String »ó¼ö¸¦ Á¤ÀÇÇϰí, ±× Áß Çϳª¸¦ newMessage() ÆÑÅ丮 ¸Þ¼Òµå¿¡ ÆÐ½ºÇÏ¿© ÀÛ¼ºÇÒ Message ŸÀÔÀ» ½Äº°ÇÕ´Ï´Ù.

  • String TEXT_MESSAGE = "text";
  • String BINARY_MESSAGE = "binary";
  • String MULTIPART_MESSAGE = "multipart";

¸Þ½ÃÁö Ä¿³Ø¼ÇÀ» »ý¼ºÇÒ ¶§´Â Ç×»ó ÀÌ »ó¼ö Áß Çϳª¸¦ »ç¿ëÇÕ´Ï´Ù. WMA ±¸ÇöÀº String.equals()¸¦ ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿­ °ªÀ» ºñ±³Çϰí ÀÌ ¸Þ½ÃÁö ŸÀÔÀÌ ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇϵµ·Ï ¸¸µì´Ï´Ù.

´Ù¸¥ GCF Connection°ú ¸¶Âù°¡Áö·Î MessageConnectionÀ» ¿­°í ´Ý½À´Ï´Ù. Ä¿³Ø¼ÇÀ» »ý¼ºÇÏ·Á¸é Ä¿³Ø¼Ç ÆÑÅ丮ÀÇ javax.microedition.io.Connector.open() ¸Þ¼Òµå¸¦ È£ÃâÇϰí, Ä¿³Ø¼ÇÀ» ´ÝÀ¸·Á¸é ±âº» Ä¿³Ø¼Ç ÀÎÅÍÆäÀ̽º javax.microedition.io.Connection.close()ÀÇ ÇØ´ç ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù. ¶ÇÇÑ, º¹¼öÀÇ MessageConnections°¡ µ¿½Ã¿¡ ¿­¸®µµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

MessageConnectionÀº Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼Ç°ú ¼­¹ö Ä¿³Ø¼ÇÀÇ µÎ °¡Áö ¸ðµå Áß Çϳª·Î »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼ÇÀº ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÒ ¼ö¸¸ ÀÖ°í, ¼­¹ö Ä¿³Ø¼ÇÀº ¼Û¼ö½ÅÀÌ ¸ðµÎ °¡´ÉÇÕ´Ï´Ù. ´Ù¸¥ GCF Ä¿³Ø¼ÇÀÇ °æ¿ì¿¡´Â URLÀ» ÀÌ¿ëÇÏ¿© Ä¿³Ø¼ÇÀ» Ŭ¶óÀÌ¾ðÆ®³ª ¼­¹ö Áß Çϳª·Î ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ °æ¿ì,

scheme://address-part [params]

ÀÌ ¶§,

  • schemeÀº »ç¿ëÇÒ ÇÁ·ÎÅäÄÝÀÔ´Ï´Ù.
  • address-part Ŭ¶óÀÌ¾ðÆ® ¶Ç´Â ¼­¹ö Ä¿³Ø¼ÇÀ» À§ÇÑ ÇÁ·ÎÅäÄÝ Àü¿ë ÁÖ¼ÒÀÔ´Ï´Ù.
  • params´Â ½ºÅ´¿¡ µû¸¥ ;x=y ÇüÅÂÀÇ ¿É¼Ç ¸Å°³º¯¼öÀÔ´Ï´Ù.
WMA 2.0 Áö¿ø ÇÁ·ÎÅäÄÝ ¾î´ðÅÍ ¹× Ç¥ÁØ
WMA ÇÁ·ÎÅäÄÝ ¾î´ðÅÍ¿¡ ´ëÇÑ Áö¿øÀº ´ÙÀ½ÀÇ Ç¥ÁØÀ» µû¸¨´Ï´Ù.
  • GSM(Global System for Mobile Communications) 03.40 Ç¥ÁØ¿¡ Á¤ÀÇµÈ Short Messaging System
  • GSM(Global System for Mobile Communications) 03.41 Ç¥ÁØ¿¡ Á¤ÀÇµÈ Cell Broadcast Service
  • CDMA(Code Division Multiple Access) IS-637 Ç¥ÁØ¿¡ Á¤ÀÇµÈ Short Messaging System
  • WAP-209-MMS-Encapsulation Ç¥ÁØ¿¡ Á¤ÀÇµÈ Multimedia Messaging Services ¹× PDU(Protocol Data Unit) ±¸Á¶
 

MessageConnection »ý¼ºÀ» À§ÇÑ URL schemeÀº ÇϳªÀÇ ÇÁ·ÎÅäÄÝ¿¡ ÇÑÁ¤µÇÁö ¾ÊÀ¸¸ç, ´ë½Å ´Ù¼öÀÇ ¹«¼± ¸Þ½Ã¡ ÇÁ·ÎÅäÄÝÀ» Áö¿øÇϵµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. WMA ½ºÆåÀº ´ÙÀ½°ú °°Àº ¸Þ½Ã¡ ÇÁ·ÎÅäÄÝ ¾î´ðÅ͸¦ Á¤ÀÇÇÕ´Ï´Ù.

  • Short Messaging SystemÀ» À§ÇÑ sms. SMS´Â ¾ç¹æÇâÀÔ´Ï´Ù. ¸Þ½ÃÁö¸¦ »ý¼º, ¼Û½Å, ¼ö½ÅÇÒ ¼ö ÀÖ°í, µû¶ó¼­ Ŭ¶óÀ̾ðÆ®/¼­¹ö Ä¿³Ø¼ÇÀ» ¸ðµÎ Áö¿øÇÕ´Ï´Ù.

  • Multimedia Messaging SystemÀ» À§ÇÑ mms. MMSµµ SMS¿Í ¸¶Âù°¡Áö·Î ¾ç¹æÇâÀ̹ǷΠŬ¶óÀ̾ðÆ®/¼­¹ö Ä¿³Ø¼Ç ¸ðµÎ Áö¿øÀÌ °¡´ÉÇÕ´Ï´Ù.

  • Cell Broadcast Short Message¸¦ À§ÇÑ cbs. CBS ¸Þ½ÃÁö´Â º£À̽º ½ºÅ×À̼ÇÀ» ÅëÇØ ºê·Îµåij½ºÆ®µÇ¸ç ¿ÀÁ÷ ¼ö½Å¸¸ °¡´ÉÇϸç, cbs¸¦ ÅëÇØ ¼Û½ÅÇÏ·Á°í Çϸé IOExceptionÀÌ ¹ß»ýÇÕ´Ï´Ù. CBS ¸Þ½ÃÁö¿¡´Â ŸÀÓ½ºÅÆÇÁ°¡ ¾øÀ¸¹Ç·Î ¸Þ½ÃÁöÀÇ Å¸ÀÓ½ºÅÆÇÁ¸¦ getÇÏ·Á°í Çϸé nullÀÌ ¹ÝȯµË´Ï´Ù.

URLÀÇ address-partÀº Çڵ弼Ʈ¿Í ¾ÖÇø®ÄÉÀ̼ÇÀ» ÁöÁ¤Çϸç, ÀÌ´Â ¶ÇÇÑ Ä¿³Ø¼ÇÀÌ Å¬¶óÀ̾ðÆ®ÀÎÁö ¼­¹öÀÎÁöµµ ÁöÁ¤ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼ÇÀÇ URL¿¡´Â Á¤½Ä ¼ö½ÅÁö ÁÖ¼Ò°¡ Æ÷ÇԵǴ ¹Ý¸é ¼­¹ö Ä¿³Ø¼ÇÀÇ URLÀº ·ÎÄà ÁÖ¼Ò È£½ºÆ®°¡ ¾ø´Â ÇÁ·ÎÅäÄÝ Àü¿ë ·ÎÄà ÁÖ¼Ò(ÀϹÝÀûÀ¸·Î Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID)¸¦ ÁöÁ¤ÇÕ´Ï´Ù. smsÀÇ °æ¿ì address-part´Â Çڵ弼Ʈ¸¦ ½Äº°ÇÏ´Â MSISDNÀ̳ª ¾ÖÇø®ÄÉÀ̼ÇÀ» ½Äº°ÇÏ´Â Æ÷Æ® ¹øÈ£, ¶Ç´Â µÎ °¡Áö ¸ðµÎ·Î ÀÌ·ç¾îÁö°í, mmsÀÇ °æ¿ì ÁÖ¼Ò ºÎºÐÀº À̸ÞÀÏ ÁÖ¼Ò, ÀüÈ­ ¹øÈ£, IPv4, IPv6, ¼ôÄÚµå ÁÖ¼Ò³ª ¾ÖÇø®ÄÉÀÌ¼Ç ID ¶Ç´Â ÀÌ µÎ °¡Áö ¸ðµÎ·Î ±¸¼ºµÉ ¼ö ÀÖ½À´Ï´Ù. ¼ö½Å ¸Þ½ÃÁö¸¸À» Áö¿øÇÏ´Â(¼­¹ö ¸ðµå) cbsÀÇ °æ¿ì address-partÀº ´ÜÁö ¾ÖÇø®ÄÉÀ̼ÇÀ» ½Äº°ÇÏ´Â Æ÷Æ® ¹øÈ£ÀÔ´Ï´Ù.

Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼Ç URLÀÇ ¿¹Á¦:

  • (MessageConnection)Connector.open ("sms://+15121234567:5000");
  • (MessageConnection)Connector.open ("mms://+15121234567: com.j2medeveloper.MyMmsApp");

cbs´Â ¼­¹ö Ä¿³Ø¼Ç¸¸À» Áö¿øÇÏ¹Ç·Î ÇØ´ç ¿¹Á¦°¡ ¾ø½À´Ï´Ù.

¼­¹ö Ä¿³Ø¼Ç URLÀÇ ¿¹Á¦:

  • (MessageConnection)Connector.open("sms://:5000");
  • (MessageConnection)Connector.open("mms://:com.j2medeveloper.MyMmsApp");
  • (MessageConnection)Connector.open("cbs://:6000");
¾ÖÇø®ÄÉÀÌ¼Ç ID¿Í Æ÷Æ® ¹øÈ£¿¡ °üÇÏ¿©
¾ÖÇø®ÄÉÀÌ¼Ç ID´Â Çڵ弼ƮÀÇ ¼ö½Å ¾ÖÇø®ÄÉÀ̼ÇÀ» ½Äº°ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, 2°³ÀÇ URL sms://+5121234567:5000 ¹× mms://+5121234567:com.j2medeveloper.MyMmsApp¿¡¼­ ¼ýÀÚ 5000°ú ¹®ÀÚ¿­ com.j2medeveloper.MyMmsApp´Â ¸ðµÎ ¾ÖÇø®ÄÉÀÌ¼Ç ½Äº°ÀÚÀÔ´Ï´Ù. sms¿Í cbs¿¡¼­´Â TCP ¹× UDP Ä¿³Ø¼Ç¿¡¼­ Æ÷Æ® ¹øÈ£¸¦ »ç¿ëÇÏ´Â ¹æ½Ä°ú À¯»çÇÏ°Ô Æ÷Æ® ¹øÈ£·Î ¾ÖÇø®ÄÉÀ̼ÇÀ» ½Äº°ÇÕ´Ï´Ù. mms¿¡¼­´Â Æ÷Æ® ¹øÈ£°¡ ¾Æ´Ï¶ó ÀϹÝÀûÀ¸·Î com.j2medeveloper.MyMmsApp¿Í °°Àº Á¤½Ä ¸íĪÀÎ ¹®ÀÚ¿­·Î ¾ÖÇø®ÄÉÀ̼ÇÀ» ½Äº°ÇÕ´Ï´Ù. Æ÷Æ® ¹øÈ£´Â ´Ü¹® ¸Þ½ÃÁöÀÇ ½ÇÁ¦ ³»¿ë°ú ºÐ¸®µÈ °ø°£(ÀϹÝÀûÀ¸·Î 16ºñÆ®)À» Â÷ÁöÇÑ´Ù´Â Á¡¿¡ À¯ÀÇÇϽʽÿÀ. ±æÀ̰¡ 32 ¹®ÀÚ¸¦ ÃʰúÇÒ ¼ö ¾ø´Â MMS ¾ÖÇø®ÄÉÀÌ¼Ç ID´Â ¿É¼Ç¿¡ µû¶ó ¸ÖƼÆÄÆ® Content-Type ¸Þ½ÃÁö Çì´õÀÇ ÀϺηΠÆ÷ÇԵ˴ϴÙ. ¾ÖÇø®ÄÉÀÌ¼Ç ID com.j2medeveloper.MyMmsApp¸¦ ÁöÁ¤ÇÏ´Â MMS ¼­¹ö Ä¿³Ø¼ÇÀ» »ý¼ºÇϸé Content-Type ¸Þ½ÃÁö Çì´õÀÇ °ª¿¡ ´ÙÀ½ 2°³ÀÇ ¸Å°³º¯¼ö°¡ Ãß°¡µË´Ï´Ù.

Application-ID=com.j2medeveloper.MyMmsApp;
Reply-To-Application-ID= com.j2medeveloper.MyMmsApp


¼­¹ö Ä¿³Ø¼ÇÀÌ ¿­¸®¸é Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID°¡ ÁöÁ¤µË´Ï´Ù(»ç¿ëµÇ´Â ÇÁ·ÎÅäÄÝ¿¡ µû¸§). ÇØ´ç ¼­¹ö ¾ÖÇø®ÄÉÀ̼ǿ¡ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇϰíÀÚ Çϴ Ŭ¶óÀÌ¾ðÆ®´Â ¹Ýµå½Ã µ¿ÀÏÇÑ Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¸¦ Áö½ÃÇØ¾ß ÇÕ´Ï´Ù. ÁÖ¾îÁø Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¿¡ ¹ÙÀεùµÇ´Â ÃÖÃÊÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ±×°ÍÀ» getÇϰí, ÀÌ¹Ì È®º¸µÈ ·ÎÄà Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¿¡ ´ëÇÑ ¹ÙÀεùÀ» ½ÃµµÇϸé IOExceptionÀÌ throwµÇ´Âµ¥, ¿©·¯ºÐÀÇ ÄÚµå´Â À̸¦ ÀûÀýÈ÷ ó¸®Çؾ߸¸ ÇÕ´Ï´Ù.

°³ÀÎ/µ¿Àû Æ÷Æ® ¹üÀ§ 49152-65635¿¡¼­ »ç¿ëÇÒ Æ÷Æ® ¹øÈ£¸¦ ÀÓÀÇ·Î ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. WAP¿Í °°Àº Ư±Ç ¾ÖÇø®ÄÉÀÌ¼Ç ¶Ç´Â »ç¿ëÀÚ ¾ÖÇø®ÄÉÀ̼ÇÀº ¹üÀ§ 0-49151À» »ç¿ëÇÕ´Ï´Ù. ¾î¶² °ÍµéÀ» ÇÇÇØ¾ß ÇÏ´ÂÁö¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº WMA 2.0 ½ºÆåÀ» ÂüÁ¶ÇϽʽÿÀ. IANA(Internet Assigned Numbers Authority)¿¡ ¹®ÀÇÇÏ¸é °¢ÀÚÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇÑ ÀÚü Æ÷Æ® ¹øÈ£¸¦ È®º¸ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¾ÖÇø®ÄÉÀÌ¼Ç ½Äº°À» À§ÇÑ Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¸¦ ÁöÁ¤ÇÏÁö ¾Ê°í Çڵ弼Ʈ¿¡ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ¸é ´ëºÎºÐÀÇ °æ¿ì ¸Þ½ÃÁö°¡ Çڵ弼ƮÀÇ ±âº»°ª ºä¾î ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î Àü´ÞµÈ´Ù´Â Á¡¿¡ À¯ÀÇÇϽʽÿÀ.
 

URL¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ±â»ç "The Generic Connection Framework"¿Í "A Generic Connection Framework cheat sheet"¸¦ ÂüÁ¶ÇϽʽÿÀ.

Ç¥ 1¿¡¼­ º¸´Â °Íó·³, MessageConnectionÀº Message ¿ÀºêÁ§Æ®¸¦ °¢±â »ý¼º, ¼Û½Å, ¼ö½ÅÇÏ´Â newMessage(), send(), receive() ¸Þ¼Òµå¸¦ Á¦°øÇÕ´Ï´Ù. numberOfSegments()´Â ƯÈ÷ Èï¹Ì¸¦ ²ø¸¸ Çѵ¥, ÀÌ ¸Þ¼Òµå´Â ÁÖ¾îÁø Message¸¦ ¼Û½ÅÇϱâ Àü¿¡ ÇØ´ç ¼¼±×¸ÕÆ® Á¤º¸¸¦ °áÁ¤ÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¡°ºÐÇÒ°ú ÀçÁ¶¸³(About Segmentation and Reassembly)(¿µ¹®)¡±À» ÂüÁ¶ÇϽʽÿÀ. setMessageListener()´Â »õ ¸Þ½ÃÁö µµÂø ½Ã WMA ±¸ÇöÀÌ È£ÃâÇÏ´Â ¸Þ½ÃÁö ¸®½º³Ê¸¦ setÇϴµ¥ »ç¿ëµË´Ï´Ù.

WMA´Â ¸Å¿ì Á÷°üÀûÀÌ°í »ç¿ëÇϱ⠽¬¿î API·Î¼­, ±× Ȱ¿ë ¹æ¹ýÀ» º¸¿©ÁÖ´Â ¸î °¡Áö Äڵ带 »ìÆìº¸±â·Î ÇսôÙ.

Creating a Message Connection

Ŭ¶óÀÌ¾ðÆ® MessageConnectionÀ» »ý¼ºÇÏ·Á¸é Ä¿³Ø¼Ç ÆÑÅ丮 ¸Þ¼Òµå Connector.open()¸¦ È£ÃâÇÏ¿© À¯È¿ÇÑ WMA ¸Þ½Ã¡ ÇÁ·ÎÅäÄÝÀ» ÁöÁ¤ÇÏ°í ¼­¹ö Ä¿³Ø¼ÇÀ» À§ÇÑ ·ÎÄà ÁÖ¼Ò ¶Ç´Â Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼ÇÀ» À§ÇÑ Á¤½Ä ¼ö½ÅÁö ÁÖ¼Ò¸¦ Æ÷ÇÔÇÏ´Â URLÀ» ÆÐ½ºÇÕ´Ï´Ù.


 
...
MessageConnection mc = null;
String connUrl = "mms://:com.j2medeveloper.MyMmsApp";
    // My MMS server app
...

try {
    mc = (MessageConnection)Connector.open(connUrl);
} catch (IOException ioe) {
    // Port number or application identifier is already reserved
} catch (SecurityException se) {
    // Permission to open the MessageConnection was not granted
}
...
 

¾ÖÇø®ÄÉÀ̼ÇÀÇ Æ÷Æ® ¹øÈ£¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ½Äº°ÀÚ¸¦ JAD(Java Application Descriptor)ÆÄÀÏ¿¡¼­ Á¤ÀÇÇϰí À̸¦ ·±Å¸ÀÓ ½Ã¿¡(ÀϹÝÀûÀ¸·Î ¾ÖÇø®ÄÉÀÌ¼Ç ½Ãµ¿ Áß¿¡) °Ë»öÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÔ´Ï´Ù.

¿¹¸¦ µé¾î, ´ÙÀ½ ¼Ó¼ºÀ» JAD ÆÄÀÏ¿¡ ¹èÄ¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

...
SmsApplicationPort: 50000
CbsMessageID: 50001
MmsApplicationID: com.j2medeveloper.MyMmsApp 
...
 

ÀÌµé ¼Ó¼º °¢°¢À» °Ë»öÇÏ·Á¸é MIDlet.getAppProperty(String attributeName)À» È£ÃâÇϰí getÇÒ ¼Ó¼ºÀÇ À̸§À» ÆÐ½ºÇÕ´Ï´Ù. ÀÌÇØ¸¦ µ½±â À§ÇØ, JAD·ÎºÎÅÍ WMA Æ÷Æ® ¹øÈ£¿Í ¾ÖÇø®ÄÉÀÌ¼Ç ID¸¦ °Ë»öÇÏ´Â helper ¸Þ¼ÒµåÀÎ loadWmaAttributes()¸¦ Á¤ÀÇÇØº¾´Ï´Ù.

...
// Define the SMS and MMS Port and Application Identifiers
String smsPort;
String cbsMsgId;
String mmsAppId;
...

/**
 * Loads the application WMA attributes
 */
private void loadWmaAttributes() {
    mmsAppId = getAppProperty("MmsApplicationID");
    smsAppId = getAppProperty("SmsApplicationPort");
    cbsAppId = getAppProperty("CbsMessageID");
}
...
 

Ä¿³Ø¼Ç »ý¼º ¹æ¹ýÀ» »ìÆìº¸±â À§ÇØ MessageConnectionÀ» »ý¼º/¹ÝȯÇÏ´Â helper ¸Þ¼Òµå newMessageConnection()¸¦ Á¤ÀÇÇØ º¾´Ï´Ù.

/**
 * Create a new MessageConnection
 *
 * @param connUrl is the server or client URL for the connection
 * @param messageListener is the message listener for this
 * connection
 * @return a MessageConnection object
 * @throws a ConnectionNotFoundException if
 * the Connection target is not found, 
 * or the protocol not supported
 * @throws an IOException if
 * the Port number or application identifier is already reserved, 
 * or the connection has been closed,
 * or if an attempt is made to register a listener on a client 
 * connection
 * @throws an IllegalArgumentException if
 * a Message type parameter is invalid
 * or attempting to create a *Stream
 * @throws SecurityException if
 * permission to open the MessageConnection was not granted, 
 * or, when setting the message listener, it was determined
 * that the application does not have permission to receive
 * on the given port number
 */
final public MessageConnection newMessageConnection(
        String connUrl,
        MessageListener messageListener)
            throws ConnectionNotFoundException, IOException,
            IllegalArgumentException, SecurityException {
    MessageConnection mc = null;
    mc = (MessageConnection)Connector.open(connUrl);
    mc.setMessageListener(messageListener);
    return(mc);
}
 

Ä¿³Ø¼Ç ÆÑÅ丮´Â ÀûÀýÈ÷ ij½ºÆ®µÇ¾î¾ß ÇÏ´Â Connection ¼­ºêŸÀÔÀ» ¹ÝȯÇÕ´Ï´Ù. ¿ì¸®ÀÇ ¿¹Á¦¿¡¼­´Â Connector.open()°¡ ¹ÝȯÇÑ °ªÀ» MessageConnection¿¡ ij½ºÆ®ÇÑ ´ÙÀ½ È£ÃâÀÚ¿¡°Ô ¹ÝȯÇÕ´Ï´Ù. helper ¸Þ¼Òµå´Â ¶ÇÇÑ Ä¿³Ø¼ÇÀ» À§ÇÑ ¸Þ½ÃÁö ¸®½º³Ê(ÁöÁ¤µÈ °æ¿ì)¸¦ setÇϴµ¥, Ä¿³Ø¼ÇÀÇ ¸Þ½ÃÁö ¸®½º³Ê¸¦ null·Î setÇϸé ÇöÀçÀÇ ¸ðµç ¸Þ½ÃÁö ¸®½º³Ê°¡ µî·Ï ÇØÁ¦µÇ¾î ¾î¶² ÅëÁöµµ ¼ö½ÅÇÏÁö ¾Ê°Ô µÈ´Ù´Â Á¡¿¡ À¯ÀÇÇϽʽÿÀ. ¸Þ½ÃÁö ¸®½º³Ê¿¡ °üÇØ¼­´Â Àá½Ã µÚ¿¡ ´Ù½Ã ¼³¸íÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

GCF´Â StreamConnections¸¦ À§ÇÑ InputStream ¹× OutputStreamÀ» »ý¼ºÇÏ´Â Æí¸®ÇÑ ¹æ¹ýÀ» Á¦°øÇÏÁö¸¸, MessageConnectionÀº ½ºÆ®¸² ±â¹Ý ¿ÀÆÛ·¹À̼ÇÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. *StreamÀ» »ý¼ºÇÏ·Á Çϸé IllegalArgumentExceptionÀÌ throwµË´Ï´Ù.

¸Þ½ÃÁö Ä¿³Ø¼Ç Á¾·áÇϱâ

Ä¿³Ø¼ÇÀ» Á¾·áÇÏ·Á¸é, ´ÙÀ½ ÄÚµå ´ÜÆí¿¡¼­ º¸´Â °Íó·³ Ä¿³Ø¼ÇÀÇ close() ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù.

/**
 * Closes the specified message connection
 *
 * @param connection is the connection to close
 */
static final public void closeConnection(MessageConnection connection) {
    try {
        if (connection != null) {
            connection.setMessageListener(null);
                // deregister the msg listener
            connection.close();
        }
    } catch (IOException ioe) {
        // Handle or ignore the exception...
    }
}
 

ÀÌ ¸Þ¼Òµå´Â ¸ÕÀú ¸ðµç ¸Þ½ÃÁö ¸®½º³Ê¸¦ µî·Ï ÇØÁ¦ÇÑ ´ÙÀ½ Ä¿³Ø¼ÇÀ» ´Ý½À´Ï´Ù. Ä¿³Ø¼ÇÀ» ´ÝÀ¸·Á¸é »ó±â ¸Þ¼Òµå¸¦ È£ÃâÇϰí, »èÁ¦µÇ´Â µ¿¾È destroyApp()¿¡¼­ ¸Þ½ÃÁö ¸®½º³Ê¸¦ unsetÇÏ´Â °ÍÀ» ÀØÁö ¸¶½Ê½Ã¿À.

¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ

MessageConnectionÀº Message¸¦ ÀÛ¼º/¼Û½ÅÇÏ´Â ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù´Â Á¡À» »ó±âÇϽʽÿÀ. ¸Þ½ÃÁö¸¦ ÀÛ¼ºÇÏ·Á¸é ¸Þ½ÃÁö ÆÑÅ丮 ¸Þ¼Òµå newMessage()¸¦ È£ÃâÇϰí, ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ·Á¸é send() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÕ´Ï´Ù. newMessage()´Â Ä¿³Ø¼ÇÀÌ Á¾·áµÈ ÈÄ¿¡µµ ¸Þ½ÃÁö¸¦ ¹ÝȯÇÑ´Ù´Â Á¡À» ÀØÁö ¸¶½Ã±â ¹Ù¶ø´Ï´Ù.

¾Õ¿¡¼­ ¹è¿î °Íó·³, Ä¿³Ø¼Ç URL¿¡¼­ ¼±ÅÃÀ» ÁöÁ¤ÇÏ¿© Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼ÇÀ̳ª ¼­¹ö Ä¿³Ø¼Ç Áß Çϳª¸¦ »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼Ç¿¡¼­ ÀÛ¼ºµÈ ¸Þ½ÃÁö´Â Ŭ¶óÀÌ¾ðÆ® Ä¿³Ø¼ÇÀÌ »ý¼ºµÉ ¶§ ÆÐ½ºµÈ Ä¿³Ø¼Ç URL·ÎºÎÅÍ °¡Á®¿Â ¼ö½ÅÁö ÁÖ¼Ò°¡ ÀÌ¹Ì ¼³Á¤µÇ¾î Àִµ¥, ÀÌ¿Í ´Þ¸® ¼­¹ö Ä¿³Ø¼ÇÀÇ ¼ö½ÅÁö ÁÖ¼Ò´Â ¾ÆÁ÷ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î, ¸Þ½ÃÁö ¼Û½Å Àü¿¡ À̸¦ ¸í½ÃÀûÀ¸·Î ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù.

Message¸¦ ¼Û½ÅÇÏ´Â helper ¸Þ¼ÒµåsendMessage()¸¦ Á¤ÀÇÇØ º¾½Ã´Ù. ÀÌ ¸Þ¼Òµå´Â »ç¿ëÇÒ MessageConnection, ¼Û½ÅÇÒ ½ÇÁ¦ MessageBinaryMessage, MultipartMessage, TextMessage, ±×¸®°í ¿É¼ÇÀÎ ¼ö½ÅÁö URL µîÀ» ¸Å°³º¯¼ö·Î ÃëÇÕ´Ï´Ù.

ºñ(Þª) null URLÀº ¼­¹ö Ä¿³Ø¼ÇÀÇ °æ¿ì¿¡¼­Ã³·³ È£ÃâÀÚ°¡ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇϱâ Àü¿¡ ¼ö½ÅÁö ÁÖ¼Ò¸¦ ¼³Á¤Çϱ⸦ ¿øÇÑ´Ù´Â °ÍÀ» ÀǹÌÇϸç, ¸Þ¼Òµå´Â ¶ÇÇÑ numberOfSegments() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ¸¦ Á¡°ËÇÕ´Ï´Ù.

¿ì¸®ÀÇ ¿¹Á¦´Â ¸ÞÀÎ µð½ºÇ÷¹ÀÌ ¾²·¹µå °°Àº ½Ãf½ºÅÛ ¾²·¹µå¿ÍÀÇ °æÀïÀ» ÇÇÇϱâ À§ÇØ ÀÚü ½ÇÇà ¾²·¹µå(thread of execution) »ó¿¡ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ´Â ¸ð¹ü »ç·Ê¸¦ µû¸£°í ÀÖ½À´Ï´Ù. alertUser() helper ¸Þ¼Òµå´Â Ç¥½ÃµÇÁö ¾ÊÀ¸¸ç, ¿©±â¼­´Â ¸Þ½ÃÁö ¼Û½ÅÀÌ ºÒ°¡´ÉÇÑ °æ¿ì »ç¿ëÀÚ¿¡°Ô °æ°í¸¦ Àü´ÞÇϱâ À§ÇØ È£ÃâµË´Ï´Ù. ¸Þ½ÃÁö ¼Û½Å µµÁß¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ´Ù¾çÇÑ ¿¹¿Üµé¿¡ À¯ÀÇÇϽʽÿÀ.

/**
 *  Sends a Message on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg the message to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendMessage(
        final MessageConnection mc,
        final Message msg,
        final String url) {
    Thread th = new Thread() {	
        public void run() {
            try {
                if (url!= null) msg.setAddress(url);
                int segcount = mc.numberOfSegments(msg);
                if (segcount == 0) {
                    alertUser(UiConstants.TXT_SEGCOUNT);
                } else {
                    mc.send(msg);
                }
            } catch(Exception e) {
                // Handle the Exception:

                // IOException if the message could not be sent
                // because there was a network failure or
                // if the connection was closed

                // IllegalArgumentException if the message was
                // incomplete or contained invalid information
                // This exception is also thrown if the payload
                // of the message exceeds the maximum length
                // for the given messaging protocol

                // InterruptedIOException if a timeout occurs
                // while trying to send the message or this
                // Connection object was closed during this
                // send operation

                // NullPointerException if the parameter is null

                // SecurityException if the application does not
                // have permission to send the message

            }
        }
    };
    th.start();
}
 
ÅØ½ºÆ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ

¹ü¿ë(generic) sendMessage() helper ¸Þ¼Òµå¿¡ ´ëÇÑ ¼³¸íÀ» ¸¶ÃÆÀ¸´Ï ÀÌÁ¦´Â TextMessage¸¦ ¼Û½ÅÇÏ´Â helper ¸Þ¼Òµå¸¦ Á¤ÀÇÇØ º¸±â·Î ÇÕ´Ï´Ù.

/**
 *  Sends a TextMessage on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg the TextMessage to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendTextMessage(
        MessageConnection mc,
        TextMessage msg,
        String url) {
    sendMessage(mc, msg, url);
}
 

ÀÌ ¸Þ¼Òµå´Â TextMessage°¡ ÀÌ¹Ì ÀÛ¼ºµÈ °ÍÀ¸·Î °£ÁÖÇÕ´Ï´Ù. ÀÌÁ¦, Åë»óÀûÀÎ StringÀ» ÀÎDzÀ¸·Î ÃëÇÏ°í ¿ì¸®¸¦ ´ë½ÅÇØ¼­ TextMessage¸¦ ÀÛ¼º/¼Û½ÅÇÏ´Â Á»´õ À¯¿ëÇÑ ¹öÀüÀÇ sendTextMessage()¸¦ Á¤ÀÇÇØ º¸±â·Î ÇÕ´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â ¼Û½Å Àü¿¡ setPayloadText() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ³ª°¡´Â TextMessage¸¦ ÆÄǽ·¹ÀÌÆ®ÇÕ´Ï´Ù.

/**
 *  Sends a TextMessage on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg the message to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendTextMessage(
        MessageConnection mc,
        String msg,
        String url) {
    TextMessage tmsg = null;
    tmsg = (TextMessage)
        mc.newMessage(MessageConnection.TEXT_MESSAGE);
    tmsg.setPayloadText(msg);
    sendTextMessage(mc, tmsg, url);
}
 

¹ÙÀ̳ʸ® ¹× ¸ÖƼÆÄÆ® ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ´Â °æ¿ì¿¡µµ µ¿ÀÏÇÑ ÆÐÅÏÀ» µû¸¨´Ï´Ù.

¹ÙÀ̳ʸ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ

ÀÌÁ¦ BinaryMessage¸¦ ¼Û½ÅÇÏ´Â ¶Ç ´Ù¸¥ helper ¸Þ¼Òµå¸¦ Á¤ÀÇÇØ º¸µµ·Ï ÇϰڽÀ´Ï´Ù.

/**
 *  Sends a BinaryMessage on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg the Binary Message to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendBinaryMessage(
        MessageConnection mc,
        BinaryMessage msg,
        String url) {
    sendMessage(mc, msg, url);
}
 

ÀÌ ¸Þ¼Òµå´Â BinaryMessage°¡ ÀÌ¹Ì ÀÛ¼ºµÈ °ÍÀ¸·Î °£ÁÖÇÕ´Ï´Ù. ÀÌÁ¦, ¹ÙÀÌÆ® ¹è¿­À» ÀÎDzÀ¸·Î ÃëÇÏ°í ¿ì¸®¸¦ ´ë½ÅÇØ¼­ BinaryMessage¸¦ ÀÛ¼º/¼Û½ÅÇÏ´Â Á»´õ À¯¿ëÇÑ ¹öÀüÀÇ sendBinaryMessage()¸¦ Á¤ÀÇÇØ º¸±â·Î ÇսôÙ. ÀÌ ¸Þ¼Òµå´Â ¼Û½Å Àü¿¡ setPayloadData() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ³ª°¡´Â BinaryMessage¸¦ ÆÄǽ·¹ÀÌÆ®ÇÕ´Ï´Ù.

/**
 *  Sends a BinaryMessage on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg the byte[] message to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendBinaryMessage(
        MessageConnection mc,
        byte[] msg,
        String url) {
    BinaryMessage bmsg;
    bmsg = (BinaryMessage)
        mc.newMessage(MessageConnection.BINARY_MESSAGE);
    bmsg.setPayloadData(msg);
    sendMessage(mc, bmsg, url);
}
 
¸ÖƼÆÄÆ® ¸Þ½ÃÁö ÀÛ¼º/¼Û½ÅÇϱâ

MultipartMessage¸¦ ¼Û½ÅÇÏ´Â helper ¸Þ¼Òµå¸¦ Çϳª ´õ Á¤ÀÇÇØ º¸±â·Î ÇսôÙ.

/**
 *  Sends a multi-part message on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msg is the multiplart message to send
 *  @param url the destination address, typically used in server mode
 */
final public void sendMultipartMessage(
        MessageConnection mc,
        MultipartMessage msg,
        String subject,
        String url) {
    sendMessage(mc, msg, url);
}
 

ÀÌ ¸Þ¼Òµå´Â MultipartMessage°¡ ÀÌ¹Ì ÀÛ¼ºµÈ °ÍÀ¸·Î °£ÁÖÇÕ´Ï´Ù. ÅØ½ºÆ® ¹× ¹ÙÀ̳ʸ® ¸Þ½ÃÁöÀÇ °æ¿ì¿Í ¸¶Âù°¡Áö·Î, MessagePartsÀÇ ¹è¿­À» ÀÎDzÀ¸·Î ÃëÇÏ°í ¿ì¸®¸¦ ´ë½ÅÇØ¼­ MultipartMessage¸¦ ÀÛ¼º/¼Û½ÅÇÏ´Â Á»´õ À¯¿ëÇÑ ¹öÀüÀÇ sendMultipartMessage()¸¦ Á¤ÀÇÇÒ °ÍÀÔ´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â ¼Û½ÅÇϱâ Àü¿¡ °¢°¢ÀÇ °³º° MessagePart¸¦ Ãß°¡ÇÏ¿© ³ª°¡´Â MultipartMessage¸¦ ÆÄǽ·¹ÀÌÆ®ÇÕ´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â MessageConnection, MessagePartsÀÇ ¹è¿­, start-content ID, TO/CC/BCC ½Äº°ÀÚ ¸®½ºÆ®, ¸Þ½ÃÁö Á¦¸ñ, ¸Þ½ÃÁöÀÇ ¿ì¼±¼øÀ§, ¼ö½ÅÁö URL µîÀÇ ¿©·¯ °¡Áö ÀÎÀÚ¸¦ ÃëÇÕ´Ï´Ù.

/**
 *  Sends a multi-part message on the specified connection
 *
 *  @param mc the MessageConnection
 *  @param msgParts the array of message parts to send
 *  @param startContentID is the ID of the start multimedia
 *  content part (SMIL) 
 *  @param to is the message's TO list
 *  @param cc is the message's CC list
 *  @param bcc is the message's BCC list
 *  @param subject is the message's subject
 *  @param priority is the message's priority
 *  @param url is the destination URL, typically used in server mode
 */
final public void sendMultipartMessage(
        MessageConnection mc,
        MessagePart[] msgParts,
        String startContentID,
        String[] to,
        String[] cc,
        String[] bcc,
        String subject,
        String priority,
        String url) {
    try {
        int i=0;
        MultipartMessage multipartMessage;
        multipartMessage = (MultipartMessage)
            mc.newMessage(MessageConnection.MULTIPART_MESSAGE);
        if (to != null) {
            for (i=0; i<to.length; i++) {
                multipartMessage.addAddress("to", to[i]);
            }
        }
        if (cc != null) {
            for (i=0; i<cc.length; i++) {
                multipartMessage.addAddress("cc", cc[i]);
            }
        }
        if (bcc != null) {
            for (i=0; i<bcc.length; i++) {
                multipartMessage.addAddress("bcc", bcc[i]);
            }
        }
        multipartMessage.setSubject(subject);
        if ((priority.equals("high")) ||
            (priority.equals("normal")) ||
            (priority.equals("low"))) {
            multipartMessage.setHeader("X-Mms-Priority", priority);
        }
        for (i=0; i<msgParts.length; i++) {
            multipartMessage.addMessagePart(msgParts[i]);
        }
        multipartMessage.setStartContentId(startContentID);
        sendMessage(mc, multipartMessage, url);
    } catch(Exception e) {
        //  Handle the exception...
    }
}
 

ÇÁ·¹Á¨Å×ÀÌ¼Ç Á¤º¸°¡ ´ã±ä ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁöÀÇ °æ¿ì (W3C(World Wide Web Consortium)ÀÌ Á¤ÀÇÇÑ SMIL(Synchronized Media Integration Language)·Î ÀÛ¼ºµÈ °Í°ú °°Àº), ¸ÖƼÆÄÆ® ¸Þ½ÃÁöÀÇ start-content ID´Â Ç×»ó ÇÁ·¹Á¨Å×ÀÌ¼Ç Á¤º¸°¡ Æ÷ÇÔµÈ ¸Þ½ÃÁö ºÎºÐÀ» °¡¸®Å°µµ·Ï ¼³Á¤µÇ¾î¾ß Çϰí, À̸¦ À§Çؼ­´Â setStartContentId() ¸Þ¼Òµå¸¦ È£ÃâÇØ¾ß ÇÕ´Ï´Ù. ¶ÇÇÑ, start-content ID¸¦ null·Î ¼³Á¤ÇÒ ¼öµµ Àִµ¥, nullÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â ¹Ýµå½Ã À¯È¿ÇÑ ¸Þ½ÃÁö ºÎºÐÀÌ ÂüÁ¶µÇ¾î¾ß Çϸç, ±×·¸Áö ¾ÊÀ¸¸é IllegalArgumentExceptionÀÌ throwµË´Ï´Ù. ÀÌ È£ÃâÀÇ °á°ú´Â MMS ÄÁÅÙÆ® ŸÀÔÀÌ application/vnd.wap.multipart.related°¡ µÇ°í ¾Æ·¡¿¡¼­ º¸´Â °Íó·³ start ¸Å°³º¯¼ö°¡ À̾îÁý´Ï´Ù. À̷νá, ÀÌ ¸Þ½ÃÁö ŸÀÔÀÇ ¼ö½ÅÀÚ´Â ÇÁ·¹Á¨Å×ÀÌ¼Ç Á¤º¸¸¦ °Ë»öÇÏ°í ¸Þ½ÃÁö¸¦ ÀûÀýÈ÷ »ç¿ëÀÚ¿¡°Ô Á¦½ÃÇÏ´Â ¹æ¹ýÀ» ¾Ë°Ô µÉ °ÍÀÔ´Ï´Ù.

[THE FOLLOWING ARE THE MMS HEADERS]

X-Mms-Message-Type: m-send-req
X-Mms-Transaction-ID: 123456
X-Mms-Version 1.0
X-Mms-Message-Class: Personal
X-Mms-Expiry: 36000
X-Mms-Priority: Normal
From: +15121234567
To:   +15121234544
Date: Fri, 17 May 2005 21:30:30 -0600
Subject: A multimedia message sample
Content-Type:
application/vnd.wap.multipart.related;start=<start>;
type=application/smil;Application-ID=com.j2medeveloper.MyMmsApp;
Reply-To-Application-ID = com.j2medeveloper.MyMmsApp
nEntries: 2

[THE FOLLOWING IS THE MMS BODY THAT CONSIST OF MESSAGE PARTS]
[EACH MESSAGE PART CONSISTS OF TYPE, CONTENT ID, AND CONTENT]

Content-Type: image/png; name="image1.png"
content-id: <001>
[...IMAGE DATA...]

Content-Type: application/smil; name="first.sml"
content-id: <start>
<smil>
<body>
  <seq repeatCount="indefinite">
    <img src="image1.png" dur="3s" />
  </seq>
</body>
</smil>
 

´ÙÀ½À¸·Î MessageParts¸¦ »ìÆìº¸±â·Î ÇսôÙ.

¸Þ½ÃÁö ºÎºÐ ÀÛ¼ºÇϱâ

ÀÌ¹Ì »ìÆìº» °Íó·³ MessageParts´Â MultipartMessagesÀÇ Áß½ÉÀ̶ó ÇÒ ¼ö ÀÖÀ¸¸ç, ±× °¢°¢Àº MIME ŸÀÔ, °íÀ¯ ÄÁÅÙÆ® ID, ±×¸®°í ÄÁÅÙÆ® ÀÚü·Î ÀÌ·ç¾îÁý´Ï´Ù.

¹ÙÀÌÆ® ¹è¿­À̳ª java.io.InputStream·ÎºÎÅÍ MessagePart¸¦ ±¸¼ºÇÒ ¼ö ÀÖÀ¸¸ç, ´ÙÀ½ ¼¼ °¡Áö »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

  • MessagePart(byte[] contents, int offset, int length, String mimeType, String contentId, String contentLocation, String encoding) throws SizeExceededException;
  • MessagePart(byte[] contents, String mimeType, String contentId, String contentLocation, String encoding) throws SizeExceededException;
  • MessagePart(java.io.InputStream contents, String mimeType, String contentId, String contentLocation, String encoding) throws IOException, SizeExceededException;

ÀÌ ¶§,

  • contents½ÇÁ¦ ¸Þ½ÃÁö ÄÁÅÙÆ®¸¦ °¡¸®Åµ´Ï´Ù.
  • mimeTypeÀº RFC2046¿¡ Á¤ÀÇµÈ MIME ŸÀÔÀÔ´Ï´Ù.
  • contentId´Â RFC2045¿¡ Á¤ÀǵÈ, ¸Þ½ÃÁö ºÎºÐÀ» °íÀ¯ÇÏ°Ô ½Äº°ÇÏ´Â Çʼö IDÀÔ´Ï´Ù.
  • contentLocationÀº ÄÁÅÙÆ®°¡ ³ªÅ¸³»´Â ÷ºÎ ¸Þ½ÃÁö¿¡ ´ëÇÑ ÆÄÀϸíÀ» ÁöÁ¤ÇÕ´Ï´Ù. null °ªÀº ÀÌ ¸Þ½ÃÁö ºÎºÐ¿¡ ´ëÇØ ¾î¶² ÄÁÅÙÆ® À§Ä¡ °ªµµ ¼³Á¤µÇÁö ¾Ê¾ÒÀ½À» ÀǹÌÇÕ´Ï´Ù.
  • encoding identifies the content's encoding scheme. A null value means that no encoding is specified for this message part.

óÀ½ µÎ »ý¼ºÀÚ´Â ¹ÙÀÌÆ® ¹è¿­·ÎºÎÅÍ ¸Þ½ÃÁö ÆÄÆ®¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁÖ°í, ¸¶Áö¸· »ý¼ºÀÚ´Â InputStreamÀ¸·ÎºÎÅÍ ¸Þ½ÃÁö ÆÄÆ®¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù. ÀϹÝÀûÀÎ °æÇè¿¡ ÀÇÇϸé ÄÁÅÙÆ® Å©±â°¡ 10KB¿¡ °¡±î¿ï °æ¿ì¿¡´Â byte[] ´ë½Å InputStreamÀ¸·ÎºÎÅÍ ¸Þ½ÃÁö ºÎºÐÀ» ±¸¼ºÇØ¾ß ÇÕ´Ï´Ù.

´ÙÀ½ÀÇ ÄÚµå ´ÜÆíÀº text/plain°ú image/pngÀÇ µÎ °¡Áö ¸Þ½ÃÁö ºÎºÐÀ» ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.

public final static String MIMETYPE_TEXT_PLAIN = "text/plain";
public final static String MIMETYPE_IMAGE_PNG  = "image/png";
...

MessagePart textMessagePart, imageMessagePart;

try {
    // Create a text/plain part
    String textContent = "Hello world";
    String textContentId = "text_hello";
    String textContentLocation = "/helloworld.txt";
    textMessagePart = new MessagePart(
            textContent.getBytes(), 0,
            textContent.length(),
            MIMETYPE_TEXT_PLAIN,
            textContentId,
            textContentLocation,
            null);

    // Create an image/png part
    InputStream imageContent;
    String imageContentId = "img_hello";
    String imageContentLocation = "/helloworld.png";
    imageContent = getClass().getResourceAsStream
            (imageContentLocation);
    imageMessagePart = new MessagePart(
            imageContent,
            MIMETYPE_IMAGE_PNG,
            imageContentId,
            imageContentLocation,
            null);

} catch (SizeExceededException see) {
    // Handle exception
} catch (IOException ioe) {
    // Handle exception
}
 

»ç¿ëÀÚÀÇ ÄÚµå´Â ¹Ýµå½Ã ´ÙÀ½ÀÇ ¿¹¿Ü¸¦ ó¸®ÇØ¾ß ÇÕ´Ï´Ù.

  • IOException : InputStreamÀ» Àд µ¿¾ÈEOFException ÀÌ¿ÜÀÇ ¿¹¿Ü°¡ ¹ß»ýÇÒ °æ¿ì.
  • IllegalArgumentException : ÁöÁ¤µÈ MIME ŸÀÔÀÌ nullÀÎ °æ¿ì.
  • SizeExceededException : ÄÁÅÙÆ® Å©±â°¡ °¡¿ëÇÑ ¸Þ¸ð¸®º¸´Ù Å©°Å³ª Å©±â°¡ ÇØ´ç ¸Þ½ÃÁö ºÎºÐ¿¡ ´ëÇØ Áö¿øµÇÁö ¾Ê´Â °æ¿ì.

ÀÏ¹Ý °³º° ¸Þ½ÃÁö ºÎºÐÀÌ ÀÛ¼ºµÇ¸é, ¿ì¸®¸¦ ´ë½ÅÇØ¼­ ÀÚµ¿À¸·Î MultipartMessage¸¦ ÀÛ¼º/¼Û½ÅÇÏ´Â, Áï ¾Õ¼­ »ìÆìº» sendMultipartMessage() helper ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ¼Û½ÅÇÒ Áغñ°¡ µÈ °ÍÀÔ´Ï´Ù.

...
String connUrl = ...;
MessageConnection mc;
MessagePart textMessagePart, imageMessagePart;
MessagePart[] msgParts;
...

mc = newMessageConnection(connUrl, null);
...

// Create a message parts array
textMessagePart = new MessagePart(...);
imageMessagePart = new MessagePart(...);
msgParts = new MessagePart[2];
msgParts[0] = textMessagePart;
msgParts[1] = imageMessagePart;

// Send the multiple parts
sendMultipartMessage(mc, msgParts, connUrl);
...
 
µé¾î¿À´Â ¸Þ½ÃÁö ´ë±âÇϱâ

¼­¹ö ¸ðµåÀÇ MessageConnection¸¸ ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÒ ¼ö ÀÖ´Ù´Â Á¡À» »ó±âÇϽñ⠹ٶø´Ï´Ù. ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ´Â ¹æ¹ýÀ¸·Î´Â ´ÙÀ½ÀÇ µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù.

  • µ¿±â ¹æ½Ä(Synchronously): µé¾î¿À´Â ¸Þ½ÃÁö¿¡ ´ëÇØ ¾²·¹µå¸¦ ´ë±â½Ãŵ´Ï´Ù.
  • ºñµ¿±â ¹æ½Ä(Asynchronously): ƯÁ¤ ¾ÖÇø®ÄÉÀ̼ǿ¡ Áö½ÃµÈ »õ ¸Þ½ÃÁö°¡ µµÂøÇßÀ» ¶§ ½Ã½ºÅÛÀ¸·Î ÇÏ¿©±Ý ÇØ´ç ¾ÖÇø®ÄÉÀ̼ǿ¡ ÅëÁöÇÏ°Ô ÇÕ´Ï´Ù.

¾î¶² ¹æ¹ýÀ» ¼±ÅÃÇÏ´À³Ä´Â ¼øÀüÈ÷ °³ÀÎÀû ÃëÇâÀÇ ¹®Á¦ÀÔ´Ï´Ù. ÇÊÀÚ´Â °³ÀÎÀûÀ¸·Î, ó¸®ÇÒ ¸Þ½ÃÁö°¡ ¾ø´Âµ¥µµ ¾²·¹µå°¡ ½ÇÇàµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ ºñµ¿±â ¹æ½ÄÀ» ¼±È£ÇÏ´Â ÆíÀÔ´Ï´Ù. ÀÌ ¹æ½ÄÀº µé¾î¿À´Â °¢ ¸Þ½ÃÁö¿¡ ´ëÇØ »õ ¾²·¹µå¸¦ »ý¼º/µð½ºÆÐÄ¡ ÇØ¾ß Çϱ⠶§¹®¿¡ ¸®¼Ò½º ºñ¿ëÀÌ ¾à°£ ´õ µé ¼ö´Â ÀÖ½À´Ï´Ù. ±×·¯³ª WMA´Â ±×´ÙÁö ºó¹øÇÏÁö ¾ÊÀº ¸Þ½ÃÁö¿¡ ÀÌ¿ëµÇ´Â °ÍÀÌ º¸ÅëÀ̹ǷΠ¸Þ½ÃÁö ´ç ÇϳªÀÇ ¾²·¹µå¸¦ µð½ºÆÐÄ¡ ÇÏ´õ¶óµµ º° ¹«¸®´Â ¾ø½À´Ï´Ù.

¸Þ½ÃÁö¸¦ ¾ÖÇø®ÄÉÀ̼ǿ¡ Àü´ÞÇϱâ Àü¿¡ WMA ±¸ÇöÀÌ »ç¿ëÀÚÀÇ È®ÀÎÀ» ¿ä±¸ÇÒ ¼ö ÀÖ´Ù´Â Á¡¿¡ À¯ÀÇÇϽñ⠹ٶø´Ï´Ù.

µ¿±â ¸Þ½Ã¡
 

µ¿±â ¸Þ½Ã¡ÀÇ °æ¿ì¿¡´Â Åë»óÀûÀ¸·Î MIDlet ÃʱâÈ­ °úÁ¤¿¡¼­ ¾²·¹µå¸¦ µð½ºÆÐÄ¡ÇÕ´Ï´Ù. ÀÌ ¾²·¹µå´Â ¸Þ½ÃÁö¿¡ ´ëÇØ ¹Ýº¹ ¼öÇà(loop)µÇ°í, Message.receive()¸¦ Àκ¸Å©ÇÏ¿© µé¾î¿À´Â ¸Þ½ÃÁö¸¦ ´ë±âÇÏ´Â µ¿¾È Â÷´ÜÇϰí, ±×·± ´ÙÀ½ ¸Þ½ÃÁö°¡ °¡¿ëÇÑ »óŰ¡ µÇ¸é À̸¦ ¼ÒºñÇÏ°Ô µË´Ï´Ù. ÇϳªÀÇ ¿¹Á¦·Î, µé¾î¿À´Â ¸Þ½ÃÁö¸¦ ´ë±âÇϰí ó¸®ÇÏ´Â ½ÇÇà ¾²·¹µå¸¦ ±¸ÇöÇÏ´Â RunnableÀÎ MySynchronousMsgReader Ŭ·¡½º¸¦ Á¤ÀÇÇØ º¸±â·Î ÇսôÙ.

public class MySynchronousMsgReader implements Runnable {

    MessageConnection messageConnection;
    boolean done;
    ...

    /**
     * Constructor
     *
     * @param messageConnection is the MessageConnection to use
     */
    public MySynchronousMsgReader(
            MessageConnection messageConnection) {
        this.messageConnection  = messageConnection;
        Thread th = new Thread(this);
        th.start();
    }
    ...

    /**
     * Sets the done flag to true
     */
    public void setDone() {
        done = true;
    }

    /**
     * Message receive thread of execution
     */
    public void run() {
        while (!done) {
            try {
                Message message;
                message = messageConnection.receive();
                if (message != null) {
                    processMessage(message);
                }
            } catch (IOException ioe) {
                  // Handle or ignore the exception
            }
         }
    }

    /**
     * Process the message
     *
     * @param message is the Message to process
     */
    public void processMessage(message) {
        // Here process the message
    }
    ...

}
 

¸Þ½ÃÁö 󸮿¡ °üÇØ¼­´Â °ð ´Ù½Ã ³íÇϵµ·Ï ÇϰڽÀ´Ï´Ù.

ºñµ¿±â ¸Þ½Ã¡
 

ºñµ¿±â ¸Þ½Ã¡ÀÇ °æ¿ì WMA´Â Á¾·¡ÀÇ Observer ¶Ç´Â Listener µðÀÚÀÎ ÆÐÅÏÀ» ±¸ÇöÇÏ¿© ºñµ¿±âÀûÀ¸·Î, Áï ¸Þ½ÃÁö¸¦ ´ë±âÇÏ´Â µ¿¾È Â÷´ÜÇÏÁö ¾Ê°í ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÕ´Ï´Ù. WMA´Â Ç÷§ÆûÀÌ Message¸¦ ¼ö½ÅÇÒ ¶§¸¶´Ù Àκ¸Å©ÇÏ´Â ´ÜÀÏ ¸Þ¼Òµå notifyIncomingMessage()¸¦ ÅëÇØ MessageListener ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÕ´Ï´Ù.

¸Þ½ÃÁö ¸®½º³Ê¸¦ ÀÌ¿ëÇÏ·Á¸é ¾ÖÇø®ÄÉÀ̼ÇÀº ¹Ýµå½Ã MessageListener ÀÎÅÍÆäÀ̽º¿Í ÇØ´ç notifyIncomingMessage() ¸Þ¼Òµå¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. ±×·¯¹Ç·Î,

public class MyClass implements MessageListener {
    ...
    /** 
     * Asynchronous callback for inbound message
     * Called by the WMA implementation when a new message is ready.
     *
     * @param connection is the message connection with incoming
     * messages.
     */
    public void notifyIncomingMessage(MessageConnection connection) {
        readMessageThreaded(connection);
    }
    ...
}
 

¸Þ½ÃÁö ¸®½º³ÊÀÇ notifyIncomingMessage() ¸Þ¼Òµå´Â Àιٿîµå ¸Þ½ÃÁö¸¦ ÀÎDzÀ¸·Î ÇÏ¿© MessageConnectionÀ» ¼ö½ÅÇϴµ¥, ÀÏ´Ü ÀÌ ¸Þ¼Òµå°¡ Àκ¸Å©µÇ¸é, ¾ÖÇø®ÄÉÀ̼ÇÀº ¹Ýµå½Ã messageConnection.receive()¸¦ È£ÃâÇÏ¿© »õ ¸Þ½ÃÁö¸¦ °Ë»öÇØ¾ß ÇÕ´Ï´Ù. ´ÙÀ½ÀÇ ¸Þ¼Òµå´Â ¸î °¡Áö helper ¸Þ¼Òµå¸¦ ±¸ÇöÇÏ¿© ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÕ´Ï´Ù.

/////////////////////////////////////////////////////////////////////
// Receive Helper Methods
/////////////////////////////////////////////////////////////////////

/**
 * Thread of execution to read messages from MessageConnection
 *
 * @param messageConnection is the messageConnection with inbound
 * messages
 */
public void readMessageThreaded(final MessageConnection messageConnection) {
    Thread th = new Thread() {
        public void run() {
            readMessage(messageConnection);
        }
    };
    th.start();
}

/**
 * Reads a message from MessageConnection, processes the message
 * @param messageConnection is the messageConnection with inbound
 * messages
 */
public void readMessage(final MessageConnection messageConnection) {
    try {
        Message message = null;
        message = messageConnection.receive();
        if (message != null) {
            processMessage(message);
        }
    } catch (IOException ioe) {
        System.out.println("readMessage exception: " + ioe);
    }
}

/**
 * Process the message
 * @param message is the Message to process
 */
public void processMessage(message) {
    // Here process the message
}
 

ºñµ¿±â ¸Þ½Ã¡ÀÌ °¡´ÉÇÏ°Ô µÇ·Á¸é, ¾Õ¼­ »ìÆìº» helper ¸Þ¼Òµå newMessageConnection()ÀÇ °æ¿ìó·³ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¹Ýµå½Ã MessageConnection.setListener()¸¦ È£ÃâÇÏ¿© ¸Þ½ÃÁö ¸®½º³Ê¸¦ Ä¿³Ø¼Ç¿¡ µî·ÏÇØ¾ß ÇÑ´Ù´Â »ç½ÇÀ» ±â¾ïÇÏ°í °è½Ê½Ã¿À. ¾Æ¿ï·¯, Ä¿³Ø¼ÇÀÇ ¸Þ½ÃÁö ¸®½º³Ê¸¦ null·Î ¼³Á¤Çϸé ÇöÀçÀÇ ¸ðµç ¸®½º³Ê°¡ µî·Ï ÇØÁ¦µÇ¾î ¾î¶² ÅëÁöµµ ¼ö½ÅÇÏÁö ¾Ê°Ô µÈ´Ù´Â Á¡ ¶ÇÇÑ ¸í½ÉÇØ¾ß ÇÕ´Ï´Ù.

...
mc.setMessageListener(messageListener);
...
 

¿ì¸®°¡ ¹æ±Ý Á¤ÀÇÇÑ readMessageThreaded() ¸Þ¼Òµå´Â ¸Þ½ÃÁö¸¦ Àбâ À§ÇÑ ÀÚü ½ÇÇà ¾²·¹µå¸¦ »ý¼ºÇÑ´Ù´Â Á¡¿¡ À¯ÀÇÇϽʽÿÀ. ¸®½º³Ê ¸Þ¼Òµå´Â Ç÷§Æû¿¡ ÀÇÇØ È£ÃâµÇ±â ¶§¹®¿¡, Ç×»ó ½Ã½ºÅÛ ¾²·¹µå¿¡ ´ëÇØ ¼öÇàÇϴ ó¸®¸¦ ÃÖ¼ÒÈ­ÇØ¾ß ÇÕ´Ï´Ù. Ç×»ó ¸Þ½ÃÁö¸¦ ¼ÒºñÇϰí ó¸®Çϱâ À§ÇÑ º°µµÀÇ ½ÇÇà ¾²·¹µå¸¦ µð½ºÆÐÄ¡ÇÏ¿© Ç÷§ÆûÀÌ notifyIncomingMessage()¿¡ °¡´ÉÇÑ ÇÑ ÀûÀº ½Ã°£À» ¼ÒºñÇϵµ·Ï ÇØ¾ß ÇÕ´Ï´Ù.

¸Þ½ÃÁö ó¸®Çϱâ

ÀÏ´Ü messageConnection.receive()¸¦ È£ÃâÇÏ¿© ¸Þ½ÃÁö¸¦ ÀÐÀ¸¸é ó¸®ÇÒ Áغñ°¡ µÈ °ÍÀÔ´Ï´Ù. receive()ÀÇ ¸®ÅÏ Å¸ÀÔÀº Æ÷°ýÀûÀÎ ½´ÆÛŸÀÔ MessageÀ̹ǷÎ, ¸Þ½ÃÁö¸¦ Á¦´ë·Î ó¸®ÇÏ·Á¸é ¸ÕÀú ÇØ´ç ¼­ºêŸÀÔ - BinaryMessage, MultipartMessage, TextMessage - À» ¾Ë¾Æ³»¾ß¸¸ ÇÕ´Ï´Ù.

LCDUI(Liquid Crystal Display User Interface)¸¦ ÅëÇØ WMA ¸Þ½ÃÁö¸¦ ºäÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ´Â helper ¸Þ¼Òµå¸¦ Á¤ÀÇÇØ º¸±â·Î ÇսôÙ. ÀÌ ¸Þ¼Òµå´Â Message¸¦ ÀÎDzÀ¸·Î ÃëÇÏ°í ¾ÖÇø®ÄÉÀ̼ÇÀÌ LCDUI Form¿¡ µð½ºÇ÷¹ÀÌÇÒ ¼ö ÀÖ´Â UI ¿¤¸®¸ÕÆ® ¶Ç´Â ¾ÆÀÌÅÛÀ» ¹ÝȯÇÕ´Ï´Ù. processMessage() ¸Þ¼Òµå°¡ instanceof ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© MessageÀÇ ¼­ºêŸÀÔÀ» ¾Ë¾Æ³½ ´ÙÀ½ ÇØ´ç process-message ¸Þ¼Òµå¸¦ È£ÃâÇϸé javax.microedition.lcdui.Items ¹è¿­ÀÌ ¹ÝȯµË´Ï´Ù.

/**
 * ProcessMessage processes a Message
 */
public Item[] processMessage(Message message) {

    Item[] items = null;

    // Process the received message appropriately to its type
    if (message instanceof TextMessage) {
        TextMessage tmsg = (TextMessage)message;
        items = processTextMessage(tmsg);
    } else
    if (message instanceof BinaryMessage) {
        BinaryMessage bmsg = (BinaryMessage)message;
        items = processBinaryMessage(bmsg);
    } else
    if (message instanceof MultipartMessage) {
        MultipartMessage mpmsg = (MultipartMessage)message;
        items = processMultipartMessage(mpmsg);
    } else {
        // Ignore
        System.out.println("Unrecognized message type...");
        return null;
    }
    return items;
}
 

ÀÌ ¸Þ¼Òµå´Â ¸Þ½ÃÁö¸¦ ó¸®ÇÏ¿© ¼¼ °¡Áö helper Áß Çϳª¿¡ javax.microedition.lcdui.Items ¹è¿­À» ¹ÝȯÇÏ´Â ½ÇÁ¦ ÀÛ¾÷À» À§ÀÓÇÏ°Ô µÇ´Âµ¥, ÀÌ Áß ÇϳªÀÎ processTextMessage()´Â TextMessage.getPayloadText()¸¦ È£ÃâÇÏ¿© ÅØ½ºÆ® ¸Þ½ÃÁöÀÇ ÆäÀ̷ε带 °Ë»öÇÑ ´ÙÀ½ ¸Þ½ÃÁöÀÇ ÅØ½ºÆ®¸¦ Æ÷ÇÔÇÏ´Â ´ÜÀÏ ¿¤¸®¸ÕÆ® StringItem ¹è¿­À» ¹ÝȯÇÕ´Ï´Ù.

/**
 * Process TextMessage
 *
 * @param tmsg is the TextMessage to process
 */
public Item[] processTextMessage(TextMessage tmsg) {
    Item[] items;
    String text = tmsg.getPayloadText();
    items = new Item[1];
    Item item = new StringItem(null, text);
    items[0] = item;
    return items;
}
 

processBinaryMessage() helper ¸Þ¼Òµåµµ ÀÌ¿Í À¯»çÇÏÁö¸¸, ÅØ½ºÆ® ¸Þ½ÃÁö¸¦ ó¸®ÇÏ´Â ´ë½Å BinaryMessage.getPayloadData()¸¦ È£ÃâÇÏ¿© ¹ÙÀ̳ʸ® ¸Þ½ÃÁöÀÇ ÆäÀ̷ε带 °Ë»öÇϰí, ¹ÙÀÌÆ® ¹è¿­À» 16Áø¼ö ¹®ÀÚ¿­·Î º¯È¯ÇÑ ´ÙÀ½ hex¸¦ Æ÷ÇÔÇÏ´Â ´ÜÀÏ ¿¤¸®¸ÕÆ® StringItem ¹è¿­À» ¹ÝȯÇÕ´Ï´Ù.

/**
 * Process BinaryMessage
 *
 * @param bmsg is the BinaryMessage to process
 */
public Item[] processBinaryMessage(BinaryMessage bmsg) {
    Item[] items;
    byte[] data = bmsg.getPayloadData();
    String hex = toHex(data);
    items = new Item[1];
    Item item = new StringItem(null, hex);
    items[0] = item;
    return items;
}

/**
 * toHex converts a byte array to human-readable hexadecimal
 * This method was borrowed from examples in the Sun Wireless
 * Toolkit :-)
 * @param data is the array of bytes to convert
 * @return a String containing the byte[] in hexadecimal format
 */
final private String toHex(byte[] data) {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; i++) {
        int intData = (int)data[i] & 0xFF;
        if (intData < 0x10) buf.append("0");
            // display 2 digits per byte i.e. 09
        buf.append(Integer.toHexString(intData));
        buf.append(' ');
    }
    return (buf.toString());
}
 

´ÙÀ½ÀÇ helper ¸Þ¼Òµå processMultipartMessage()´Â ¾à°£ ´õ º¹ÀâÇÕ´Ï´Ù.

MultipartMessage ³»ÀÇ MMS Çì´õ´Â ¸Þ½ÃÁö°¡ ¼Û½ÅÀڷκÎÅÍ ¼ö½ÅÀÚ¿¡°Ô·Î È®½ÇÈ÷ Àü´ÞµÇµµ·Ï ÇÏ´Â µ¥ ÀÌ¿ëµÇ¸ç TO, CC, BCC, FROM ÁÖ¼Ò µîÀÇ Á¤º¸¸¦ Æ÷ÇÔÇÕ´Ï´Ù. MMS º»¹® ÀÚü°¡ Çϳª ÀÌ»óÀÇ ¸Þ½ÃÁö ºÎºÐÀ¸·Î ÀÌ·ç¾îÁö¸ç, ±× °¢°¢Àº ´Ù½Ã Çì´õ, ŸÀÔ, º»¹®À¸·Î ±¸¼ºµË´Ï´Ù.

°¢°¢ÀÇ °³º° ¸Þ½ÃÁö ºÎºÐ¿¡´Â ¾Æ¹« MIME ŸÀÔÀ̳ª »ç¿ëµÉ ¼ö ÀÖÁö¸¸ ¸Þ½ÃÁöÀÇ Àüü MMS ÄÁÅÙÆ® ŸÀÔÀÇ °æ¿ì¿¡´Â ´ÙÀ½ ¼¼ °¡Áö Áß Çϳª°¡ »ç¿ëµË´Ï´Ù.

  • application/vnd.wap.mms-message ÀüÇüÀûÀÎ(true) ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö°¡ ¾Æ´Ñ °æ¿ì
  • application/vnd.wap.multipart.related °ü·Ã ÇÁ·¹Á¨Å×ÀÌ¼Ç Á¤º¸¸¦ °¡Áø ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁöÀÎ °æ¿ì
  • application/vnd.wap.multipart.mixed ¹«°üÇÑ ºÎºÐµé·Î ÀÌ·ç¾îÁø ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁöÀÎ °æ¿ì

´ÙÀ½ helper ¸Þ¼Òµå processMultipartMessage()´Â MultipartMessage Çì´õ Á¤º¸¸¦ °Ë»öÇÑ ´ÙÀ½ °¢ ºÎºÐÀÇ MIME ŸÀÔ¿¡ ÀÏÄ¡ÇÏ´Â ItemsÀÇ ¹è¿­À» ÃÖÁ¾ÀûÀ¸·Î ¹ÝȯÇÕ´Ï´Ù.

...
// MIME Types
public final static String MIMETYPE_TEXT_PLAIN  = "text/plain";
public final static String MIMETYPE_TEXT_XML    = "text/xml";
public final static String MIMETYPE_TEXT_HTML   = "text/html";
public final static String MIMETYPE_IMAGE_PNG   = "image/png";
public final static String MIMETYPE_IMAGE_JPEG  = "image/jpg";
public final static String MIMETYPE_IMAGE_GIF   = "image/gif";
public final static String MIMETYPE_APPLICATION_OCTET_STREAM = "application/octet-stream";
...

/**
 * Process MultipartMessage
 *
 * @param mpmsg is the MultipartMessageto process
 * @return array of javax.microedition.lcdui.Item
 */
public Item[] processMultipartMessage(MultipartMessage mpmsg) {

    // Get the Multipart message headers from the access methods:
    //  X-Mms-From, X-Mms-To, X-Mms-CC, X-Mms-BCC, X-Mms-Subject
    String from = mpmsg.getAddress();
    String tos[] = mpmsg.getAddresses("to");
    String ccs[] = mpmsg.getAddresses("cc");
    String bccs[] = mpmsg.getAddresses("bcc");
    String froms[] = mpmsg.getAddresses("from");
    String subject = mpmsg.getSubject();

    // Get the rest of the headers by calling the getHeader() method
    String mmsPriorityHeader = mpmsg.getHeader("X-Mms-Priority");
    String mmsDeliveryTimeHeader =
        mpmsg.getHeader("X-Mms-Delivery-Time");

    // Get the message timestamp
    Date timestamp = mpmsg.getTimestamp();

    // Get the start-content ID, which will be set for multimedia
    // content, and will contain the presentation information
    // (not used in this method)
    String startContentID = mpmsg.getStartContentId();

    // Get to the message parts array
    MessagePart[] messageParts = mpmsg.getMessageParts();
    int itemCount = messageParts.length + 2;
        // +2 is to account for from & subject
    Item[] messageItems = new Item[messageParts.length];

    // Create the UI elements for the message's Date and Subject
    messageItems[0] = new StringItem("From", from);
    messageItems[1] = new StringItem("Subject", subject);

    // process each message part
    for (int i=0; i<messageParts.length; i++) {
        MessagePart messagePart = messageParts[i];
        if (messagePart != null) {
            String mimeType = messagePart.getMIMEType();
            int length = messagePart.getLength();
            byte[] content = messagePart.getContent();
            String encoding = messagePart.getEncoding();

            // Message content can be retrieved as an InputStream
            InputStream contentAsInputStream =
                messagePart.getContentAsStream();

            // Used for multimedia messages, such as SMIL messages
            String contentID = messagePart.getContentID();
            String contentLocation =
                messagePart.getContentLocation();

            try {
                // text/plain
                if (mimeType.equals(MIMETYPE_TEXT_PLAIN)) {
                    String text = new String(content);
                    messageItems[i] = new StringItem(null, text);
                }
                // text/xml
                else if (mimeType.equals(MIMETYPE_TEXT_XML)) {
                    messageItems[i] = new StringItem(null,
                    "text/xml is not supported");
                }
                // text/html
                else if (mimeType.equals(MIMETYPE_TEXT_HTML)) {
                    messageItems[i] = new StringItem(null,
                    "text/html is not supported");
                }
                // application/octet-stream
                else if (mimeType.equals
                    (MIMETYPE_APPLICATION_OCTET_STREAM)) {
                    String hex = toHex(content);
                    messageItems[i] = new StringItem(null, hex);
                }
                // image/png
                else if (mimeType.equals(MIMETYPE_IMAGE_PNG)) {
                    Image img =
                        Image.createImage(content, 0, length);
                    messageItems[i] =
                        new ImageItem(null, img, 0, "Image");
                }
                // image/jpg
                else if (mimeType.equals(MIMETYPE_IMAGE_JPEG)) {
                    messageItems[i] = new StringItem(null,
                        "image/jpeg is not supported");
                }
                // image/gif
                else if (mimeType.equals(MIMETYPE_IMAGE_GIF)) {
                    messageItems[i] = new StringItem(null,
                        "image/gif is not supported");
                }
            } catch (Exception e) {
                System.out.println(
                    "processMultipartMessage, Exception: " + e);
            }
        }
    }
    return items;
}
 

RFC822 Çì´õ·Î ÀúÀåµÈ ÀϺΠMultipartMessage Á¤º¸´Â ¾×¼¼½º ¸Þ¼Òµå¸¦ ÅëÇØ ¾×¼¼½º°¡ °¡´ÉÇØÁö´Â ¹Ý¸é ´Ù¸¥ Çì´õµéÀº ¿ÀÁ÷ getHeader()¸¦ È£ÃâÇÏ¿© Á÷Á¢ °Ë»öÇØ¾ß¸¸ »ç¿ë °¡´ÉÇØÁø´Ù´Â Á¡¿¡ À¯ÀÇÇϽʽÿÀ. ±âŸ ¼Ó¼ºÀº º¸¾È»óÀÇ ÀÌÀ¯·Î ¾×¼¼½º°¡ ºÒ°¡´ÉÇÕ´Ï´Ù.

Çì´õ Áß ÇϳªÀÎ ÄÁÅÙÆ® ½ÃÀÛ(start-content) ID´Â SMIL ±â¹Ý ÄÁÅÙÆ® °°Àº ÀüÇüÀûÀÎ(true) ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö¸¦ À§ÇÑ ÇÁ·¹Á¨Å×ÀÌ¼Ç Á¤º¸°¡ Æ÷ÇÔµÈ ¸Þ½ÃÁö ºÎºÐÀ» ÂüÁ¶ÇÕ´Ï´Ù. ¸Þ½ÃÁö ÄÁÅÙÆ® ½ÃÀÛ(start message content) ID¸¦ °Ë»öÇÏ·Á¸é ¾Æ·¡¿Í °°ÀÌ ¸ÖƼÆÄÆ® ¸Þ½ÃÁö ¸Þ¼Òµå getStartContentId()¸¦ È£ÃâÇÕ´Ï´Ù.

...
// Get the start-content ID, which will be set for multimedia
// content, and will contain the presentation information
String startContentID = mpmsg.getStartContentId();
...
 

X-Mms-Delivery-Time Çì´õÀÇ Æ÷¸ËÀº UTC(ÇùÁ¤ ¼¼°è½Ã) 1970³â 1¿ù 1ÀÏ ÀÚÁ¤ºÎÅÍ °æ°úµÈ ¹Ð¸®Ãʸ¦ ¹®ÀÚ¿­ °ªÀ¸·Î Ç¥½ÃÇÑ °ÍÀÔ´Ï´Ù. X-Mms-PriorityÀÇ ÄÁÅÙÆ®ÀÇ Æ÷¸ËÀº "high" ¶Ç´Â "normal", "low"ÀÇ °ªÀ» °¡Áö´Â ¹®ÀÚ¿­ÀÔ´Ï´Ù.

...
// Get the Multipart message headers via the access methods:
//  X-Mms-From, X-Mms-To, X-Mms-CC, X-Mms-BCC, X-Mms-Subject
String from = mpmsg.getAddress();
String tos[] = mpmsg.getAddresses("to");
String ccs[] = mpmsg.getAddresses("cc");
String bccs[] = mpmsg.getAddresses("bcc");
String froms[] = mpmsg.getAddresses("from");
String subject = mpmsg.getSubject();

// Get the rest of the headers by calling the getHeader() method
String mmsPriorityHeader = mpmsg.getHeader("X-Mms-Priority");
String mmsDeliveryTimeHeader = mpmsg.getHeader("X-Mms-Delivery-Time");

// Get the message timestamp
Date timestamp = mpmsg.getTimestamp();
...
 

getAddresses() ¸Þ¼Òµå´Â ÁÖ¼Ò Å¸ÀÔ "to" ¶Ç´Â "cc", "bcc", "from"À» ÀÎDzÀ¸·Î ÃëÇϸç String ¹è¿­ ¶Ç´Â ÁöÁ¤µÈ ÁÖ¼Ò Å¸ÀÔÀ» ãÀ» ¼ö ¾ø´Â °æ¿ì nullÀ» ¹ÝȯÇÕ´Ï´Ù. ÀÌ ¶§, Çϳª ÀÌ»óÀÇ TO, CC, BCC ÁÖ¼Ò°¡ ¾î¶² ¹æ½ÄÀ¸·Îµç °áÇÕµÉ ¼ö ÀÖ½À´Ï´Ù. getHeader() ¸Þ¼Òµå´Â Çì´õ À̸§À» ÀÎDzÀ¸·Î ÃëÇϴµ¥, ¿ä±¸µÈ Çì´õ°¡ Á¦ÇÑµÈ °æ¿ì¿¡´Â SecurityExceptionÀ» throwÇϰí Çì´õ°¡ ¾Ë·ÁÁöÁö ¾ÊÀº °æ¿ì¿¡´Â IllegalArgumentExceptionÀ» throwÇÕ´Ï´Ù. MMS Çì´õ¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº WMA 2.0 ½ºÆåÀÇ ºÎ·Ï D¸¦ ÂüÁ¶ÇϽʽÿÀ.

¸Þ½ÃÁö Áö¼Ó¼º(Persistence)

µé¾î¿À´Â WMA ¸Þ½ÃÁö´Â óÀ½¿¡ ÀåÄ¡ÀÇ SIM(Subscriber Identity Module) Ä«µå¿¡ ÀúÀåµÇ¾ú´Ù°¡ ¾ÖÇø®ÄÉÀ̼ǿ¡ Àü´ÞµÉ ¶§ SIM¿¡¼­ »èÁ¦µÇ´Âµ¥, ¾ÖÇø®ÄÉÀÌ¼Ç ·¹º§¿¡¼­ÀÇ Message Áö¼Ó¼º ¿©ºÎ´Â °³¹ßÀÚ¿¡ ÀÇÇØ °áÁ¤µË´Ï´Ù. ¿©·¯ºÐÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡ ¸Þ½ÃÁö Áö¼Ó¼ºÀ» Ãß°¡ÇÏ·Á¸é ¹Ýµå½Ã ¸Þ½ÃÁö ÆäÀ̷ε带 serialize/deserializeÇϰí RMS(Record Management System)¸¦ ÀÌ¿ëÇÏ¿© ·ÎÄà ½ºÅä¾î¸¦ °ü¸®ÇØ¾ß ÇÕ´Ï´Ù.

ºÐÇÒ°ú ÀçÁ¶¸³(SAR)

ÀϺΠƮ·£½ºÆ÷Æ®´Â ´ÜÀÏ ¸Þ½ÃÁöÀÇ Å©±â³ª ¸Þ½ÃÁö¸¦ ±¸¼ºÇÏ´Â ¼¼±×¸ÕÆ®ÀÇ ¼ö¿¡ Á¦ÇÑÀ» µÎ°í ÀÖ½À´Ï´Ù. ÇÑÆí, SAR(Segmentation and Reassembly)´Â Å« ¸Þ½ÃÁö¸¦ ¿©·¯ °³ÀÇ ÀÛÀº ¼øÂ÷Àû ¼¼±×¸ÕÆ® ¶Ç´Â Àü¼Û ´ÜÀ§·Î ºÐÇÒÇÏ´Â ÀÏÁ¾ÀÇ low-level Æ®·£½ºÆ÷Æ®ÀÇ ±â´ÉÀε¥, ¿¹¸¦ µé¾î SMS ³×Æ®¿öÅ©¸¦ ÅëÇØ ¼Û½ÅµÈ ¸Þ½ÃÁö´Â ÀϹÝÀûÀ¸·Î 160°³ÀÇ 7ºñÆ® ÀÎÄÚµù ¹®ÀÚ ¶Ç´Â 140°³ÀÇ 8ºñÆ® ¹ÙÀÌÆ®·Î Á¦ÇѵǹǷΠ´õ ±ä ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ·Á¸é ¹Ýµå½Ã ºÐÇÒÀ» ÇØ¾ß ÇÕ´Ï´Ù. ÀçÁ¶¸³Àº ºÐÇÒ°ú ¹Ý´ë·Î ´õ ÀÛÀº °ü·Ã ¼¼±×¸ÕÆ®µéÀ» ´Ù½Ã ÇϳªÀÇ ¸Þ½ÃÁö·Î ÇÕÄ¡´Â ÀÛ¾÷À̶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù.

WMA 2.0 ½ºÆåÀº WMA ±â¹Ý SMS ±¸ÇöÀÌ ¹Ýµå½Ã ´ÜÀÏ ¸Þ½ÃÁö¿¡ ´ëÇØ ¼¼ °³ ÀÌ»óÀÇ SMS ÇÁ·ÎÅäÄÝ ¼¼±×¸ÕÆ®¸¦ Áö¿øÇÒ °ÍÀ» ¿ä±¸Çϰí ÀÖ½À´Ï´Ù. ±¸Çö¿¡ µû¶ó¼­´Â ´õ ¸¹ÀÌ Áö¿øÇÒ ¼öµµ ÀÖÁö¸¸, ¾ÖÇø®ÄÉÀ̼ÇÀÌ 3 ¼¼±×¸ÕÆ® Á¦ÇÑÀ» °í¼öÇϰí 456°³ÀÇ GSM 7ºñÆ® ÀÎÄÚµù ¹®ÀÚ, 198°³ÀÇ ´õºí¹ÙÀÌÆ® ¹®ÀÚ, ¶Ç´Â 399°³ÀÇ ¹ÙÀ̳ʸ® ¹ÙÀÌÆ®º¸´Ù Å« ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏÁö ¾Ê´Â´Ù¸é ±×¸¸Å­ À̽ļºÀº ´õ Ä¿Áý´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº WMA 2.0 ºÎ·Ï A.1.2 "Message Payload Concatenation"À» ÂüÁ¶ÇϽʽÿÀ. ´õ Å« ¸Þ¼¼Áö¸¦ º¸³»°ÔµÇ¸é IOExceptionÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù. MMS ¸Þ½ÃÁöÀÇ °æ¿ì¿¡´Â SAR°¡ ´Ù¸£°Ô 󸮵ǰí Å©±â Á¦ÇÑÀÌ ´ú ¾ö°ÝÇÕ´Ï´Ù. °³º° ¸Þ½ÃÁö ºÎºÐÀº Å©±â°¡ ų·Î¹ÙÀÌÆ® ¼öÁØÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. MMS ¸Þ½ÃÁö ºÎºÐÀÌ °¡¿ëÇÑ ¸Þ¸ð¸®³ª Áö¿øµÇ´Â Å©±âº¸´Ù Ŭ °æ¿ì¿¡´Â SizeExceededExceptionÀÌ ¹ß»ýÇÏ°Ô µË´Ï´Ù.

SMS ¸Þ½ÃÁö ºÐÇÒÀ» ¿ëÀÌÇÏ°Ô Çϱâ À§ÇØ, WMA´Â MessageConnection.numberOfSegments()¶ó´Â ¸Þ¼Òµå¸¦ Á¦°øÇϴµ¥, ÀÌ ¸Þ¼Òµå´Â MessageConnection.send()¸¦ ÀÌ¿ëÇÏ¿© Message¸¦ ¼Û½ÅÇϱâ Àü¿¡ ºÐÇÒ Á¤º¸¸¦ Á¦°øÇÕ´Ï´Ù. numberOfSegments() ¸Þ¼Òµå´Â ¸Þ½ÃÁö ¼Û½Å¿¡ ÇÊ¿äÇÑ ¼¼±×¸ÕÆ®ÀÇ ¼ö ¶Ç´Â ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÒ ¼ö ¾ø´Â °æ¿ì 0À» ¹ÝȯÇÕ´Ï´Ù. ±×·³, numberOfSegments()¸¦ ÀÌ¿ëÇÏ´Â ¼öÁ¤µÈ ¹öÀüÀÇ sendTextMessage()¸¦ »ìÆìº¸±â·Î ÇսôÙ.

...
Message msg = ...;
int segcount = mc.numberOfSegments(msg);
if (segcount == 0) {
    // can't send, alert the user
    alertUser(SEGMENTATIONERROR);
}
...
 

¶ÇÇÑ, numberOfSegments()·ÎºÎÅÍ ¾ò´Â Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ¿¡°Ô ¸Þ½ÃÁö°¡ ±æ¼ö·Ï ¼Û½Å ºñ¿ëµµ Áõ°¡ÇÑ´Ù´Â Á¡À» °æ°íÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ´Ü¹® ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ´Â µ¥ µå´Â ºñ¿ëÀÌ 5¼¾Æ®¶ó¸é 3 ¼¼±×¸ÕÆ®·Î µÈ Å« ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ´Â ºñ¿ëÀº 15¼¾Æ®°¡ µÉ ¼ö ÀÖ½À´Ï´Ù. ºñ¿ë¿¡ ½Å°æÀ» ¾²´Â »ç¿ëÀÚÀÇ °æ¿ì ±ä ¸Þ½ÃÁö¸¦ Ãë¼ÒÇÒ ±âȸ°¡ ÁÖ¾îÁø´Ù¸é »ó´çÈ÷ ¹Ý°¡¿öÇÒ °ÍÀÔ´Ï´Ù.

½Ã½ºÅÛ ¼Ó¼º

WMA 2.0Àº SMSC(Short Message Service Center)¿Í MMSC(Multimedia Message Service Center)ÀÇ ÁÖ¼Ò¸¦ °Ë»öÇϱâ À§ÇÑ µÎ °¡ÁöÀÇ ½Ã½ºÅÛ ¼Ó¼ºÀ» Á¤ÀÇÇÕ´Ï´Ù.

  • wireless.messaging.sms.smsc - the SMSC attribute name
  • wireless.messaging.mms.mmsc - the MMSC attribute name

´ÙÀ½°ú °°ÀÌ System.getProperty(String attributeName) ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¿© ÀÌ °ªµéÀ» °Ë»öÇÕ´Ï´Ù.

...
String smsc = System.getProperty("wireless.messaging.sms.smsc");
String mmsc = System.getProperty("wireless.messaging.mms.mmsc");
...
 

SMSC ÁÖ¼Ò´Â +18472549270°ú °°Àº MSISDN ¹øÈ£À̰í, MMSC ÁÖ¼Ò´Â +18472549270°ú °°Àº MSISDN ¹øÈ£ °ª ¶Ç´Â http://mmsc.cingular.com°ú °°Àº URLÀÔ´Ï´Ù.

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)À» ÂüÁ¶ÇϽʽÿÀ.

WMA v2.0 ÂüÁ¶ ±¸Çö(Reference Implementation)

J2ME Wireless Toolkit ±â¼ú ÆäÀÌÁö(¿µ¹®)¿¡´Â ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥À» Å×½ºÆ®ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â Wireless Messaging API 2.0ÀÇ ÂüÁ¶ ±¸ÇöÀÌ °Ô½ÃµÇ¾î ÀÖ½À´Ï´Ù.

Server-to-Handset ¸Þ½Ã¡

À̹ø ±â»ç¿¡¼­´Â Çڵ弼Ʈ·ÎºÎÅÍ ¡®¸ð¹ÙÀÏ ¹ß½Å(mobile-originated)¡¯ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇϰí Çڵ弼Ʈ ¶Ç´Â ¼­¹ö·ÎºÎÅÍ ¼Û½ÅµÈ ¡®¸ð¹ÙÀÏ Âø½Å(mobile-terminated)¡¯ WMA ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ´Â ¹æ¹ý¿¡ °üÇØ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ¼­¹ö·ÎºÎÅÍ Çڵ弼Ʈ·Î ¸Þ½ÃÁö¸¦ ¼Û½ÅÇÏ·Á¸é ³×Æ®¿öÅ© Á¦°øÀÚÀÇ SMSC¿Í MMSC ¼­¹ö¿¡ ¾×¼¼½ºÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ¼­¹öµé¿¡ ´ëÇÑ ¾×¼¼½º´Â ÀÏÁ¾ÀÇ Æ¯±ÇÀ¸·Î¼­, ÀϹÝÀûÀ¸·Î Á¦3ÀÚ ¸Þ½Ã¡ º¥´õ¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù. ÀÌ º¥´õµéÀº ÀÌ¹Ì AT&T (Cingular Blue), Boost Mobile, Cingular (Orange), Nextel, T-Mobile, Sprint, Verizon µîÀ» ºñ·ÔÇÑ ¸ÞÀÌÀú Åë½Å »ç¾÷ÀÚ ¹× Alltel, Western Wireless, Leap, Cincinnati Bell, Dobson µîÀ» ºñ·ÔÇÑ 2±º(second-tier) Åë½Å »ç¾÷ÀÚ¿Í °ü°è¸¦ À¯ÁöÇϰí ÀÖ½À´Ï´Ù. ÇÑÆí, ÀÌ º¥´õµéÀº HTTP µîÀÇ ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÏ´Â exposed API¸¦ ÅëÇØ Åë½Å »ç¾÷ÀÚÀÇ SMSC ¹× MMSC¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÔÀ¸·Î½á ¿©·¯ºÐÀÇ ¼­¹ö ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÁÖ¾îÁø Çڵ弼Ʈ¿¡ ¸Þ½ÃÁö¸¦ ¼Û½Å, ±×¸®°í Çڵ弼Ʈ·ÎºÎÅÍ ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϰí, ¼ôÄÚµå(short-code) °°Àº ÇÁ¸®¹Ì¾ö ¼­ºñ½º¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÝ´Ï´Ù.

¾Æ¿ï·¯, Çڵ弼ƮÀÇ Æ¯Á¤ ¾ÖÇø®ÄÉÀ̼ǿ¡ ¸Þ½ÃÁö¸¦ ¼Û½ÅÇØ¾ß ÇÏ´Â °æ¿ì¿¡´Â ¹Ýµå½Ã ¸Þ½ÃÁö¿¡ ´ëÇÑ ÇØ´ç Æ÷Æ® ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù´Â »ç½ÇÀ» ÀØÁö ¸¶½Ê½Ã¿À. ±×·¸Áö ¾ÊÀ¸¸é ¸Þ½ÃÁö°¡ Çڵ弼ƮÀÇ ±âº»°ª ºä¾î·Î Àü´ÞµË´Ï´Ù. ³ª°¡´Â ¸Þ½ÃÁö¿¡¼­ Æ÷Æ® ¹øÈ£ ¶Ç´Â ¾ÖÇø®ÄÉÀÌ¼Ç ID¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀº »ç¿ëÇÏ´Â ¸Þ½Ã¡ ¼­ºñ½º¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù. º¥´õ°¡ API¸¦ Á¦°øÇÒ ¼öµµ ÀÖ°í ¿©·¯ºÐÀÌ ¹ÙÀ̳ʸ® ÇüÅ·Πraw message¸¦ ¸¸µé¾î¾ß ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. GSM SMSÀÇ °æ¿ì¿¡´Â TP-User-Data/User-Data-Header Çʵ忡 Æ÷Æ® ¹øÈ£°¡ ÀÖ°í, MMSÀÇ °æ¿ì¿¡´Â MMS Content-type Çì´õ¿¡ ¾ÖÇø®ÄÉÀÌ¼Ç ID°¡ ÀÖ½À´Ï´Ù.

¿ä¾à

Wireless Messaging API´Â ¡°ÇÁ·ÎÅäÄÝ/ÀåÄ¡ µ¶¸³ÀûÀΡ± ¸Å¿ì À¯¿¬ÇÑ ¸Þ½Ã¡ API¸¦ Á¦°øÇÕ´Ï´Ù. ÂüÁ¶ ±¸ÇöÀº ´çÀåÀÌ¶óµµ WMA ±â¹Ý ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϰí Å×½ºÆ®ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ¸ç, WMAÀÇ À¯¿¬ÇÑ µðÀÚÀÎÀº ÇâÈÄ ¿ëÀÌÇÑ È®ÀåÀ» º¸ÀåÇØÁÙ »Ó ¾Æ´Ï¶ó ÀÌ¹Ì °¡Àå ÈçÈ÷ »ç¿ëµÇ´Â ¸Þ½ÃÁö ŸÀÔ - ÅØ½ºÆ®, ¹ÙÀ̳ʸ®, ¸ÖƼ¹Ìµð¾î - À» Áö¿øÇϰí ÀÖ½À´Ï´Ù. WMA´Â °³¹ßÀÚµéÀÌ ´Ü¹® ¸Þ½ÃÁöÀÇ push µ¿ÀÛ ¹× »ç¿ëÀ» ºñ·ÔÇÏ¿© SMS, À̸ÞÀÏ, ¸®Ä¡ ¸ÖƼ¹Ìµð¾î µîÀÇ ¸Þ½Ã¡°ú ÅëÇÕ °¡´ÉÇÑ ±ò²ûÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.

Âü°í ÀÚ·á