Mobilní telefony - rady programátorům
Následující text by Vám měl pomoci, pokud chcete vytvořit podobný program jako já, ale nevíte jak.
Ovládání COM portu v Delphi:
Já jsem použil knihovnu Port.dll (
stáhněte si ji).
Knihovnu musíte připojit ke svému programu. To se dělá tak, že do části INTERFACE napíšete:
function OpenCOM(S: PChar): integer; stdcall; external 'Port.dll';
function ReadByte: Integer; stdcall; external 'Port.dll';
procedure SendByte(d: word); stdcall; external 'Port.dll';
Funkce OpenCOM slouží k otevření sériového portu. Ericsson T10s má parametry přenosu dat: 9600 baudů, 8 datových bitů, jeden stopbit, žádný paritní bit. Pokud je telefon připojený k portu COM1, použijete funkci takto: OpenCOM(PChar('COM1:9600,N,8,1'));
Funkce ReadByte čte byte z portu. Pokud telefon žádný byte neposlal, vrátí funkce ReadByte hodnotu -1. Příchozí data se samozřejmě ukládají do vyrovnávací paměti, takže Vám žádný byte neuteče.
Procedura SendByte data naopak posílá do telefonu. Nevím, proč má šestnáctibitový argument, ale vězte, že najednou se dá poslat jenom osmibitová hodnota - tedy jeden byte (jeden znak). Odchozí data se také ukládají do vyrovnávací paměti, takže se nemusíte starat o přenosovou rychlost.
Pokud chcete kompletní popis knihovny Port.dll, klikněte
sem.
Ovládání telefonu:
Telefon se ovládá pomocí tzv. AT příkazů. Např. jednoduchý příkaz "AT" (samozřejmě bez těch uvozovek) slouží k otestování, zda je telefon zapnutý a vše je v pořádku. Pokud ano, telefon Vám vrátí zprávu: "OK" (bez těch uvozovek). V praxi to znamená, že Vy na sériový port pošlete hodnoty: Ord('A'), Ord('T') a nakonec číslo 13 (to značí konec řádku - v našem případě konec příkazu). Ve chvíli, kdy posíláte tyto tři hodnoty telefonu, telefon Vám je posílá automaticky zpátky (aby jste měli kontrolu, že všechny byty přijal). Další hodnoty bytů, které Vám přijdou, jsou: Ord('O'), Ord('K') a 13. Tedy text "OK" a znak konce řádku.
AT příkazy:
V této části je seznam AT příkazů pro ovládání telefonu, které jsem použil ve svém programu.
| Příkaz |
Příklad odpovědi |
Popis |
| AT |
OK |
Test, zda je telefon zapnutý, správně připojený, je správně nastavená rychlost přenosu dat a telefon je v pořádku. |
| AT+COPS? |
+COPS: 0,0,"CZ PAEGAS"
OK |
Dotaz na aktuální síť. Např. "CZ PAEGAS" je T-Mobile CZ, "CZ 03" je Oskar atd. |
| AT+CSQ |
+CSQ: 18,99
OK |
Dotaz na kvalitu signálu |
| ATD+420605123456; |
OK |
Vytočí telefonní číslo +420605123456. Je nutné zadat mezinárodní předvolbu (+42)! Nezapomeňte na středník na konci! |
| ATH |
OK |
Ukončí hovor (zavěsí). |
| AT+CPMS="ME","SM" |
+CPMS: 4,15,0,10,4,15
OK |
Příprava na načtení zpráv SMS. |
| AT+CMGL=1 |
+CMGL: 3,1,155 079... +CMGL: 4,1,152 079... OK |
Načtení zpráv SMS typu 1 z telefonu. Typy jsou vysvětlené dále v textu. První číslo za +CMGL je číslo zprávy z hlediska paměti, ve které je uložena, druhé číslo je typ zprávy a význam posledního čísla je vyvětlený dále v textu. |
| AT+CPMS="SM","ME" |
+CPMS: 0,10,4,15,4,15
OK |
Konec čtení zpráv SMS. |
| AT* |
... |
Výpis všech podporovaných AT příkazů. |
| AT+CPBS="ME" |
OK |
Nastavení paměti, ze které chcete načíst telefonní seznam. "ME" (mobile eeprom) je paměť telefonu a "SM" (SIM memory) je paměť SIM karty. |
| AT+CPBR=? |
+CPBR: (1-99),20,24
OK |
Zjištění rozsahu a vlastností paměti. |
| AT+CPBR=1,99 |
... |
Načtení telefonního seznamu v rozsahu od 1 do 99. |
| AT+CMGS=74 |
výzva |
První krok k odeslání SMS. Význam čísla 74 je vysvětlen dále v textu. |
| 001... |
+CMGS: 56
OK |
Zápis zprávy SMS. Za SMSkou (ve formátu PDU) musíte poslat znak 26 místo znaku 13 (konec přenosu dat místo konce řádku). |
| AT+CBC |
+CBC: 0, 100
OK |
Dotaz na stav nabití baterie. |
| AT+CMGD=1 |
OK |
Smazání zprávy SMS na pozici č. 1 v nastavené paměti. |
| AT+CPBW=1, "+420605123456", 145, "Adam365" |
OK |
Zápis telefonního čísla +420605123456 typu 145 (145 = číslo začíná znakem +, 129 = ostatní čísla) do vybrané paměti na pozici 1 pod jménem Adam365. |
Pozn.: většina AT příkazů má tvar "AT+příkaz". Většinou k nim také existuje příkaz "AT+příkaz?" a k jiným příkaz "AT+příkaz=?", který buď testuje, zda telefon tento příkaz nabízí, nebo vrací třeba rozsah paměti, max. velikost telefonního čísla při zápisu, rozsah hodnoty signálu, stavu baterie atd.
Formát textových zpráv SMS:
Zprávy SMS se zapisují ve formátu PDU. To je posloupnost několika šestnáctkových (hexadecimálních) znaků. Formát zde popisovat nebudu, protože jsem na to moc líný. Věřím, že na to přijdete sami. Já jsem na to taky přišel sám. Jenom Vám poradím, že např. před telefonním číslem je byte, který udává délku telefonního čísla. Datum, čas a telefon jsou uloženy tak, že jsou každé dvě číslice prohozené. Např. 10:11:12 by se napsalo jako 011121 atd. Samotný text zprávy SMS je uložený tak, že si ascii hodnoty jednotlivých znaků napíšete binárně, vezmete jenom sedm dolním bitů, pak ty všechny sedmice bitů nějak dáte za sebe, vzniklý řetězec si rozdělíte po osmi bitech a každou osmici převedete do šestnáctkové soustavy. Číslo o kterém jsem říkal, že jej vysvětlím dále v textu znamená délku zprávy (tuším, že to je délka zprávy ve formátu PDU v bytech a ješte zmenšená o jednu).