Obsluha SMS zpráv standardním GSM modemem
Posílání SMS GSM modemem (TELIT GE863)
Na základě neustálé potřeby jednodušší komunikace lze pomocí SMS komunikovat se strojem, provádět dozor vzdáleného systému a jednoduché povely a příkazy. V praxi se tato metoda často používá a lze ji tedy využít i pro naše účely. Pokud máme ve svém zařízení mikroprocesor nebo programovatelný automat s volnou sériovou linkou, tak stačí jen připojit GSM modem a přidat jeho obsluhu do uživatelského programu. Nesmíme zapomínat na úpravu úrovní signálů sériové linky. U modemu TELIT je to logika na úrovni 3V a některé mikroprocesory pracují s 5V napájením. Obsluha SMS pomocí AT příkazů není náročná, implementace SMS je možná i s relativně malým mikroprocesorem.
GSM modem se ovládá, podobně jako standardní telefonní modemy, pomocí AT příkazů. Protože však mají proti telefonním modemům spoustu dalších funkcí, tak musela být tato sada příkazů výrazně obohacena. Tyto příkazy mají na začátku AT+C (podle Cellular). Vlastnosti a schopnosti GSM modemů se však stále vyvíjejí a proto výrobci mobilních zařízení přidávají vlastní příkazy, které nejsou zahrnuty do standardů. Celý výčet AT příkazů lze dohledat v datasheetech výrobce.
Režimy obsluhy SMS:
Pro obsluhu SMS se využívají dva různé režimy, textový a PDU (Protocol Data Unit). Většina moderních GSM modemů umožňuje využívat oba. Textový režim je na obsluhu jednodušší, má však několik nevýhod, které PDU celkem snadno vyřeší. V tomto režimu je SMS reprezentována jako „balík“ dat o pevně definovaném formátu, který není na první pohled příliš čitelný a jeho implementace může ze začátku přinášet problémy.
Režim práce s SMS se volí příkaze AT+CMGF (message format).
PDU režim zapneme příkazem AT+CMGF=0, textový zapneme AT+CMGF=1.
Aktuálně nastavený režim zkontrolujeme příkazem AT+CMGF?
a režimy, které je modem schopen využívat zjistíme pomocí AT+CMGF=?.
Dále budeme popisovat textový režim, můžeme si ho tedy zapnout příkazem AT+CMGF=1.
Příklad přijaté zprávy v textovém režimu:
+CMGR: “REC READ”,”+420603******”,,”03/05/31,23:23:17+08″Dobry den!
Příklad přijaté SMS v PDU režimu (stejné jako výše):
+CMGR: 1,,28 0791246030500200240C91246030******0000305013323271800AC4B7589E0791CBEE10
pozn. telefonní číslo odesilatele bylo nahrazeno hvězdičkami.
PDU režim je tedy na první pohled značně nečitelný. Ze zprávy v PDU režimu je možné celkem snadno rozluštit telefonní čísla, od páté pozice je uloženo číslo SMS centra, přes které byla zpráva odeslána, tj. +420603052000 (číslice jsou vždy po dvou prohozeny) a o něco dále je adresa odesílatele. Text zprávy je však z úsporných důvodů uložen pomocí sedmibitového kódováni, takže je pro člověka nesrozumitelný. Tento režim má však jednu zásadní výhodu. Má stanovenou délku zprávy, můžeme tedy bez problémů určit, kde opravdu zpráva končí. Navíc se v jejím textu nemůže objevit sekvence OK, která obvykle znamená úspěšné ukončení AT příkazu a některým zařízením, která obsluhují GSM modemy v textovém režimu, působí problémy. Pro začátečníky je však textový režim podstatně jednodušší a srozumitelnější.
Znakové sady:
AT+CSCS => znaková sada
Problémy při implementaci také mohou vzniknout, protože GSM modemy standardně nepoužívají ASCII znakovou sadu! Standardní znakovou sadou je tzv. GSM default alphabet, definovaná v GSM 03.38. Tato obsahuje 127 znaků. Jedním z největších problémů však je, že znak „@“ má v této znakové sadě hodnotu 0. Pro programy psané v C to může mít katastrofální důsledky. Také, pokud si zobrazíte přijatou SMS např. v Hyperterminálu, tak se znak @ nezobrazí. Navíc mohou vzniknout problémy při softwarovém řízení toku, protože znaky XON a XOFF budou vyhodnoceny jako normální znaky. Trochu si můžeme pomoct, pokud nastavíme znakovou sadu UCS2. Pak budou znaky reprezentovány jako šestnáctibitové číslice v hexadecimálním formátu. Vyhneme se sice předchozím problémům, ale poněkud si zhoršíme čitelnost zpráv. V této znakové sadě bude čtení zprávy vypadat např. takto:
+CMGR: “REC READ”, “002B003400320030003600300033003200360033003800370034”,,”03/06/01,22:54:43+08″005A006B006F00750073006B 00610040006100620063OK
Znakové sady implementované v GSM modemu zjistíme příkazem AT+CSCS=?
aktuálně nastavenou příkazem AT+CSCS? a zvolenou nastavíme např. AT+CSCS=“GSM“, nebo AT+CSCS=“UCS2“. Tím jsme se některým problémům vyhnuli, ale lepším řešením bude využití PDU módu, kde veškeré znaky v SMS jsou kódována jako číselná data.
Uvedené příklady si lze vyzkoušet pomocí programu Hyperterminál dodávaný se systémem Microsoft Windows. Obvyklé parametry komunikace jsou: rychlost 9,6kBd až 115,2kBd, 8 datových bitů, žádná parita, 1 stop bit. Většina modemů obsahuje automatické nastavení rychlosti komunikace (autobauding), rychlost si tedy můžeme zvolit libovolnou (v podporovaném rozsahu). Tato funkce však může být vypnuta. (TELIT ji má defaultně zapnutou)
Zadání kódu PIN:
Stav požadavku na PIN kód karty zjistíme příkazem AT+CPIN?. Modem odpoví buď +CPIN: READY OK, nebo +CPIN: SIM PIN OK, pokud potřebuje zadat PIN kód. Pokud jsme více než třikrát zadali špatný PIN, tak se karta zablokuje, bude vyžadovat kód PUK a modem bude hlásit +CPIN: SIM PUK OK. Tento kód však doporučuji zadávat ručně pomocí mobilního telefonu, protože pokud by se to z důvodů nějaké chyby jedenáctkrát nepovedlo, tak se karta zablokuje úplně.
PIN kód zadáme příkazem AT+CPIN=“abcd“, kde abcd je PIN kód v „string type value“. Modem po nějaké době nahlásí OK, pokud jsme ho zadali správně, nebo ERROR, pokud jsme zadali špatný kód.
Registrace do sítě:
Před začátkem komunikace musíme zajistit, aby byl modem správně zaregistrován v síti GSM. Pokud jsme právě zadali PIN kód, tak chvilku trvá, než se modem do sítě zaregistruje. Jinak také může registraci ztratit např. z důvodu špatného signálu. Stav registrace v síti zjistíme příkazem AT+CREG?. Modem odpoví +CREG: x,y OK, kde x je 0, pokud je zakázáno automatické hlášení změny registrace (nebudeme se s ním zde zabývat, mělo by být popsáno v dokumentaci modemu) a y je stav registrace. Nabývá těchto hodnot: 0, pokud modem není registrován a nehledá nového operátora (v tomto stavu se pravděpodobně nezaregistruje), 1 pokud je zaregistrován v domácí síti, 2 pokud probíhá registrace, 3, pokud se registrace nepodařila, 4 pro neznámý stav a 5 pro roaming. Pro začátek nám stačí sledovat stavy 1, 2 a 3, ostatní se příliš často nevyskytují.
Pokud nás zajímá ještě kvalita signálu, zadáme AT+CSQ. Modem odpoví +CSQ: aa,bb OK, kde aa je úroveň přijmu a nabývá hodnot 0 (nejhorší) až 31 (nejlepší), nebo 99 pokud nemohla být změřena. Další parametr, bb je četnost bitových chyb. Může být zjištěna pouze při hovoru, v ostatních případech vykazuje hodnotu 0 nebo 99 podle SIM karty. Pokud mohla být změřena, nabývá hodnot 0 až 7. Její další popis je v GSM 05.08, sekci 8.2.4, pro většinu aplikací však není nutno se tímto parametrem zabývat.
V tomto stavu by GSM modem měl být správně nastaven a připraven. Můžeme tedy přejít k odesílání přijmu zpráv.
Odesílání v textovém módu:
AT+CMGF=1 text mode SMS; odpověď: OK
AT+CREG? Správná odpověď : +CREG: 0,1 OK
AT+CSCA? Správná odpověď : +CSCA:”+420608005681″,145
AT+CMGS=+420777227146 send SMS na číslo : 777 227 146 v mezinárodním formátu
> Text zprávy ukončený CTRL Z Odpověď: +CMGS: 46
Návrat z posílání SMS je ESC
Odesílání v PDU módu:
PDU mode je nastaven příkazem AT+CMGF=0 (default)
AT+CMGS=22 (délka zprávy decimálně – předem vypočítaná *) > 0001000C9124707722176400000A000000000000000000 CTRL Z +CMGS: 45
00 | Úvodní 2 byte hlavičky – pozor, nezapočítávají se do celkové délky rámce PDU |
0100 | Vlastní hlavička (dle čísla různé funkce, nebudu rozvádět) |
0C | Délka telefonního čísla v hexa (zde 12 číslic) |
91 | Formát telefonního čísla (zde mezinárodní) – (145) |
247077221764 | Číslo příjemce (420 777 123 456 – fixní) |
00000A | Délka textu SMS- ještě nezkonvertovaného, zadáno v HEXa formátu (např. 11 = 17 znaků !) |
000000000000000000 | Zbývající část je již vlastní zpráva v PDU. |
* Výpočet délky zprávy v PDU: Chceme posílat např. data v HEX formátu. Pošleme příkaz AT+CMGS=nn Terminál odpoví: > a čeká na zapsání zprávy (viz výše žlutě zvýrazněná část), kterou ukončíme CTRL+Z Výpočet nn je řešen tak, že je spočtena délka uživatelských dat textu SMS a je přičteno číslo 13 (2 znaky hlavička (0100), 1 znak délka tel. čísla (0C) – ve formátu HEX, 1 znak formát tel. čísla (91), 6 znaků vlastní tel. číslo (247077214365)- v BCD kódu s prohozenými číslicemi v byte , 3 znaky délka textu SMS(00000A)). Tyto parametry se sice mohou měnit, ale jejich délka zůstává konstantní. Délka uživatelských dat se spočítají tak, že z každé osmice znaků odečteme 1 (důsledek komprese). Příklad: chceme poslat 68 znaků …. 68/8=8 (celé číslo) … odečteme 68-8=60 a přičteme 13 (hlavička) = 73 Číslo nn, které zadáváme v příkazu AT+CMGS=73 Jelikož parametr AT+CMGS= <length> se může zadat v rozmezí 7 …164, 13 byte je pro hlavičku SMS a největší počet přenesených uživatelských byte v HEX formátu je 151. (164-13=151).
Př. 2:
AT+CMGF=0
AT+CMGS=33
> 0001000C9124707722176400001600ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
+CMGS : 51
Chybová hlášení: (Numeric Format Meaning)
0…127 GSM 04.11 Annex E-2 values
128…255 GSM 03.40 sub clause 9.2.3.22 values
300 ME failure
301 SMS service of ME reserved
302 operation not allowed
303 operation not supported
304 invalid PDU mode parameter
305 invalid text mode parameter
310 SIM not inserted
311 SIM PIN required
312 PH-SIM PIN required
313 SIM failure
314 SIM busy
315 SIM wrong
316 SIM PUK required
317 SIM PIN2 required
318 SIM PUK2 required
320 memory failure
321 invalid memory index
322 memory full
330 SMSC address unknown
331 no network service
332 network time-out
500 unknown error
Odkazy:
http://www.rdc.cz/en/projects/past/?sid=1&aid=74&PHPSESSID=shkcdsjn