Č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 *

Čtení SMS zpráv

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

Úvod

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

 

Popis jednotlivých částí

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

 

Popis jednotlivých polí

Středisko zpráv (SCA pole)

 

 

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!!!

 

Message reference (MR)

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

 

Protocol Identifier PID

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)

  • 0 – 7bitové UD
  • 1 – 8Bitové UD

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.

VPF = 10 (relativní č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

VPF = 11 (absolutní čas)

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.

 

PDU příklady:

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í

Zkratky

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

 

Aplikační poznámky

Kódování PDU

pokud je hodnota pole:

 

Zdrojový kód – příklad

 

 

(*

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;