|
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´Â ¹«¼± ¸Þ½ÃÁö¸¦ ÁÖ°í¹ÞÀ» ¼ö ÀÖ´Â ÈÞ´ëÆù µîÀÇ ÀåÄ¡¸¦ °Ü³ÉÇÑ ±â¼ú·Î¼, °³º° ÅØ½ºÆ®/¹ÙÀ̳ʸ® ¸Þ½ÃÁö»Ó ¾Æ´Ï¶ó ¸ÖƼ¹Ìµð¾î ¸Þ½ÃÁö Àü¼Û¿¡ ÁÖ·Î »ç¿ëµÇ´Â ¸ÖƼÆÄÆ® ÆäÀ̷ε带 Àü¼ÛÇϱâ À§ÇÑ ¸Þ½Ã¡ 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ÀÇ ±¸¼º¿ä¼ÒµéÀ» °£·«ÇÏ°Ô º¸¿©ÁÖ°í ÀÖ½À´Ï´Ù.
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Àº ÀÌ ÆÐŰÁö¸¦ ¿ä¾àÇÑ °ÍÀÔ´Ï´Ù.
 |
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ÀÇ ¼ºêÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÕ´Ï´Ù.
ÀÌ ¶§,
-
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 ±â¹Ý Çì´õ ¹× º¹¼ö ºÎºÐÀ¸·Î ±¸¼ºµÇ´Â Ç¥ÁØ À̸ÞÀÏÀÇ Æ÷¸ËÀ» µû¸¨´Ï´Ù.
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 ÀÎÅÍÆäÀ̽º¿¡ ±â¹ÝÀ» µÓ´Ï´Ù.
±×¸² 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, À̸ÞÀÏ, ¸®Ä¡ ¸ÖƼ¹Ìµð¾î µîÀÇ ¸Þ½Ã¡°ú ÅëÇÕ °¡´ÉÇÑ ±ò²ûÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁÝ´Ï´Ù.
Âü°í ÀÚ·á
|
|