Nedalo mi to, a chtěl jsem posílat SMS pomocí jednočipu nejen z uložených zpráv v seznamu mobilního telefonu, ale také tak, aby SMS zkonstruoval jednočip. Výhodou tohoto odesílání je, že nejste vázáni pamětí telefonu (Siemens C35i = 10 SMS). Hledáním na internetu jsem si nepomohl, jak jsem zjistil, nikdo se tím asi nezabýval, anebo (spíš) to nebylo uvolněno. Tak to zbylo zase na mne . Je spousta programů na generování PDU, ale pro PC a to je jaksi na jednočip nepřenositelné.

     SMS je v telefonu uložena ve formátu PDU (pokud nevíte co to je, naleznete popis na jiné stránce). Jestliže chceme odeslat SMS zprávu uloženou v telefonu, není to vůbec žádný problém. Použijeme příkaz CMSS s parametrem, v kterém je číslo pozice SMS na SIM kartě telefonu. Jenže já jsem chtěl SMS upravovat nebo celou vytvořit v jednočipu. Pokud ji chceme zvnějšku odeslat, musíme ji do formátu PDU zkonvertovat (čili zakódovat). POZOR - PDU odchozí a příchozí zprávy jsou odlišné v několika parametrech ! K vytvoření takové rutiny si vezmeme na pomoc PDU Spy, TELIX,COM Lite32, MT Siemens C35i, MP Lab pro PIC, Kompaktní převodník, dále také hlavu a něco volného času. A všechno to nějak dáme dohromady... NE, ne, takhle by to nešlo. Vezmu to popořadě:

Můj cíl

  vytvořit funkční rutinu, sestavující PDU z tel. čísla zadaného v tabulce zdrojového souboru a textu SMS zadaného v téže tabulce za telefonním číslem.
  vytvořit funkční rutinu, sestavující PDU z tel. čísla vyčteného ze SIM mobilního telefonu (pozice předávaná parametrem v RAM mikrokontroléru) a z textu několika SMS uložených v tabulce (výběr SMS taktéž parametrem v RAM)
  vytvořit funkční rutinu, sestavující PDU z tel. čísla vyčteného ze SIM mobilního telefonu (pozice předávaná parametrem v RAM mikrokontroléru) a z textu vytvořeného procesorem a uloženého v RAM paměti (můžete si takto odeslat např. vypočtenou teplotu)


Možná Vám to připadá samoúčelné, prosím, ale pokud programujete, můžete si rutiny upravit pro svoji aplikaci, vše jsem se snažil psát přehledně, a vše je několikrát otestováno.


     Pro vůbec první informaci, co se posílá do telefonu při komunikaci pomocí PDU jsem připojil MT (mobilní telefon) přes kabel k PC a spustil PDU Spy (vynikající program pro generování a dekódování PDU formátu). K němu jsem spustil program pro sledování komunikace na sériovém portu (COM Lite32). V PDU Spy jsem vytvořil experimentální zprávu s textem "DH servis" a zkusil ji zaslat pomocí tohoto programu do mobilu resp. na druhý telefon. Zpráva v pořádku došla, a v okně programu COM Lite 32 jsem měl zachycenu kompletní komunikaci PDU Spy s telefonem, a co bylo hlavní, vlastní formát řetězce PDU.
Podle některých pramenů musí mít odchozí SMS (tedy její PDU) spoustu parametrů, jako platnost zprávy, požadavek informace o doručení ap. Pro funkci odeslání SMS ale tyto parametry (jak jsem zjistil z odeslané SMS) nejsou nezbytné, a proto jsem je vynechal. Hlavním parametrem je číslo SMS centra, které je možno zaslat buď v PDU formátu, ale je možné jej také mít nastavené v telefonu a využít jej tam, místo zbytečného kombinování PDU formátu. Pro normální odesílání SMS z mobilu stejně musíte mít toto číslo zadáno.
     Na obrázku níže vidíte vygenerovaný formát PDU programem PDU Spy. Text je, jak jsem již předeslal výše "DH servis" a telefonní číslo pro příklad +420777123456.
00 0100 0C 91 247077214365 000009 4424685E96DBD373

00 Úvodní 2 byte hlavičky - pozor, nezapočítávají se do celkové délky rámce PDU (viz níže)
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í)
24 70 77 21 43 65 Číslo příjemce (420 777 123 456 - fixní)
000009 Délka textu SMS - ještě nezkonvertovaného, zadáno v HEXa formátu (např. 11 = 17 znaků !)
4424685E96DBD373 Zbývající část je již vlastní zpráva v PDU.

