Sms service: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
No edit summary
Line 1: Line 1:
== Overview ==
== Overview ==
문자 전송 서비스 구현 방법 소개.
문자 전송 서비스 구현 방법 소개.
== GSM ==
=== GSM 7 bit ===
SMS 메시지는 한번에 최대 160 byte 만 전송할 수 있다. 하지만 표현되는 문자의 범위가 다르다.
흔히들 [[ASCII code]]를 알고 있다. 하지만, 이는 컴퓨터 통신에서 사용되는 하나의 데이터 표현 규약 일 뿐이다. GSM SMS 통신에서는 사용하는 규약이 다르다.
GSM 에서는 GSM 7 bit 라는 규약을 사용한다.
그리고 GSM 을 이용해서 SMS 를 전송하기 위해서는 전송하는 문자가 GSM 7 bit에 포함되는 문자여야 한다.
* 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>
|-
! &nbsp; !!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"| [[&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"| [[&Phi;]] ||title="double quote"| [["]] || [[2 (number)|2]] || [[B]] || [[R]] || [[b]] || [[r]]
|-
!scope="row"| 0x03
|title="yen symbol"| [[¥]] ||title="Greek capital Gamma"| [[&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"| [[&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"| [[&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"| [[&Pi;]] ||title="ampersand"| [[&amp;]] || [[6 (number)|6]] || [[F]] || [[V]] || [[f]] || [[v]]
|-
!scope="row"| 0x07
|title="Latin small letter i with grave"| [[ì]] ||title="Greek capital Psi"| [[&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|&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"| [[&Theta;]] ||title="closing parenthesis"| [[)]] || [[9 (number)|9]] || [[I]] || [[Y]] || [[i]] || [[y]]
|-
!scope="row"| 0x0A
|style="background:#FEA"| <small>LF</small> ||title="Greek capital Xi"| [[&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|&lt;]] || [[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|&gt;]] || [[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" />
|-
! &nbsp; !!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"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="vertical bar"| [[vertical bar|&#124;]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x01
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x02
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x03
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x04
|style="background:#CCC"| &nbsp; ||title="circumflex"| [[^]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x05
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="euro symbol"| [[€]] ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x06
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x07
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x08
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="opening curly bracket"| [[bracket#Curly bracket|&#123;]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x09
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="closing curly bracket"| [[bracket#Curly bracket|&#125;]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0A
|style="background:#FEA"| <small>FF</small> ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0B
|style="background:#CCC"| &nbsp; ||style="background:#FEA"| <small>SS2</small> ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0C
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="opening square bracket"| [[square bracket|&#91;]]||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0D
|style="background:#FEA"| <small>CR2</small> ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="tilde"| [[&#126;]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0E
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="closing square bracket"| [[square bracket|&#93;]]||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|-
!scope="row"| 0x0F
|style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||title="reverse solidus"| [[\]] ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp; ||style="background:#CCC"| &nbsp;
|}
* <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.
|}
=== SMS Segment ===
일반 SMS는 한번에 최대 160 바이트만 전송할 수 있다.
그러나, 실제 사용하는 휴대폰으로 얼마든지 160바이트 이상의 데이터를 전송할 수 있는 것을 확인할 수 있다. 하지만 이는 반은 맞고 반은 틀린 내용이다.
내부적으로 단편화(Segmentation)가 일어나게 된다.<ref>http://help.cardboardfish.com/?q=ConcatenatedAndLongSMS</ref>
휴대폰에서 한번에 160 바이트 이상의 데이터를 전송하게 되면 내부적으로 이를 여러개의 SMS 으로 분할한 뒤, 전송하게 되는 것이다. 참고로, 요즘의 휴대폰으로는 이를 확인하기가 어렵다. 이를 확인하기 위해서는 GSM 모듈단의 접근이 필요하다.
그리고, 메시지 단편화가 발생되게 되면, 7 바이트의 추가 헤더 정보를 포함해야 하기 때문에 메시지 하나에 포함 가능한 데이터의 크기는 153 바이트로 줄어들게 된다. 실제 전송되는 SMS 메시지 갯수를 확인하기 위해서는 다음의 공식을 이용하면 된다.
* SMS Segment Count
<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 Extension
GSM 7 bit Basic 에 있는 캐릭터들은 1바이트로 표현이 가능하다. 하지만 Extension 에 있는 문자들을 표현하기 위해서는 2 바이트가 필요하다.


== 주요 서비스 사 ==
== 주요 서비스 사 ==

Revision as of 15:06, 10 June 2015

Overview

문자 전송 서비스 구현 방법 소개.

GSM

GSM 7 bit

SMS 메시지는 한번에 최대 160 byte 만 전송할 수 있다. 하지만 표현되는 문자의 범위가 다르다.

흔히들 ASCII code를 알고 있다. 하지만, 이는 컴퓨터 통신에서 사용되는 하나의 데이터 표현 규약 일 뿐이다. GSM SMS 통신에서는 사용하는 규약이 다르다.

GSM 에서는 GSM 7 bit 라는 규약을 사용한다. 그리고 GSM 을 이용해서 SMS 를 전송하기 위해서는 전송하는 문자가 GSM 7 bit에 포함되는 문자여야 한다.

  • GSM 7 bit
Basic Character Set<ref name="3G-TS-23.038">Alphabets and language-specific information (3G TS 23.038 version 10.0.0) (zipped .doc file), ETSI, March 2011.</ref>
  0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70
0x00 @ Δ SP 0 ¡ P ¿ p
0x01 £ _ ! 1 A Q a q
0x02 $ Φ " 2 B R b r
0x03 ¥ Γ # 3 C S c s
0x04 è Λ ¤ 4 D T d t
0x05 é Ω % 5 E U e u
0x06 ù Π & 6 F V f v
0x07 ì Ψ ' 7 G W g w
0x08 ò Σ ( 8 H X h x
0x09 Ç Θ ) 9 I Y i y
0x0A LF Ξ * : J Z j z
0x0B Ø ESC + ; K Ä k ä
0x0C ø Æ , < L Ö l ö
0x0D CR æ - = M Ñ m ñ
0x0E Å ß . > N Ü n ü
0x0F å É / ? O § o à
  • LF is a Line Feed control.
  • CR is a Carriage Return control, or filler.
  • ESC is an Escape control.
  • SP is a Space character.
Basic Character Set Extension<ref name="3G-TS-23.038" />
  0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70
0x00         |      
0x01                
0x02                
0x03                
0x04   ^            
0x05              
0x06                
0x07                
0x08     {          
0x09     }          
0x0A FF              
0x0B   SS2            
0x0C       [        
0x0D CR2     ~        
0x0E       ]        
0x0F     \          
  • FF is a Page Break control. If not recognized, it shall be treated like LF.
  • CR2 is a control character. No language specific character shall be encoded at this position.
  • SS2 is a second Single Shift Escape control reserved for future extensions.

SMS Segment

일반 SMS는 한번에 최대 160 바이트만 전송할 수 있다.

그러나, 실제 사용하는 휴대폰으로 얼마든지 160바이트 이상의 데이터를 전송할 수 있는 것을 확인할 수 있다. 하지만 이는 반은 맞고 반은 틀린 내용이다.

내부적으로 단편화(Segmentation)가 일어나게 된다.<ref>http://help.cardboardfish.com/?q=ConcatenatedAndLongSMS</ref>

휴대폰에서 한번에 160 바이트 이상의 데이터를 전송하게 되면 내부적으로 이를 여러개의 SMS 으로 분할한 뒤, 전송하게 되는 것이다. 참고로, 요즘의 휴대폰으로는 이를 확인하기가 어렵다. 이를 확인하기 위해서는 GSM 모듈단의 접근이 필요하다.

그리고, 메시지 단편화가 발생되게 되면, 7 바이트의 추가 헤더 정보를 포함해야 하기 때문에 메시지 하나에 포함 가능한 데이터의 크기는 153 바이트로 줄어들게 된다. 실제 전송되는 SMS 메시지 갯수를 확인하기 위해서는 다음의 공식을 이용하면 된다.

  • SMS Segment Count
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 Extension

GSM 7 bit Basic 에 있는 캐릭터들은 1바이트로 표현이 가능하다. 하지만 Extension 에 있는 문자들을 표현하기 위해서는 2 바이트가 필요하다.

주요 서비스 사

Korea

  • SK
http://bizmsg.skbroadband.com
  • KT
http://www.xroshot.com/XroshotBIZ/product.jsp
  • LG
http://www.uplus.co.kr/biz/ebiz/agem/RetrieveBzEbBmSmsServer.hpi

Denmark

  • TDC
http://tdc.dk
http://cpservice.tdctech.dk/portal/tws_tdc/Forum

Study

  • SMS
http://en.wikipedia.org/wiki/Short_Message_Service
  • SMS wiki
http://www.sms-wiki.org/p_10-home-sms.html
  • Why text messages are limited to 160 characters?
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 />