Čtení SMS zpráv
*Posílání/čtení SMS zpráv v PDU formátu
*Úvod
*Formát doručené zprávy (Mobile Terminated - MT)
*Formát odesílané zprávy (Mobile Originated - MO)
*Popis jednotlivých částí
*Popis jednotlivých polí
*Středisko zpráv (SCA pole)
*Typ PDU - Protocol Data Unit Type (PDU Type)
*Message reference (MR)
*Zdrojová adresa a cílová adresa (OA, DA)
*Protocol Identifier PID
*Kódování vlastní zprávy - Data Coding Scheme DCS
*Časové razítko SCTS – Service Center Time Stamp SCTS
*Platnost zprávy – Validity Period VP
*VPF = 10 (relativní čas)
*VPF = 11 (absolutní čas)
*Délka zprávy a uživatelská data - User Data Length UDL and User Data UD
*PDU příklady:
*Tabulka znaků – 7bitové kódování
*Zkratky
*Aplikační poznámky
*Kódování PDU
*Zdrojový kód – příklad
*AT+CMGL[=stat]
<stat>: Číslo v případě PDU módu (default 0), nebo řetězec v textovém módu (default "REC UNREAD")
|
<stat> in PDU mode |
<stat> in text mode |
Selected option |
|
0 |
"REC UNREAD" |
Přijaté nepřečtené zprávy (t.j. nové zprávy) |
|
1 |
"REC READ" |
Přijaté přečtené zprávy |
|
2 |
"STO UNSENT" |
Uložené neposlané zprávy |
|
3 |
"STO SENT" |
Uložené poslané zprávy |
|
4 |
"ALL" |
Všechny zprávy (použitelné pro +CMGLIST příkaz) |
PDU mód
PDU mód používá stejné příkazy a odpovědi jako v textovém módu. Rozdíl je ve formátu. V PDU módu celá zpráva včetně hlavičky je jako binární řetězec.
Syntaxe příkazu
|
Command |
Possible response(s) |
|
+CMGL[=<stat>] |
if PDU mode (+CMGF=0) and command successful: +CMGL: <index>,<stat>,[<alpha>],<length><CR><LF><pdu> [<CR><LF>+CMGL:<index>,<stat>,[<alpha>],<length><CR><LF><pdu> [...]] otherwise: +CMS ERROR: <err> |
|
+CMGL=? |
+CMGL: (list of supported <stat>s) |
Parametry zprávy |
|
|
<alpha> |
Řetězec reprezentující buď <da> nebo <oa>. |
|
<da> |
Cílová adresa ve řetězcovém formátu; typ adresy je dán <toda>. |
|
<data> |
Uživatelská data |
|
<dcs> |
Schéma kódování dat |
|
<dt> |
GSM 03.40 TP-Discharge-Time in time-string format: "yy/MM/dd,hh:mm:ss±zz", where characters indicate year (two last digits), month, day, hour, minutes, seconds and time zone. E.g. 6th of May 1994, 22:10:00 GMT+2 hours equals to "94/05/06,22:10:00+08" Čas vypršení zprávy v řetězcovém formátu : "yy/MM/dd,hh:mm:ss±zz", kde znaky odpovídají roku (poslední dvě číslice), měsíc, den, hodinu, minutu, sekundu a časovou zónu. Např. 6.5.1994, 22:10:00 GMT+2 hodin odpovídá tomuto řetězci: "94/05/06,22:10:00+08" |
|
<fo> |
První oktet SMS podle doporučení „ETSI recommandation 03.40.“ |
|
<length> |
Délka zprávy <data> v textovém módu (+CMGF=1) |
|
<mid> |
CBM – Identifikátor zprávy v číselném formátu. |
|
<mr> |
Message-Reference in integer format. |
|
<oa> |
Adresa odesilatele – formát zprávy je definován v <tooa>. |
|
<page> |
CBM Page Parameter bits 4-7 in integer format. |
|
<pages> |
CBM Page Parameter bits 0-3 in integer format. |
|
<pdu> |
In the case of SMS: GSM 04.11 SC address followed by GSM 03.40 TPDU in hexadecimal format: ME/TA converts each octet of TP data unit into two IRA character long hexadecimal number (e.g. octet with integer value 42 is presented to TE as two characters 2A (IRA 50 and 65)) |
|
<pid> |
Protocol-Identifier in integer format (default 0). |
|
<sca> |
Číslo střediska zpráv – typ adresy je dán <tosca>. |
|
<scts> |
Čas střediska zpráv: "yy/MM/dd,hh:mm:ss±zz". |
|
<sn> |
CBM Serial Number – CBM sériové číslo |
|
<toda> |
Typ cílové adresy - číselný formát (když první znak adresy <da> je "+" (IRA 43) hodnota je 145, jinak je hodnota 129). |
|
<tooa> |
Typ adresy odesilatele (viz <toda>). |
|
<tosca> |
Typ adresy střediska zpráv (viz <toda>). |
|
<vp> |
Validity period – platnost zprávy (default 167) nebo v řetězcovém formátu (viz <dt>). |
Posílání/čtení SMS zpráv v PDU formátu