Vlastní kódování PDU si rozdělíme na dílčí subrutiny.

      Jako první začneme tím, že pro odeslání SMS tímto formátem pošleme telefonu příkaz AT+CMGS= xx. XX je proměnný parametr, který musíme vypočítat. Je to délka celého rámce PDU bez úvodních dvou nul, zadaná v BCD formátu (desítkově). Takže pro náš příklad platí délka 21, čili pošleme AT+CMGS=21 <CR>. Telefon odpoví znakem > a čeká na zadávání rámce PDU. Výpočet 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), 1 znak formát tel. čísla (91), 6 znaků vlastní tel. číslo (247077214365) , 3 znaky délka textu SMS (000009)). Tyto parametry se sice mohou měnit, ale jejich délka zůstává konstantní.
      Nyní poněkud odbočím. Aby se ušetřilo místo v RAM, je prováděno kódování textu SMS do PDU dynamicky a výsledek je ihned posílán do telefonu, aby se do stejných proměnných mohla načítat další data. Protože se ale tato činnost vykonává až při zasílání PDU, není předem známa délka tohoto rámce, my ji však znát potřebujeme, abychom ji mohli zadat do příkazu CMGS.
     Výpočet je tedy proveden tak, že spočítáme počet dat SMS (tedy textu), pro "DH servis" je to 9. PDU formát vždy z 8 byte vytvoří 7 (resp. osm byte "rozdělí" do sedmi, viz níže). To znamená, že na každých dokončených 8 znaků textu jeden odečteme, a závěrečná data, která nedají dohromady 8 znaků přičteme. Pro DH servis tedy délka bude 8. Je to pro vysvětlení dosti krátký text, proto ještě jednou na delším příkladu. Text SMS bude třeba:

Elektrina osklive tluce

Elektrina osklive tluce
8 znaků8 znaků7 znaků

Počet znaků zprávy je 23 (8+8+7). Délka rámce tedy bude (8-1)+(8-1)+7= 21. Jasné ?
      Tak a teď jak to spočítat v jednočipu. Znám index začátku tabulky s textem SMS. Takže jej načtu, a začnu hledat konec ("nárazník" - znak 0FFH). Při každém přechodu na další položku zvětším o 1 proměnnou, ve které nakonec bude počet znaků textu. Tohle číslo využiju pro zadání počtu znaků do rámce (viz výše hnědé 3 byte před PDU SMSky). Když dojdu na konec a znám počet znaků, zjistím, kolik "osmic" (oktetů) tabulka obsahuje. Prostě ji vydělím osmi, a protože u PICu nemám instrukci DIV, použiju staré známé rotace doprava, což je v podstatě dělení dvěmi. Rotuji 3x, tedy dělím 8. Výsledek je počet oktetů, to znamená, že tolik znaků musím z celkové délky odečíst. No a mám budoucí délku PDU formátu textu SMS - pozor, ale ještě ne celé zprávy. Matematicky tedy 23-(23/8=2 celočíselně)=21.
     Pro získání již konečného počtu ještě musíme přičíst k PDU délce textu zbytek (délku hlavičky,tel.čísla atd.) což je 13. Výsledná délka celého řetězce PDU je tedy 21+13=34. Takže telefonu pošlu příkaz AT+CMGS=34 <CR>. POZOR, toto číslo se MT zasílá ve formátu BCD, takže po výpočtech se v rutině ještě převádí.


Takže délku bychom měli a nyní vlastní zakódování dat.

      Telefonní číslo v podstatě není kódováno, jen jsou zpřeházeny pozice cifer podle obrázku. Subrutina tedy jen přesune telefonní číslo z tabulky (nebo SIM) a pak posílá do telefonu cifry ve správném pořadí. Tato činnost myslím nezaslouží bližšího vysvětlování. O to více prostoru bych rád věnoval principu kódování textu SMS do formátu PDU.

Princip kódování textových dat SMS do rámce PDU

