Sms service: Difference between revisions
(→Study) |
No edit summary |
||
(13 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Overview == | == Overview == | ||
문자 전송 서비스 구현 방법 소개. | 문자 전송 서비스 구현 방법 소개. | ||
== Type == | |||
=== SMS === | |||
Normal SMS message. | |||
=== Binary === | |||
Binary SMS messages allow sending of various types of rich-content, such as transferring ringtones, telephone system settings and WAP-Push via text messaging. | |||
Any binary SMS message has 140 bytes of data which can be used. This data is split into two distinct parts - the user data header(UDH) and the message data. UDH notifies mobile phones about the type of data in the message. defining the type of content being sent. | |||
* rich-content : Rich content consists of different media formats(sound, video and images) used at the same time and place. For example, emojis or gifs are called rich content when they are used within an instant messaging app. | |||
=== Flash === | |||
== Payload == | |||
원문은 이곳<ref>http://spin.atomicobject.com/2011/04/20/concatenated-sms-messages-and-character-counts/</ref>에서 확인할 수 있다. | |||
=== Standard === | |||
기본 SMS Payload 는 140 bytes(1120 bits) 이다. | |||
만약 GSM 7-bit character 인코딩을 사용한다면, 한번에 최대 160 character 를 전송할 수 있다. | |||
<pre> | |||
1120 bits / (7 bits/character) = 160 characters | |||
</pre> | |||
유니코드(16-bit character 인코딩을 사용하는 유니코드)의 경우, 최대 70 character 를 전송할 수 있다. | |||
<pre> | |||
1120 bits / (16 bits/character) = 70 characters | |||
</pre> | |||
=== Segmentation(concatenated SMS) === | |||
기본 SMS는 한번에 최대 140 bytes(160 GSM 7 bits characters)만 전송할 수 있다. | |||
그러나, 실제 사용하는 휴대폰으로 얼마든지 140 bytes(160 GSM 7 bits characters) 이상의 데이터를 전송할 수 있는 것을 확인할 수 있다. 하지만 이는 SMS 단편화(Segmentation, concatenated SMS) 때문이다. | |||
한번에 140 bytes 이상의 데이터를 전송하게 되는 경우, 내부적으로 단편화(Segmentation)가 일어나게 된다.<ref>http://help.cardboardfish.com/?q=ConcatenatedAndLongSMS</ref> | |||
간단하게, 휴대폰에서 한번에 140 bytes(160 GSM 7 bits characters) 이상의 데이터를 전송하게 되면 내부적으로 이를 여러개의 SMS 으로 분할한 뒤, 전송하게 되는 것이다. 참고로, 요즘의 휴대폰으로는 이를 확인하기가 어렵다. 이를 확인하기 위해서는 GSM 모듈단의 접근이 필요하다. | |||
그리고, 메시지 단편화가 발생하게 되면, 각각의 메시지에 User Data Header(UDH)라고 하고 특수 헤더가 붙게 된다. 이 헤더에는 SMS 메시지의 ID, 순서번호가 포함되게 된다. UDH 는 6 bytes(48 bits) 의 공간을 차지하게 되며, 이로 인해, 데이터 payload 가 줄어들게 된다. 따라서 단편화 발생시, 사용가능한 payload 의 크기는 다음과 같다. | |||
<pre> | |||
1120 bits - 48 bits = 1072 bits | |||
</pre> | |||
그리고 GSM은 GSM-7 bit encoding 을 사용하기 때문에, 단편화시, 전송하능한 문자 갯수는 다음과 같다. | |||
<pre> | |||
1072 bits / (7 bits/character) = 153 characters | |||
Note: 153 * 7 bits/character = 1071 bits 이다. 하지만, 남은 나머지 1 bit 로는 GSM-7 bit encoding 에서 어떠한 문자도 표현할 수 없기에, padding 으로 사용된다. | |||
</pre> | |||
마찬가지 이유로, 16-bit character encoding 유니코드의 경우는 다음과 같다. | |||
<pre> | |||
1072 bits / (16 bits/character) = 67 characters | |||
</pre> | |||
그리고, 메시지 단편화가 발생되게 되면, 48 bits(6 bytes)의 추가 헤더 정보를 포함해야 하기 때문에 메시지 하나에 포함 가능한 데이터의 크기는 153 characters(GSM 7 bits characters) 줄어들게 된다. 실제 전송되는 SMS 메시지 갯수를 확인하기 위해서는 다음의 공식을 이용하면 된다. | |||
<pre> | |||
Nc = Total number of characters in message | |||
Nx = Characters from extended GSM table (|^{}[]~\ and euro) | |||
L = Message length in 7-bit characters | |||
M = Number of messages | |||
L = Nc + Nx | |||
L > 160: M = L / 153 [rounded up] | |||
L <= 160: M = 1 | |||
</pre> | |||
GSM 7 bit Basic 에 있는 character 는 7 bits 로 표현이 가능하다. 하지만 Extension 에 있는 문자들을 표현하기 위해서는 7 bits + 7 bits 가 필요하다. | |||
== GSM == | |||
GSM 에서의 SMS Charset 규격은 GSM 03.38 혹은 3GPP 23.038 을 사용한다. | |||
=== GSM 7 bit === | |||
SMS 메시지는 한번에 최대 140 byte 만 전송할 수 있다. 하지만 표현되는 문자의 범위가 다르다. | |||
흔히들 [[ASCII code]]를 알고 있다. 하지만, 이는 컴퓨터 통신에서 사용되는 하나의 데이터 표현 규약 일 뿐이다. GSM SMS 통신에서는 사용하는 규약이 다르다. | |||
GSM 에서는 GSM 7 bit 라는 규약을 사용한다. | |||
그리고 GSM 을 이용해서 정확한 SMS을 전송하기 위해서는 전송하는 문자가 GSM 7 bit에 포함되는 문자여야 한다. | |||
사실, 보다 근본적으로 살펴보면 SMS가 전달하는 것은 메시지가 아니라 데이터이다. | |||
그리고, 송/수신되는 0과 1의 데이터를 GSM 7 bit 테이블 표에 의해 표현하는 것이다. 즉, 이 뜻은 GSM 7 bit 에 포함된 글자만 전송된다는 것이 아니라는 뜻이다. | |||
다만, 통신사 내부 구현 방식에 의해서 내부적으로 메시지가 Encode/Decode 될 수가 있다. | |||
그런데, Encode/Decode 되는 과정에서, GSM 표준을 벗어나는 글자(한글, 한자, 일본어)들은 오류가 발생할 수 있다. | |||
이렇게 메시지 상에서 오류가 발생하게 되면 수신시 ??? 등으로 표시된다.(TDC에는 ??? 혹은 ㅁㅁㅁ 로 나타났음.) | |||
* GSM 7 bit | |||
{|border="0" cellspacing="0" cellpadding="0" style="background:none" | |||
|-style="vertical-align:top" | |||
| | |||
{|class="wikitable" style="text-align:center;font-size:120%;line-height:normal" | |||
|+ Basic Character Set<ref name="3G-TS-23.038">[http://www.3gpp.org/ftp/specs/archive/23_series/23.038/23038-a00.zip Alphabets and language-specific information (3G TS 23.038 version 10.0.0)] (zipped .doc file), ETSI, March 2011.</ref> | |||
|- | |||
! !!scope="col"| 0x00 !!scope="col"| 0x10 !!scope="col"| 0x20 !!scope="col"| 0x30 !!scope="col"| 0x40 !!scope="col"| 0x50 !!scope="col"| 0x60 !!scope="col"| 0x70 | |||
|- | |||
!scope="row"| 0x00 | |||
|title="commercial at"| [[@]] ||title="Greek capital Delta"| [[Δ]] ||style="background:#FEA"| <small>SP</small> || [[0 (number)|0]] ||title="inverted exclamation mark"| [[¡]] || [[P]] ||title="inverted question mark"| [[¿]] || [[p]] | |||
|- | |||
!scope="row"| 0x01 | |||
|title="pound symbol"| [[£]] ||title="underscore"| [[Underscore|_]] ||title="exclamation mark"| [[!]] || [[1 (number)|1]] || [[A]] || [[Q]] || [[a]] || [[q]] | |||
|- | |||
!scope="row"| 0x02 | |||
|title="dollar symbol"| [[$]] ||title="Greek capital Phi"| [[Φ]] ||title="double quote"| [["]] || [[2 (number)|2]] || [[B]] || [[R]] || [[b]] || [[r]] | |||
|- | |||
!scope="row"| 0x03 | |||
|title="yen symbol"| [[¥]] ||title="Greek capital Gamma"| [[Γ]] ||title="number sign"| [[number sign|#]] || [[3 (number)|3]] || [[C]] || [[S]] || [[c]] || [[s]] | |||
|- | |||
!scope="row"| 0x04 | |||
|title="Latin small letter e with grave"| [[è]] ||title="Greek capital Lambda"| [[Λ]] ||title="currency symbol"| [[¤]] || [[4 (number)|4]] || [[D]] || [[T]] || [[d]] || [[t]] | |||
|- | |||
!scope="row"| 0x05 | |||
|title="Latin small letter e with acute"| [[é]] ||title="Greek capital Omega"| [[Ω]] ||title="percent sign"| [[percent sign|%]] || [[5 (number)|5]] || [[E]] || [[U]] || [[e]] || [[u]] | |||
|- | |||
!scope="row"| 0x06 | |||
|title="Latin small letter u with grave"| [[ù]] ||title="Greek capital Pi"| [[Π]] ||title="ampersand"| [[&]] || [[6 (number)|6]] || [[F]] || [[V]] || [[f]] || [[v]] | |||
|- | |||
!scope="row"| 0x07 | |||
|title="Latin small letter i with grave"| [[ì]] ||title="Greek capital Psi"| [[Ψ]] ||title="apostrophe-quote"| [[']] || [[7 (number)|7]] || [[G]] || [[W]] || [[g]] || [[w]] | |||
|- | |||
!scope="row"| 0x08 | |||
|title="Latin small letter o with grave"| [[ò]] ||title="Greek capital Sigma"| [[Sigma|Σ]] ||title="opening parenthesis"| [[(]] || [[8 (number)|8]] || [[H]] || [[X]] || [[h]] || [[x]] | |||
|- | |||
!scope="row"| 0x09 | |||
|title="Latin capital letter C with cedilla"| [[Ç]] ||title="Greek capital Theta"| [[Θ]] ||title="closing parenthesis"| [[)]] || [[9 (number)|9]] || [[I]] || [[Y]] || [[i]] || [[y]] | |||
|- | |||
!scope="row"| 0x0A | |||
|style="background:#FEA"| <small>LF</small> ||title="Greek capital Xi"| [[Ξ]] ||title="asterisk"| [[*]] ||title="colon"| [[colon (punctuation)|:]] || [[J]] || [[Z]] || [[j]] || [[z]] | |||
|- | |||
!scope="row"| 0x0B | |||
|title="Latin capital letter O with stroke"| [[Ø]] ||style="background:#FEA"| <small>ESC</small> ||title="plus sign"| [[+]] ||title="semicolon"| [[;]] || [[K]] ||title="Latin capital letter A with diaeresis"| [[Ä]] || [[k]] ||title="Latin small letter a with diaeresis"| [[ä]] | |||
|- | |||
!scope="row"| 0x0C | |||
|title="Latin small letter o with stroke"| [[ø]] ||title="Latin capital letter AE"| [[Æ]] ||title="comma"| [[,]] ||title="less-than sign"| [[less-than sign|<]] || [[L]] ||title="Latin capital letter O with diaeresis"| [[Ö]] || [[l]] ||title="Latin small letter o with diaeresis"| [[ö]] | |||
|- | |||
!scope="row"| 0x0D | |||
|style="background:#FEA"| <small>CR</small> ||title="Latin small letter ae"| [[æ]] ||title="minus-hyphen"| [[-]] ||title="equals sign"| [[=]] || [[M]] ||title="Latin capital letter N with tilde"| [[Ñ]] || [[m]] ||title="Latin small letter n with tilde"| [[ñ]] | |||
|- | |||
!scope="row"| 0x0E | |||
|title="Latin capital letter A with ring"| [[Å]] ||title="Latin small letter sharp s"| [[ß]] ||title="full stop"| [[full stop|.]] ||title="greater-than sign"| [[greater-than sign|>]] || [[N]] ||title="Latin capital letter U with diaeresis"| [[Ü]] || [[n]] ||title="Latin small letter u with diaeresis"| [[ü]] | |||
|- | |||
!scope="row"| 0x0F | |||
|title="Latin small letter a with ring"| [[å]] ||title="Latin capital letter E with acute"| [[É]] ||title="solidus"| [[/]] ||title="question mark"| [[?]] || [[O]] ||title="section sign"| [[§]] || [[o]] ||title="Latin small letter a with grave"| [[à]] | |||
|} | |||
* <small>LF</small> is a Line Feed control. | |||
* <small>CR</small> is a Carriage Return control, or filler. | |||
* <small>ESC</small> is an Escape control. | |||
* <small>SP</small> is a Space character. | |||
| | |||
{|class="wikitable" style="text-align:center;font-size:120%;line-height:normal" | |||
|+ Basic Character Set Extension<ref name="3G-TS-23.038" /> | |||
|- | |||
! !!scope="col"| 0x00 !!scope="col"| 0x10 !!scope="col"| 0x20 !!scope="col"| 0x30 !!scope="col"| 0x40 !!scope="col"| 0x50 !!scope="col"| 0x60 !!scope="col"| 0x70 | |||
|- | |||
!scope="row"| 0x00 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="vertical bar"| [[vertical bar||]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x01 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x02 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x03 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x04 | |||
|style="background:#CCC"| ||title="circumflex"| [[^]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x05 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="euro symbol"| [[€]] ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x06 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x07 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x08 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="opening curly bracket"| [[bracket#Curly bracket|{]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x09 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="closing curly bracket"| [[bracket#Curly bracket|}]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0A | |||
|style="background:#FEA"| <small>FF</small> ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0B | |||
|style="background:#CCC"| ||style="background:#FEA"| <small>SS2</small> ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0C | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="opening square bracket"| [[square bracket|[]]||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0D | |||
|style="background:#FEA"| <small>CR2</small> ||style="background:#CCC"| ||style="background:#CCC"| ||title="tilde"| [[~]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0E | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="closing square bracket"| [[square bracket|]]]||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0F | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="reverse solidus"| [[\]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|} | |||
* <small>FF</small> is a Page Break control. If not recognized, it shall be treated like <small>LF</small>. | |||
* <small>CR2</small> is a control character. No language specific character shall be encoded at this position. | |||
* <small>SS2</small> is a second Single Shift Escape control reserved for future extensions. | |||
|} | |||
=== Available characters in TDC === | |||
덴마크 통신사 TDC에서는 다음의 캐릭터 들만 허용한다(그리스 문자들은 허용하지 않는다). | |||
{|border="0" cellspacing="0" cellpadding="0" style="background:none" | |||
|-style="vertical-align:top" | |||
| | |||
{|class="wikitable" style="text-align:center;font-size:120%;line-height:normal" | |||
|+ Basic Character Set | |||
|- | |||
! !!scope="col"| 0x00 !!scope="col"| 0x10 !!scope="col"| 0x20 !!scope="col"| 0x30 !!scope="col"| 0x40 !!scope="col"| 0x50 !!scope="col"| 0x60 !!scope="col"| 0x70 | |||
|- | |||
!scope="row"| 0x00 | |||
|title="commercial at"| [[@]] || ||style="background:#FEA"| <small>SP</small> || [[0 (number)|0]] ||title="inverted exclamation mark"| [[¡]] || [[P]] ||title="inverted question mark"| [[¿]] || [[p]] | |||
|- | |||
!scope="row"| 0x01 | |||
|title="pound symbol"| [[£]] ||title="underscore"| [[Underscore|_]] ||title="exclamation mark"| [[!]] || [[1 (number)|1]] || [[A]] || [[Q]] || [[a]] || [[q]] | |||
|- | |||
!scope="row"| 0x02 | |||
|title="dollar symbol"| [[$]] || ||title="double quote"| [["]] || [[2 (number)|2]] || [[B]] || [[R]] || [[b]] || [[r]] | |||
|- | |||
!scope="row"| 0x03 | |||
|title="yen symbol"| [[¥]] || ||title="number sign"| [[number sign|#]] || [[3 (number)|3]] || [[C]] || [[S]] || [[c]] || [[s]] | |||
|- | |||
!scope="row"| 0x04 | |||
|title="Latin small letter e with grave"| [[è]] || ||title="currency symbol"| [[¤]] || [[4 (number)|4]] || [[D]] || [[T]] || [[d]] || [[t]] | |||
|- | |||
!scope="row"| 0x05 | |||
|title="Latin small letter e with acute"| [[é]] || ||title="percent sign"| [[percent sign|%]] || [[5 (number)|5]] || [[E]] || [[U]] || [[e]] || [[u]] | |||
|- | |||
!scope="row"| 0x06 | |||
|title="Latin small letter u with grave"| [[ù]] || ||title="ampersand"| [[&]] || [[6 (number)|6]] || [[F]] || [[V]] || [[f]] || [[v]] | |||
|- | |||
!scope="row"| 0x07 | |||
|title="Latin small letter i with grave"| [[ì]] || ||title="apostrophe-quote"| [[']] || [[7 (number)|7]] || [[G]] || [[W]] || [[g]] || [[w]] | |||
|- | |||
!scope="row"| 0x08 | |||
|title="Latin small letter o with grave"| [[ò]] || ||title="opening parenthesis"| [[(]] || [[8 (number)|8]] || [[H]] || [[X]] || [[h]] || [[x]] | |||
|- | |||
!scope="row"| 0x09 | |||
|title="Latin capital letter C with cedilla"| [[Ç]] || ||title="closing parenthesis"| [[)]] || [[9 (number)|9]] || [[I]] || [[Y]] || [[i]] || [[y]] | |||
|- | |||
!scope="row"| 0x0A | |||
|style="background:#FEA"| <small>LF</small> || ||title="asterisk"| [[*]] ||title="colon"| [[colon (punctuation)|:]] || [[J]] || [[Z]] || [[j]] || [[z]] | |||
|- | |||
!scope="row"| 0x0B | |||
|title="Latin capital letter O with stroke"| [[Ø]] ||style="background:#FEA"| <small>ESC</small> ||title="plus sign"| [[+]] ||title="semicolon"| [[;]] || [[K]] ||title="Latin capital letter A with diaeresis"| [[Ä]] || [[k]] ||title="Latin small letter a with diaeresis"| [[ä]] | |||
|- | |||
!scope="row"| 0x0C | |||
|title="Latin small letter o with stroke"| [[ø]] ||title="Latin capital letter AE"| [[Æ]] ||title="comma"| [[,]] ||title="less-than sign"| [[less-than sign|<]] || [[L]] ||title="Latin capital letter O with diaeresis"| [[Ö]] || [[l]] ||title="Latin small letter o with diaeresis"| [[ö]] | |||
|- | |||
!scope="row"| 0x0D | |||
|style="background:#FEA"| <small>CR</small> ||title="Latin small letter ae"| [[æ]] ||title="minus-hyphen"| [[-]] ||title="equals sign"| [[=]] || [[M]] ||title="Latin capital letter N with tilde"| [[Ñ]] || [[m]] ||title="Latin small letter n with tilde"| [[ñ]] | |||
|- | |||
!scope="row"| 0x0E | |||
|title="Latin capital letter A with ring"| [[Å]] ||title="Latin small letter sharp s"| [[ß]] ||title="full stop"| [[full stop|.]] ||title="greater-than sign"| [[greater-than sign|>]] || [[N]] ||title="Latin capital letter U with diaeresis"| [[Ü]] || [[n]] ||title="Latin small letter u with diaeresis"| [[ü]] | |||
|- | |||
!scope="row"| 0x0F | |||
|title="Latin small letter a with ring"| [[å]] ||title="Latin capital letter E with acute"| [[É]] ||title="solidus"| [[/]] ||title="question mark"| [[?]] || [[O]] ||title="section sign"| [[§]] || [[o]] ||title="Latin small letter a with grave"| [[à]] | |||
|} | |||
* <small>LF</small> is a Line Feed control. | |||
* <small>CR</small> is a Carriage Return control, or filler. | |||
* <small>ESC</small> is an Escape control. | |||
* <small>SP</small> is a Space character. | |||
| | |||
{|class="wikitable" style="text-align:center;font-size:120%;line-height:normal" | |||
|+ Basic Character Set Extension | |||
|- | |||
! !!scope="col"| 0x00 !!scope="col"| 0x10 !!scope="col"| 0x20 !!scope="col"| 0x30 !!scope="col"| 0x40 !!scope="col"| 0x50 !!scope="col"| 0x60 !!scope="col"| 0x70 | |||
|- | |||
!scope="row"| 0x00 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="vertical bar"| [[vertical bar||]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x01 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x02 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x03 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x04 | |||
|style="background:#CCC"| ||title="circumflex"| [[^]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x05 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| || ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x06 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x07 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x08 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="opening curly bracket"| [[bracket#Curly bracket|{]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x09 | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="closing curly bracket"| [[bracket#Curly bracket|}]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0A | |||
|style="background:#FEA"| <small>FF</small> ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0B | |||
|style="background:#CCC"| ||style="background:#FEA"| <small>SS2</small> ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0C | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="opening square bracket"| [[square bracket|[]]||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0D | |||
|style="background:#FEA"| <small>CR2</small> ||style="background:#CCC"| ||style="background:#CCC"| ||title="tilde"| [[~]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0E | |||
|style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||title="closing square bracket"| [[square bracket|]]]||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|- | |||
!scope="row"| 0x0F | |||
|style="background:#CCC"| ||style="background:#CCC"| ||title="reverse solidus"| [[\]] ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| ||style="background:#CCC"| | |||
|} | |||
* <small>FF</small> is a Page Break control. If not recognized, it shall be treated like <small>LF</small>. | |||
* <small>CR2</small> is a control character. No language specific character shall be encoded at this position. | |||
* <small>SS2</small> is a second Single Shift Escape control reserved for future extensions. | |||
|} | |||
== 주요 서비스 사 == | == 주요 서비스 사 == | ||
Line 25: | Line 354: | ||
* Why text messages are limited to 160 characters? | * Why text messages are limited to 160 characters? | ||
: http://latimesblogs.latimes.com/technology/2009/05/invented-text-messaging.html | : http://latimesblogs.latimes.com/technology/2009/05/invented-text-messaging.html | ||
* GSM SMS specification(GSM 03.40, 3GPP TS 23.040) | |||
: http://en.wikipedia.org/wiki/GSM_03.40#Message_Content | |||
* GSM SMS character set(GSM 03.38, 3GPP 23.038) | |||
: http://en.wikipedia.org/wiki/GSM_03.38 | |||
== References == | == References == | ||
<references /> | <references /> | ||
[[category: | [[category:telephony]] |
Latest revision as of 11:54, 5 October 2018
Overview
문자 전송 서비스 구현 방법 소개.
Type
SMS
Normal SMS message.
Binary
Binary SMS messages allow sending of various types of rich-content, such as transferring ringtones, telephone system settings and WAP-Push via text messaging.
Any binary SMS message has 140 bytes of data which can be used. This data is split into two distinct parts - the user data header(UDH) and the message data. UDH notifies mobile phones about the type of data in the message. defining the type of content being sent.
- rich-content : Rich content consists of different media formats(sound, video and images) used at the same time and place. For example, emojis or gifs are called rich content when they are used within an instant messaging app.
Flash
Payload
원문은 이곳<ref>http://spin.atomicobject.com/2011/04/20/concatenated-sms-messages-and-character-counts/</ref>에서 확인할 수 있다.
Standard
기본 SMS Payload 는 140 bytes(1120 bits) 이다.
만약 GSM 7-bit character 인코딩을 사용한다면, 한번에 최대 160 character 를 전송할 수 있다.
1120 bits / (7 bits/character) = 160 characters
유니코드(16-bit character 인코딩을 사용하는 유니코드)의 경우, 최대 70 character 를 전송할 수 있다.
1120 bits / (16 bits/character) = 70 characters
Segmentation(concatenated SMS)
기본 SMS는 한번에 최대 140 bytes(160 GSM 7 bits characters)만 전송할 수 있다.
그러나, 실제 사용하는 휴대폰으로 얼마든지 140 bytes(160 GSM 7 bits characters) 이상의 데이터를 전송할 수 있는 것을 확인할 수 있다. 하지만 이는 SMS 단편화(Segmentation, concatenated SMS) 때문이다.
한번에 140 bytes 이상의 데이터를 전송하게 되는 경우, 내부적으로 단편화(Segmentation)가 일어나게 된다.<ref>http://help.cardboardfish.com/?q=ConcatenatedAndLongSMS</ref>
간단하게, 휴대폰에서 한번에 140 bytes(160 GSM 7 bits characters) 이상의 데이터를 전송하게 되면 내부적으로 이를 여러개의 SMS 으로 분할한 뒤, 전송하게 되는 것이다. 참고로, 요즘의 휴대폰으로는 이를 확인하기가 어렵다. 이를 확인하기 위해서는 GSM 모듈단의 접근이 필요하다.
그리고, 메시지 단편화가 발생하게 되면, 각각의 메시지에 User Data Header(UDH)라고 하고 특수 헤더가 붙게 된다. 이 헤더에는 SMS 메시지의 ID, 순서번호가 포함되게 된다. UDH 는 6 bytes(48 bits) 의 공간을 차지하게 되며, 이로 인해, 데이터 payload 가 줄어들게 된다. 따라서 단편화 발생시, 사용가능한 payload 의 크기는 다음과 같다.
1120 bits - 48 bits = 1072 bits
그리고 GSM은 GSM-7 bit encoding 을 사용하기 때문에, 단편화시, 전송하능한 문자 갯수는 다음과 같다.
1072 bits / (7 bits/character) = 153 characters Note: 153 * 7 bits/character = 1071 bits 이다. 하지만, 남은 나머지 1 bit 로는 GSM-7 bit encoding 에서 어떠한 문자도 표현할 수 없기에, padding 으로 사용된다.
마찬가지 이유로, 16-bit character encoding 유니코드의 경우는 다음과 같다.
1072 bits / (16 bits/character) = 67 characters
그리고, 메시지 단편화가 발생되게 되면, 48 bits(6 bytes)의 추가 헤더 정보를 포함해야 하기 때문에 메시지 하나에 포함 가능한 데이터의 크기는 153 characters(GSM 7 bits characters) 줄어들게 된다. 실제 전송되는 SMS 메시지 갯수를 확인하기 위해서는 다음의 공식을 이용하면 된다.
Nc = Total number of characters in message Nx = Characters from extended GSM table (|^{}[]~\ and euro) L = Message length in 7-bit characters M = Number of messages L = Nc + Nx L > 160: M = L / 153 [rounded up] L <= 160: M = 1
GSM 7 bit Basic 에 있는 character 는 7 bits 로 표현이 가능하다. 하지만 Extension 에 있는 문자들을 표현하기 위해서는 7 bits + 7 bits 가 필요하다.
GSM
GSM 에서의 SMS Charset 규격은 GSM 03.38 혹은 3GPP 23.038 을 사용한다.
GSM 7 bit
SMS 메시지는 한번에 최대 140 byte 만 전송할 수 있다. 하지만 표현되는 문자의 범위가 다르다.
흔히들 ASCII code를 알고 있다. 하지만, 이는 컴퓨터 통신에서 사용되는 하나의 데이터 표현 규약 일 뿐이다. GSM SMS 통신에서는 사용하는 규약이 다르다.
GSM 에서는 GSM 7 bit 라는 규약을 사용한다. 그리고 GSM 을 이용해서 정확한 SMS을 전송하기 위해서는 전송하는 문자가 GSM 7 bit에 포함되는 문자여야 한다.
사실, 보다 근본적으로 살펴보면 SMS가 전달하는 것은 메시지가 아니라 데이터이다. 그리고, 송/수신되는 0과 1의 데이터를 GSM 7 bit 테이블 표에 의해 표현하는 것이다. 즉, 이 뜻은 GSM 7 bit 에 포함된 글자만 전송된다는 것이 아니라는 뜻이다.
다만, 통신사 내부 구현 방식에 의해서 내부적으로 메시지가 Encode/Decode 될 수가 있다. 그런데, Encode/Decode 되는 과정에서, GSM 표준을 벗어나는 글자(한글, 한자, 일본어)들은 오류가 발생할 수 있다. 이렇게 메시지 상에서 오류가 발생하게 되면 수신시 ??? 등으로 표시된다.(TDC에는 ??? 혹은 ㅁㅁㅁ 로 나타났음.)
- GSM 7 bit
|
|
Available characters in TDC
덴마크 통신사 TDC에서는 다음의 캐릭터 들만 허용한다(그리스 문자들은 허용하지 않는다).
|
|
주요 서비스 사
Korea
- SK
- KT
- LG
Denmark
- TDC
Study
- SMS
- SMS wiki
- Why text messages are limited to 160 characters?
- GSM SMS specification(GSM 03.40, 3GPP TS 23.040)
- GSM SMS character set(GSM 03.38, 3GPP 23.038)
References
<references />