MS: Mobile Station – Mobilní stanice
SME: Short Message Entity -
SMSC: Short Message Service Center – Středisko zpráv
MMI: Man Machine Interface – Rozhraní člověk - stroj
PDUs: Protocol Data Units – Komunikační rámce
SM-AL: Short Message Aplication Layer - Aplikační vrstva krátkých zpráv
SM-TL: Short Message Transport Layer - Transportní vrstva krátkých zpráv
SM-RL: Short Message Relay Layer - Relační vrstva krátkých zpráv
SM-LL: Short Message Link Layer - Fyzická vrstva krátkých zpráv
Abyste mohli používat SMS, musíte nejprve zadat adresu střediska zpráv – pomocí AT příkazu
at+csca = ”<SMSC-number>”
např.
at+csca = "+491722270000"
Příkazem
at+csca?
zjistíte posledně nastavenou adresu střediska zpráv.
Formát doručené zprávy (Mobile Terminated - MT)
|
SCA |
Typ PDU |
OA |
PID |
DCS |
SCTS |
UDL |
UD |
|
1-12 oktetů |
1 oktet |
2-12 oktetů |
1 oktet |
1 oktet |
7 oktetů |
1 oktet |
0-140 oktetů |
Typ PDU:
|
RP |
UDHI |
SRI |
MMS |
RTI |
|||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Formát odesílané zprávy (Mobile Originated - MO)
|
SCA |
Typ PDU |
MR |
DA |
PID |
DCS |
VP |
UDL |
UD |
|
1-12 oktetů |
1 oktet |
1 oktet |
2-12 oktetů |
1 oktet |
1 oktet |
0,1 nebo 7 oktetů |
1 oktet |
0-140 oktetů |
Typ PDU:
|
RP |
UDHI |
SRR |
VPF |
RD |
MTI |
||
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
MTI: bit 1 = 0 a bit 0 = 1
|
SCA |
Service Center Address |
Telefonní číslo střediska zpráv |
|
Typ PDU |
Protocol Data Unit Type |
|
|
MR |
Message reference |
Zvyšující se číslo (0 až 255) všech odeslaných zpráv z telefonu (nastavuje telefonem?) |
|
OA |
Originating Address |
Adresa zdroje SMS zprávy (odkud byla poslána) |
|
DA |
Destination Address |
Adresa cíle (kam se má poslat) |
|
PID |
Protocol Identifier |
Parametr ukazující SMSC, jak zpracovat SMS zprávu (jako FAX, …) |
|
DCS |
Data Coding Scheme |
Parametr udávající, jak jsou zakódovaná data ve zprávě (UD) |
|
SCTS |
Service Center Time Stamp |
Kdy SMSC dostalo tuto zprávu |
|
VP |
Validity Period |
Parametr udávající odky už není tato zpráva platná v SMSC (=platnost zprávy) |
|
UDL |
User data length |
Délka dat (délka UD) |
|
UD |
User Data |
Data (text) zprávy |
|
RP |
Reply Path |
Parametr udávající, že existuje zpáteční adresa |
|
UDHI |
User Data Header Indication |
Znamená, že pole UD obsahuje hlavičku |
|
SRI |
Status Report Indication |
Je vyžadována status od SME? |
|
SRR |
Status Report Request |
MS si vyžádal status? |
|
VPF |
Validity Period Format |
Je zadáno pole VP? |
|
MMS |
More Messages to Send |
Udává, jestli jsou ještě nějaké zprávy k poslání |
|
RD |
Reject Dulicate |
|
|
MTI |
Message Type Indicator |
Parametr rozlišující zprávu odesílanou a přijímanou: 00 – přijatá 01 – odeslaná zpráva |
|
délka |
Typ čísla |
BCD číslice |
|
|
1. oktet |
2. oktet |
0-8 oktetů |
|
|
Příklad: |
07 |
91 |
947101670000 |
Příklad – pro číslo +49 171 0760000
Je výsledný formát 0791947101670000
Pozor! Pokud uvedete délku NULA, použije se středisko zpráv nastavené příkazem zAT+CSCA
Typ PDU - Protocol Data Unit Type (PDU Type)
Popis oktetu Typ PDU – jak pro odeslanou, tak pro přijatou zprávu:
|
RP |
0 |
Reply Path – odesilatel není v PDU zprávě |
|
|
1 |
Reply Path – odesilatel je v PDU zprávě |
||
|
UDHI |
0 |
Pole UD obsahuje pouze krátkou textovou zprávu |
|
|
1 |
Začátek pole UD obsahuje hlavičku |
||
|
SRI (Nastavuje SMSC) |
0 |
Status report – nebude poslán SME |
|
|
1 |
Status report – bude poslán SME |
||
|
SRR |
0 |
Status report není vyžadován |
|
|
1 |
Status report je vyžadován |
||
|
VPF |
Bit 4 |
Bit 3 |
|
|
0 |
0 |
Pole VP není |
|
|
0 |
1 |
Rezervováno |
|
|
1 |
0 |
Pole VP je zadáno jako relativní čas |
|
|
1 |
1 |
Pole VP je zadáno jako 7 bajtové (absolutní čas) |
|
|
MMS |
Nastaveno pouze SMSC |
||
|
0 |
V SMSC jsou další zprávy |
||
|
1 |
Ve středisku nečekají další zprávy |
||
|
RD |
0 |
Říká SMSC (středisku) aby akceptovala odeslanou zprávu uloženou ve středisku se stejným MR, DA odeslanou ze stejné adresy OA |
|
|
1 |
….aby zahodila takovou zprávu, je-li stále uložena ve středisku |
||
|
MTI |
Bit 1 |
Bit 0 |
Typ zprávy |
|
0 |
0 |
Doručená zpráva (SMSC->MS) |
|
|
0 |
0 |
Doručenka (MS -> SMSC) |
|
|
Nastaveno mobilem |
0 |
1 |
Odeslaná zpráva (MS -> SMSC) |
|
Nastaveno mobilem |
0 |
1 |
Odeslání doručenky (SMSC -> MS) |
|
Nastaveno mobilem |
1 |
0 |
Doručenka (SMSC -> MS) |
|
Nastaveno mobilem |
1 |
0 |
SMS příkaz (MS -> SMSC) |
|
Nastaveno mobilem |
1 |
1 |
Rezervováno |
Tučně jsou položky podporované mobilem.
Pozor! Ne každý typ PDU je podporován střediskem!!!
V mobilu je normálně toto číslo generováno, vy musíte však toto číslo nastavit. Třeba na 00H
Zdrojová adresa a cílová adresa (OA, DA)