Vraťme se pro příklad opět k textu SMS "DH servis". Každé písmeno je reprezentováno nějakým číselným kódem dle standardu ASCII. Protože se používají písmena bez diakritiky (samozřejmě o číslech nemluvě) zjistíme, že dle tabulky ASCII kódů vystačíme se 128 kombinacemi znaků, to znamená, že v binárním vyjádření bude číslo vždy v nejvyšším bitu obsahovat 0. Data písmen jsou tedy v podstatě sedmibitová. Toho bylo využito při kódování PDU. Tabulka obsahuje text v prvním řádku, v druhém jsou reprezentace písmen dle ASCII v dekadické soustavě, v třetím jsou v binární soustavě. Výsledek převodu je vidět ve čtvrtém a pátém řádku. Princip kódování již byl popsán na stránce AT příkazů, ale protože zde jde o opačný postup, raději to proberu znovu.

Text SMS D H mezera (space) s e r v i s
ASCII (decimálně) 68 72 32 115 101 114 118 105 115
ASCII (binárně)
x1000100
x1001000
x0100000
x1110011
x1100101
x1110010
x1110110
x1101001
x1110011
PDU (binárně)
01000100
00100100
01101000
01011110
10010110
11011011
11010011
 
01110011
PDU (hexa) 44H 24H 68H 5EH 96H DBH D3H 0 73H

     Osmý (nejvyšší) bit je vždy nula a zde v ASCII není využit. Protože není pro nás zatím významný, je označen x. Pro úsporné využití dat se ale tento bit obsazuje právě kódováním textu SMS do formátu PDU. Postup kódování je relativně jednoduchý: Z druhého byte (písmeno "H") vezmeme nejnižší bit a přesuneme jej na nejvyšší pozici prvního byte (písmeno "D") - čili na místo 8 bitu. V druhém byte se tím pádem uvolnili 2 bity (jeden jsme přesunuli a jeden byl nevýznamný). Celý byte posuneme doprava a na nejvyšší dvě pozice (bit 7 a 8) přesuneme nejnižší dva bity z dalšího byte (mezera - "SPACE"). Takhle postupujeme až k osmému byte, který přesuneme celý. A dál se celé vše opakuje.

Uvedený postup vypadá jednoduše, ale pro naprogramování to již tak jednoduché nebylo. V rutinách se PDU vytváří kvůli úspoře RAM postupně, právě vždy po 8 bytech. Nejprve se načte 8 byte textu SMS, a všechny se rotují doleva, kromě osmého byte. Pokud bychom to totiž neudělali, zapisoval by se další bit na pozici 9, my potřebujeme 8. Nyní rotujeme doprava osmý byte (písmeno "i"). Tím se přesune nejnižší bit do CY. Pak rotujeme opět doprava sedmý byte (písmeno "v"), tak se CY nasune na nejvyšší pozici. A znovu rotujeme 8. byte, pak 7. a pak 6. A znovu 8.,7.,6.,5., a tak dál, pokaždé jeden byte přidáme, až se dostaneme k rotaci 8.,7.,6.,5.,4.,3.,2.,1., byte a tím skončíme. Tím máme PDU osmi byte. Protože se osmý byte "rozdělil" mezi ostatní, bude se do telefonu posílat jen 7 byte. Odešleme je, a vrátíme se zpět ke kódování dalších 8 byte textu SMS do PDU, a opět odešleme. Takto se odešle celá SMS (resp. její PDU formát) a k odeslání se na závěr vyšle znak <CTRL Z>. Tím je SMS odeslána z telefonu do SMS centra ke zpracování. Více naleznete v detailním komentáři u každé rutiny v archivu ke stažení. Popis důležitých AT příkazů naleznete na jiné stránce tohoto WEBu. Anglický dokument popisující AT příkazy týkající se SMS a práce s nimy naleznete také v sekci dokumentace.


Ke stažení jsou tyto soubory:

Vše je pro osobní potřebu zdarma, úpravy kódu na vlastní nebezpečí, pokud s využitím těchto rutin postavíte nějakou zajímavou konstrukci, budu rád, jestliže mi dáte vědět.


Velikost 23 kByte Moje 4 různé rutiny pro kódování SMS do formátu PDU mikrokontrolérem PIC - zdrojové soubory ! Popis jednotlivých rutin naleznete v archivu v souboru "CTETE PRVNI - POPIS.txt"


Pokud budou nějaké nejasnosti ohledně rutin nebo konstrukce PDU formátu, napište mi, bude-li to v mých silách (popř. vědomostech), vyřešíme to.


Vytisknout stránku
Zpátky Zpátky
© DH servis 2002 -