Staněk M.
Siemens S45i Manager
14.04.2003
Úvod Siemens S45 Manager je software, který je určen pro správu mobilního telefonu prostřednictvím PC. Jako požadované parametry jsem zvolil : - práci s textovými zprávami; - práci s telefonním seznamem; - monitorování GSM sítě a stavu hardrware telefonu; Jako ročníkový projekt jsem jej zvolil, pro naprostou absenci podobného, volně dostupného software, který by využíval plně možnosti telefonu hlavně v oblasti práce s adresářem a textovými zprávami. Monitorování sítě a stavu hardware telefonu je již méně podstatnou záležitostí.
1
Staněk M.
Siemens S45i Manager
14.04.2003
Koncept projektu Každý GSM mobilní telefon, jehož součástí je i hardwarový modem, by měl být podle norem Institutu Evropských Telekomunikačních Standardů (ETSI), schopen komunikace s externími zařízeními formou AT příkazů, jenž jsou těmito normami přesně definovány, prostřednictvím sériového kanálu. Na základě tohoto předpokladu vzniknul koncept projektu.Úkolem bylo tedy vytvořit software, který naváže komunikaci prostřednictvím sériového kanálu s telefonem a poskytne uživateli možnost pohodlné práce s adresářem a textovými zprávami. Hardwarové řešení Vlastní komunikace probíhá naprosto totožně jako u jakýchkoli externích modemů koncipovaných na sériový kanál, tzn. že napěťové úrovně RS232 jsou upraveny převodníkem (např. MAX232, MAX323) na úroveň TTL, zatímco veškeré časování a řízení toku dat odpovídá normě RS232. Telefon Siemens S45 pro který je software přizpůsoben, vyžaduje komunikaci na rozmezí přenosových rychlostí 9600kb/s až 19200kb/s, v datové šířce 8 bitů s 1 stopbitem, parita a řízení toku dat ať už softwarové, nebo hardwarové je potencionálně volitelné, nicméně jsem toto ponechal nevyužitým a tok dat není ničím řízen. Softwarové řešení Softwarové řešení vychází z uspořádání Jádra a Uživatelského prostředí. Jádro musí plnit následující funkce : - Plně zabezpečovat vlastní komunikaci s telefonem prostřednictvím sériového kanálu; - Poskytovat veškerá výstupní data nezávisle; - Předpokládat maximální množství možných nestandardních situací a chyb, efektivně na ně reagovat a poskytovat o těchto chybách informace; - Být v každém okamžiku plně pod kontrolou; - Veškerý konstantní textový výstup musí umožňovat snadnou cizojazyčnou lokalizaci; - Plně využít možností objektově orientovaného programování – koncipovat jej jako samostatný dílčí celek (třídu, komponentu); Uživatelské prostředí musí : - Využívat možností jádra, tak aby se minimalizovalo riziko možné chyby; - Být uživatelsky příjemné a elegantní; - Být kompromisem mezi rychlostí a spolehlivostí;
2
Staněk M.
Siemens S45i Manager
14.04.2003
Výsledný software jako celek musí : - Být nezávislý na verzi platformy MS Windows; - Být schopen patřičně reagovat na ztrátu svých konfiguračních souborů; - Minimalizovat zásahy do konfigurace operačního systému;
Grafické znázornění konceptu :
3
Staněk M.
Siemens S45i Manager
14.04.2003
Realizace projektu
AT příkazy Jsou to jednoduché textové řetězce začínající prefixem AT odesílané sériovým kanálem na port telefonu.Jsou-li akceptovány telefonem, tento provede nějakou činnost, nebo pošle zpět data a následně potvrdí výsledek této činnosti.Tento AT protokol definuje norma ETSI : ETS 300 642, GSM 07.07 ver. 4.4.1 Phase 2, přiložená jako příloha.
Příkladně,chceme-li zjistit výrobce telefonu : Příkaz : AT+CGMI
Odpověď : Případně <ERROR> není-li příkaz akceptován, nebo dojde-li k jiné chybě.
Přistup na porty pod platformou Windows Tento problém lze řešit, pokud je třeba zachovat nezávislost na platformě, pouze a jedině využitím funkcí, které nabízí jádro operačních systémů Windows WIN API.Alternativní jsou pouze postupy jakými lze k API přistupovat. První z těchto alternativ může být dynamicky linkovaná knihovna Ports.dll, která je volně dostupná a zahrnuje operace i pro sériové porty. Jinou možností je použití, některé z komponent určených pro Delphi.Rozhodl jsem se však, že se pokusím podobnou komponentu napsat sám, protože jsem musel dodržet uvedené body v návrhu jádra, a to konkrétně jeho nezávislost, stabilitu a stoprocentní kontrolu jeho činnosti a řízení chyb. Pokusil jsem se pochopit systém přístupů k portům přes API, prostřednictvím Delphi. Přeložil jsem kapitoly elektronické nápovědy k Delphi (soubor poskytnut jako příloha), které se tohoto problému týkají. Systém práce s porty se výrazně liší ve verzi 3.11 a 95+, tím, že platforma 3.11 používá pro práci s porty systém zpráv a nikoli kooperaci několika podporcesů na pozadí, jako 32bitové, nové systémy MS Windows.(z toho vyplývá nepřenositelnost kódu projektu do Delphi 1). Komponentu jsem se pokoušel napsat s využitím dvou podprocesů (potomků třídy TThread) které kontrolovaly signalizovaný stav událostních objektů (TEvent), přidružených k Overapped strukturám, které využívá WIN API, k řízení podprocesů kontrolujících zápis, čtení a události vznikajících na portech. Kód však nebyl stabilní a v oblasti čtení z portu a řízení událostí nepracoval správně. Byl jsem tedy nucen použít volně šiřitelnou komponentu VaComm od Petra Voneše, 4
Staněk M.
Siemens S45i Manager
14.04.2003
která je implementována v jádru projektu a pracuje bez jakýchkoli chyb pod všemi platformami počínaje Win 95. Jádro projektu Tvoří třída TSiemensS45i, jako potomek třídy TComponent a je tedy uzpůsobena pro pozdější případnou transformaci v nevizuální komponentu.Zabezpečení komunikace s telefonem je jak bylo již zmíněno chráněným a neoddělitelným objektem VaComm přímo obsaženým ve vlastnické třídě TSiemensS45i, což zajišťuje její nezávislost. Přístup k metodám objektu VaComm je realizován výhradně a jen přes kontrolované a zabezpečené metody vlastnické třídy TSiemensS45i tím je zajištěna bezkoliznost. Třída TSiemensS45i je definována takto : Pozdější potencionální jazyková lokalizace je zajištěna definicí všech konstantních textových řetězců jako resourcestring, například : resourcestring errNotConnectOrOperationPending = 'Telefon není připojen, nebo probíhá nějaká operace.'; errPhoneNotSupportThisCommand = 'Telefon tento příkaz pravděpodobně nepodporuje.'; … atd.
5
Staněk M.
Siemens S45i Manager
14.04.2003
Hlavička třídy se všemi metodami : TSiemensS45i = class(TComponent) protected Answer : AnsiString; Readed : boolean; WaitTime : cardinal; SMSPDU : TSMSPDU; Comm : TVAComm; procedure RxChar(Sender : TObject; Count : integer); function EnableEcho : boolean; function DisableEcho : boolean; private OperationPending : boolean; public Connected : boolean; WireOpened : boolean; PortNumber : byte; BaudRate : TVABaudRate; function function function function function
Connect DisConnect OpenWire CloseWire IsPhoneConnect
: : : : :
boolean; boolean; boolean; boolean; boolean;
//f-ce poporovane telefony dle normy ETSI function GetIMEI : string; function GetType : string; function GetManufacturer : string; function GetSIMID : string; function GetTime : string; function GetDataState : string; function GetGSMPhoneVersion : string; function GetIMSI : string; function GetBateryCharge : string; function GetSignalQuality : string; function GetPhoneStatus : string; function GetSIMPhnBookInterval : string; function GetSIMPhnBookTelLen : string; function GetSIMPhnBookNameLen : string; function ReadPhoneBkName(Num : byte) : string; function WritePhoneBkName(Name,Num,NmTp: string; Ind : word) : boolean; function GetPhoneBkTelNumType : string; function GetSelectedPhoneBook : TPhoneBook; 6
Staněk M.
Siemens S45i Manager
function function function function function function function function function function function function function function function function function function function function function function function function
SetPhoneBook(PhBk : TPhoneBook) GetSelPhBookMax GetSelPhBookUsed GetSMSServiceCenterAdress GetSelectedReadSMSMem GetSelectedWriteSMSMem SetSMSMemory(RM,WM,SM : TSMSmemory) GetSelectedStoreSMSMem GetSMSReadMemUsed GetSMSWriteMemUsed GetSMSStoreMemUsed GetSMSReadMemMax GetSMSWriteMemMax GetSMSStoreMemMax GetSMSList GetRecUnReadSMSPositions GetRecReadSMSPositions GetStoUnsentSMSPositions GetStoSentSMSPositions ReadSMS(Num : byte) DeleteSMS(Num : byte) GetSMSFormat SendSMSMessage EnterPIN(PIN : word)
//funkce function function function
ktere podporuji pouze telefony Siemens PlaySignalTone(Tone, Volume : byte) SwitchDeviceOff GetAdress(Num : word)
//funkce function function function function function function function function
potrebne pro praci s tridou PhBookToDefStr(PhBk : TPhoneBook) PhBookToStr(PhBk : TPhoneBook) StrToPhBook(Str : string) SMSMemToDefStr(SMSMem : TSMSMemory) SMSMemToStr(SMSMem : TSMSMemory) StrToSMSMem(SMSStr : string) DecodeHex(Hex : AnsiString) StrToAdr(Str : ansistring)
14.04.2003
: : : : :
: boolean; : string; : string; : string; : TSMSMemory; : TSMSMemory; : boolean; : TSMSMemory; : string; : string; : string; : string; : string; : string; TSMSPositionsArray; TSMSPositionsArray; TSMSPositionsArray; TSMSPositionsArray; TSMSPositionsArray; : TSMS; : boolean; : string; : string; : boolean;
: boolean; : boolean; : TAdress;
: string; : string; : TPhoneBook; : string; : string; : TSMSMemory; : AnsiString; : TAdress;
constructor Create(AOwner : TComponent); override; destructor Destroy; override; end;
7
Staněk M.
Siemens S45i Manager
14.04.2003
Následující výpis jednoduché metody, která vrací stav baterie, nastíní jak je zajištěna kontrola nad třídou : -
-
operace se provede jen pokud je telefon připojen a pokud neprobíhá žádná další operace pak si funkce nastavením proměnné OperationPending uzamkne přístup na port, a nastaví hodnotu proměnné WaitTime ve které odhaduje kolik času jí zabere vyhodnotit odpověď (zde se předpokládá konstantních 200ms), a nastaví booleovskou proměnnou Readed na FALSE, čímž dá najevo že na odpověď teprve čeká pošle příkaz a vyhodnotí odpověď , pokud došlo k chybě pokusí se odhadnout jak mohla nastat a tento odhad umístí do proměnné LastError
function TSiemensS45i.GetBateryCharge: string; begin Result := 'ERROR'; if Connected and not OperationPending then begin OperationPending := TRUE; Answer := ''; Readed := FALSE; Comm.WriteText('AT+CBC'+#13); while not Readed do begin Application.ProcessMessages; end; if Pos('OK', Answer) = 0 then if Pos('ERROR', Answer) <> 0 then begin LastError := errPhoneNotSupportThisCommand; Result := 'ERROR'; end else begin LastError := errCommunicationError; Result := 'ERROR'; end else begin Delete(Answer, Pos('AT+CBC'+#13,Answer),17); Delete(Answer, Pos(#13#10, Answer), 4); Delete(Answer, Pos('OK', Answer), 4); Answer := Answer + ' %'; Result := Answer; end; OperationPending := FALSE; end else LastError := errNotConnectOrOperationPending; end; 8
Staněk M.
Siemens S45i Manager
14.04.2003
Tímto způsobem je zajištěno, že jsou veškerá data získávána prostřednictvím návratových hodnot funkcí a naprosto nezávisle na sobě, aniž by se mohlo stát, že dojde ke kolizi způsobené překrýváním požadavků na čtení dat z telefonu. Další chráněnou třídou obsaženou v TSiemensS45i je třída TSMSPDU, jde o její nedílnou součást.Třída TSMSPDU má za úkol dekódovat a kódovat krátké textové zprávy z a do PDU formátu. PDU formát Je 7-mi bitové kódovací schéma opět definované normou ETSI : TS 100 900, GSM 03.38 ver. 7.2.0 Phase 2+, přiloženou v příloze. V mobilních telefonech jsou SMS zprávy uloženy v následující podobě : 079124603050020031000C912470326477900000FF10D33239DD06D941E2B0BC0ED2B D53 Po dekódování tohoto řetězce získáme mimo jíné tato data : Příjemce : +42072346770(?) Text zprávy : Sedim v baru :o)
9
Staněk M.
Siemens S45i Manager
14.04.2003
Hlavička třídy TSMSPDU je definována takto : TSMSPDU = class(TObject) public SMS : TSMS; SMSMessageInPDU : AnsiString; function HexToDec(hex : string) : integer; function HexToBin(hex : Char) : string; function BinToDec(bin : string) : integer; function DecToBin(dec : byte) : string; function MinToTime(min : word) : string; function DecToHex(dec : integer) : string; function BinToHex(bin : string) : string; constructor Create; destructor Destroy; override; function DecodeData : boolean; function EncondeData : boolean; function DisArrayString(str : string) : string; function HexToStr(Hex : ansistring; Chars : word) : ansistring; function StrToHex(Txt : ansistring; var Chars : word) : ansistring; end;
10
Staněk M.
Siemens S45i Manager
14.04.2003
Funkce DecodeData dekóduje PDU řetězec a naplní záznam SMS typu TSMS, který je definován takto : TSMS = record ServiceCenterAdress : record Length : byte; NumberFormat : TNumberFormat; Number : string[24]; end; ProtocolDataUnitType : record ReplyPath : boolean; UserDataHeaderIndicator : boolean; StatusReportRequest : boolean; ValidityPeriodFormat : TPDUVPF; RejectDuplicateOrMMS : boolean; MessageTypeIndicator : TPDUMTI; end; MessageReference : byte; OriginatorDestinationAdress : record Length : byte; NumberFormat : TNumberFormat; Number : string[24]; end; ProtocolIdentifier : byte; DataCodingScheme : TSMSDCS; ValidityPeriod : string[20]; ValidityPeriodTimeZone : string[2]; ServiceCenterTimeStamp : string[25]; ServiceCenterTimeZone : string[2]; Chars : byte; Text : string[255]; end; Adresář v telefonu je kódován podobně jako textové zprávy, algoritmus, který toto dekódováni zajišťuje je však podstatně jednodušší.
11
Staněk M.
Siemens S45i Manager
14.04.2003
Určování geografické polohy prostřednictvím dat GSM sítě Je realizováno poměrně jednoduše. Z telefonu jsou získána data operátora – jeho identifikační kód, kód státu a kód buňky sítě na kterou je telefon zrovna připojen. Operátoři poskytují a pravidelně aktualizují soubory se seznamy těchto buněk. Stačí tedy prohledat datový soubor příslušný k danému operátorovi, najít odpovídající číslo buňky a zobrazit její popis.
Uživatelské prostředí Následuje několik informativních obrázků, z běhu programu. Jedná se jen o několik nejduležitějších oken demonstrujících styl uživatelského prostředí.
Není-li nalezen telefon na požadovaném portu :
Není-li telefon požadovaného typu :
12
Staněk M.
Siemens S45i Manager
14.04.2003
Byl-li telefon úspěšně připojen :
Je-li baterie telefonu příliš vybitá
Hlavní okno programu, naplněno daty SMS :
13
Staněk M.
Siemens S45i Manager
14.04.2003
Hlavní okno programu, naplněno daty SMS načtené z dataváze, aplikace je v tomto případě přeskinovaná operačním systémem :
Informace o průběhu načítání dat (zde telefonní seznam) :
14
Staněk M.
Siemens S45i Manager
14.04.2003
Okno telefonního seznamu, naplněného daty :
15
Staněk M.
Siemens S45i Manager
14.04.2003
Okno sledování stavu sítě :
16
Staněk M.
Siemens S45i Manager
14.04.2003
Ukázka stylu menu v aplikaci :
Okno „About“, skin OS :
17
Staněk M.
Siemens S45i Manager
14.04.2003
Závěr Projekt měl být původně realizován pro telefon Nokia 7110. Vycházel jsem z předpokladu, že pokud existuje software komunikující s telefonem a pokud Nokia 7110 obsahuje hardwarový modem měla by být schopná komunikace dle norem ETSI. Nicméně po připojení k PC nereagovala na žádné ze zadávaných AT příkazů.Předpokládal jsem, že je to proto, že je nutné nastavit parametry komunikace přímo v telefonu, nebo, že jde o podobný problém.Kontaktoval jsem tedy oficiální zastoupení společnosti Nokia pro ČR, písemně, telefonicky a nakonec i osobně, ale nedostal jsem žádnou odpověď, která by problém ozřejmila. Proto jsem kontaktoval programátory společnosti OxygenSoftware, jako největší společnost na poli vývoje software pro telefony Nokia, ani zde jsem nedostal uspokojivou odpověď . Až po prozkoumání zapojení datových kabelů, jsem zjistil, že pro správnou funkci hardwarového modemu je třeba kabel typového označení DLR-3, který kromě dvou napěťových převodníků MAX323 obsahuje mikrokontroler, který plní funkci konvertoru proprietálního, privátního komunikačního protokolu společnosti Nokia na standardní AT protokol ETSI a po připojení k modemu poskytuje telefonu hardwarový klíč.Vlastní výroba tohoto kabelu byla téměř nemyslitelná a jeho cena jako originálu krajně neekonomická, proto jsem se rozhodl dokončit projekt s jiným telefonem, který se již od počátku chová standardně. Tímto je Siemens S45i.Po připojení k hyperterminálu okamžitě reaguje na AT příkazy,odkryla se tedy cesta k řešení dalších problémů, které již byly pouze softwarového rázu. Závěrem bych chtěl poděkovat všem pegagogům za jejích spoluprácí, či rady.
18
Staněk M.
Siemens S45i Manager
14.04.2003
Použitá literatura a ostatní zdroje : Delphi : Mistrovství v Delphi 6; Xavier Pacheco, Steve Texiera; Computer Press 2002 (tvorba komponent, podprocesy a vlákna, systém zpráv MS Windows) www.builder.cz - fórum Delphi (řešení přístupu na porty, seriál : Sériové rozhrani pod Delphi) www.zive.cz (seriál : Umíme to s Delphi, Václav Kadlec, vizualní stránka aplikace) Normy : www.etsi.org – European Telecommunication Standards Institute AT Protokol : ETS 300 642, March 1999, GSM 07.07 ver. 4.4.1 Phase 2 SMS PDU : TS 100 900, GSM 03.38 ver. 7.2.0 Release 1998, Phase 2+ Siemens : www.my-siemens.cz – technická specifikace a dokumentace telefonu Siemens S45(i) Kompletní sada AT příkazů pro daný typ telefonu : AT Command set for S45 Siemens mobile phones and modems Release/Version 1.7; 26 July, 2001 Specifikace SMS PDU formátu společností Siemens : Developer’s Guide; SMS with the SMS PDU – mode Release/Version 1.2; 30.07, 1997 Nokia : www.nokia.com – řešení problému proprietálního protokolu.
Technická specifikace programu : Jazyk : Object Pascal 32, IDE – Borland Delphi 5-Enterprise Object Pascal 32, IDE – Borland Delphi 6-Enterprise, licence na produkci freeware Platforma : IBM PC; MS Windows 95+ Verze : v době práce na dokumentaci - 0.8.7.203 V době prezentace projektu ke dni 29.04.2003 – 1.0.0.build Soubory nutné pro chod programu : Siemens Phone Manager.exe .\BTS\23001.dat .\BTS\23002.dat .\BTS\23003.dat Velikost programu : 890,5 kB Programový kód : 7335 řádků; 596 kB Jazyková lokalizace : Čeština Licence : freeware, opensource Uživatelská podpora : http://orpheus.wz.cz [email protected] 19
Staněk M.
Siemens S45i Manager
14.04.2003
Specifikace platformy na které byl software odlazen : Athlon XP 2200+ 1,9 GHz MSI K7400 512 MB RAM MS Windows XP Professional Seznam příloh k dokumentaci :
20