Příklad:
Pokud máme národní číslo 1234567, musí adresa v PDU formátu vypadat takto:
0781214365F7
Velikost: 1 Byte
|
00H |
PDU má být interpretována jako krátká textová zpráva |
|
41H |
Nahraď textovou zprávu Typ1 |
|
42H |
Nahraď textovou zprávu Typ2 |
|
… |
… |
|
47H |
Nahraď textovou zprávu Typ7 |
Jestliže byte je nastaven na jednu ze sedmi „Nahraď textovou zprávu TypX“ , potom MS zkontroluje přítomnost zprávy, která má stejné SC, OA a mající stejné PID a nahradí tuto zprávu zprávou novou. Pokud se nenalezla zpráva k nahrazení, uloží se zpráva jako každá jiná (s PID = 00H)
Pozor! Není zaručeno, že středisko zpráv (SMSC) podporuje všechny PID kódy.
Kódování vlastní zprávy - Data Coding Scheme DCS
|
Bity |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
Skupina kódování |
0 |
X |
X |
X |
||||
Kódování určuje kódování uživatelských dat UD a případně i typ (třídu) zprávy:
|
Skupina kódování: Bity 7..4 |
Bity 3..0 |
|
0000 |
Indikace znaků – nespecifiované zpracování v MS 0000 – Default znakové kódování (7mi bitové kódování) 0001 – 1111 Rezervováno |
|
0001-1110 |
Rezervované kódovací skupiny |
|
1111 |
Kódování/třída zprávy Bit 3 je rezervovaný, nastavený na 0 Bit 2 (kódování zprávy)
Bity 1 a 0 0 0 – Třída 0 – zobrazení zprávy na displej 0 1 – Třída 1 – ME (Mobile equipment) – specifické 1 0 – Třída 2 – SIM specifická zpráva 1 1 – Třída 3 – TE (Terminate equipment) specifické |
Běžné kódování UD je 7bitové s kódovou stránkou uvedenou v příloze. Je-li použito toto kódování, je 8 znaků uloženo v 7 oktetech (bajtech)a zpráva tak může obsahovat 160 znaků (místo 140 v 8bitovém kódování).
V 8bitovém kódování můžeme použít klasickou ASCII tabulku.
Třída 0 – zobrazení na displej – textová zpráva se zobrazí přímo na displeji
Třída 1 až třída 3 – krátká textová zpráva je uložena ve více zařízeních – ME, SIM a TE (Terminal Equipment).
Pokud je podporována třída 2 a vyberete třídu 1 nebo 3, je zpráva obsloužena stejně jako třída 2.
Pozor! – Je doporučeno používat buď třídu 2 nebo kódování „0000“ (bity 7..4)
Časové razítko SCTS – Service Center Time Stamp SCTS
|
1.oktet |
2.oktet |
3.oktet |
4.oktet |
5.oktet |
6.oktet |
7.oktet |
|||||||
|
Rok |
Měsíc |
Den |
Hodina |
Minuta |
Sekunda |
Čas. Zóna |
|||||||
|
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
|
7 |
9 |
5 |
0 |
1 |
2 |
3 |
1 |
5 |
4 |
3 |
3 |
0 |
0 |
Kurzívou je příklad, který znamená: 21.května 1997 13:45:33
Platnost zprávy – Validity Period VP
Platnost zprávy – udává, jak dlouho musí SMSC (středisko zpráv) zaručit existenci zprávy ve středisku, předtím než se doručí adresátovi.
Platnost zprávy je určena buď jako celé číslo, nebo 7bajtový řetězec a to podle VPF (viz bajt PDU typ). V prvním případě je to číslo, udávající periodu od okamžiku, kdy SCTS přijme zprávu. Ve druhém případě se VP skládá ze sedmi bajtů vyjadřující absolutní čas.
1 bajt – např. AAH (AA hexa, taky 0xAA :-) – jsou čtyři dny
Tabulka udávající význam jednotlivých hodnot:
|
Hodnota VP |
Platnost zprávy |
|
0-143 |
(VP+1)*5 minut (tj. 5-ti minutové intervaly do 12 hodin) |
|
144-167 |
12 hodin + ((VP-143)*30 minut) |
|
168-196 |
(VP-166)*1 den |
|
197-255 |
(VP-192)* 1 týden |
|
Rok |
Měsíc |
Den |
Hodina |
Minuta |
Sekunda |
Čas. Zóna |
|||||||
|
7 |
9 |
5 |
0 |
1 |
2 |
3 |
1 |
5 |
4 |
3 |
3 |
0 |
0 |
Délka zprávy a uživatelská data - User Data Length UDL and User Data UD
Příklad:
|
UDL |
UD |
||||
|
05 |
E8 |
32 |
9B |
FD |
06 |
Znamená hallo – viz příklady níže.
Pole UDL (jednobajtové číslo) udává počet znkaů obsažených v UD.
Nastavení Střediska zpráv:
at+csca="+420608005681" - středisko zpráv – zde Oskar
OK
1. příklad:
at+cmgs=140 ENTER - ”text zprávy”, 140 je maximální délka (v bajtech) následující PDU zprávy:
> 0011000781214365F70000AA05E8329BFD06 - napište PDU zprávu a ukončete znakem ”ctrl Z”
+CMGS: 0
OK
at+cpms? - Jsou nějaké zprávy na SIM kartě?
+CPMS: "SM" , 1 , 7 , "SM" , 1 , 7 - na SIMce je 1 uložená PDU zpráva a můžeme jich uložit maximálně 7
OK
at+cmgr=1 - přečteme zprávu z pozice č. 1
+CMGR: 0 ,, 24
00040C9194718215219200006930824161840005E8329BFD06
OK
2. Příklad:
at+cmgw=140 - uložíme zprávu na SIM
> 079194710167000011000781214365F700F6AA0568656C6C6F - vložíme PDU zprávy a ukončíme znakem ”ctrl Z”
+CMGW: 2
OK
at+cmgr=2 - přečteme zprávu z 2. pozice
+CMGR: 2 ,, 17
0011000781214365F700F6AA0568656C6C6F - toto je PDU z 2. pozice
OK
at+cmss=2 - pošli zprávu z 2. Pozice
+CMSS: 3
OK
Tabulka znaků – 7bitové kódování

MS Mobile Station
SME Short Message Entity
SMSC Short Message Service Center
MMI Man Machine Interface
PDUs Protocol Data Units
SM-AL Short Message Aplication Layer
SM-TL Short Message Transport Layer
SM-RL Short Message Relay Layer
SM-LL Short Message Link Layer
PDU Type Protocol Data Unit Type
MR Message Reference
OA Originator Adress
DA Destination Adress
PID Protocol Identifier
DCS Data Coding Scheme
SCTS Service Center Time Stamp
VP Validity Period
UDL User Data Length
UD User Data
RP Reply Path.
UDHI User Data Header Indicator
SRI Status Report Indication
SRR Status Report Request
VPF Validity Period Format
MMS More Messages to Send
RD Reject Duplicate
MTI Message Type Indicator
ME Mobile Equipment
TE Terminal Equipment
SIM Subscriber Identity Modul
pokud je hodnota pole:
(*
poznamka: UD8Bit je typu boolean true znamena 8bit kodovani
false znamena 7bit kodovani
funkce jsou vytrzeny z meho objektu a poopraveny, ale mely by fungovat.
nevim, jestli je to elegantni reseni, ale nevedel jsem jak je 7bit kodovani delano,
tak jsem delal pokusy az to telefon sezral. V tom stadiu jsem s tim prestal (proc menit
neco co uz funguje, i kdyz to neni napsany treba nejlip a srozumitelne)
function EncodeUD( UD:string ): string; //vytvori UD pro PDU
function DecodeUD(const S: string):string; //z UD ve formatu PDU precte zakodovany text
neni zde implemenmtovana tabulka znaku pro 7bit kodovani (nektere znaky maji jiny kod nez v ASCII)
*)
function HexToInt64( Str:String ):Int64;
var
i:integer;
begin
Result:=0;
if Length(Str)=0 then exit;
i:=1;
repeat
Result:=Result*16;
case Str[i] of
'0'..'9': inc( Result, ord(Str[i]) - ord('0') );
'A'..'F': inc( Result, ord(Str[i]) - ord('A') + 10 );
'a'..'f': inc( Result, ord(Str[i]) - ord('a') + 10 );
else raise Exception.create( 'Unknown hex character' );
end;
inc(i);
until i>length(Str);
end;
function HexToWord( Str:String ):Word;
begin
result:=HexToCardinal( Str ) and $FFFF;
end;
function DecodeUD(const S: string):string;
var
chNr, ch, prevch, tgtCh:Byte;
pd, pom:string;
i:Integer;
begin
try
result:='';
i:=1;
prevch:=0;
chNr:=0; //kolikaty znak cteme - dulezite pro 7bit
while i<Length(S) do begin
pd:=Copy( S, i, 2 );
Inc( i, 2 );
ch:=HexToWord( pd ) and $FF;
if not UD8Bit then begin
tgtCh:=ch and ($FF shr (chNr+1));
tgtCh:=(tgtCh shl chNr) or (prevCh shr (8-chNr));
end
else tgtCh:=ch;
chNr:=chNr + 1;
result:=result+chr(tgtCh);
prevCh:=ch;
if not(UD8Bit) and (chNr=7) then begin
result:=result+chr(Ch shr 1);
chNr:=0;
prevCh:=0;
end;
end;
except
end;
end;
function EncodeUD( UD:string ): string;
var
i:Integer;
buff:array [0..255] of byte;
ch:byte;
chNr:byte;
totChrNr:byte;
begin
result:='';
if not UD8Bit then begin
chNr:=0; //kolikaty znak cteme - dulezite pro 7bit
fillChar( buff[0], 256, 0 );
totChrNr:=1;
i:=1;
while i<=Length( UD ) do begin
ch:=ord(UD[i]);
if chNr=0 then begin
buff[totChrNr]:=ch and $7F;
inc( chNr );
end
else begin
buff[totChrNr-1]:=(buff[totChrNr-1] and ($FF shr chNr)) or ( (ch and setBits( 0, chNr-1 )) shl (8-chNr ));
buff[totChrNr]:=ch and setBits( chNr, 6 ) shr chNr;
inc( chNr );
if (chNr=7) then begin
chNr:=0;
if i<Length( UD ) then begin
inc( i );
buff[totChrNr]:=(buff[totChrNr] and 1) or (ord(UD[i]) shl 1 );
end;
end;
end;
inc( totChrNr );
inc( i );
end; //while i
for i:=1 to totchrNr-1 do
result:=result+IntToHex( buff[i], 2 );
end
else
for i:=1 to Length( UD ) do
result:=result+IntToHex( ord(UD[i]), 2 );
end;