/[H9]/trunk/docs/Server Software dokumentation.doc
ViewVC logotype

Contents of /trunk/docs/Server Software dokumentation.doc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 225 - (show annotations) (download) (as text)
Tue Dec 11 08:12:21 2007 UTC (16 years, 5 months ago) by kevin
File MIME type: application/octet-stream
File size: 38400 byte(s)
updated dagbog - kevin.doc and did some spell checking in server software dokumentation + added server uml.dia
1 ࡱ> FHEy6bjbjEE4J''.UUUUUiiii,$ih
2 
3 
4 
5 
6 
7 $>.U.UUC
8 UUPa{;i
9 Y0U.. :Server Software dokumentation. Userguide Nr Serren AB starter deres serversoftware har de 3 valgmuligheder, fordelt p 2 knapper: Start: Denne knap starter med at tjecke om det er ndvendigt at sende en pinkode til modemet, hvis det er det bliver den sendt og vi venter p modemet er klar, hvorefter vi fortstter start fasen. Hvis ikke det er ndvendigt med en pinkode hopper vi direkte til start fasen. I startfasen starter vi med at lse i databasen hvad serverens eget telefon nummer er, skriver det p skrmen og starter main trden som ser efter data p den serielle port, lser i databasen om der skal sendes config smser osv. Close: Bruges til at lukke programmet pnt ned. Ved at lukke seriel og database connection og stopper main lkken. Server-Settings.ini Server-Settings.ini er en fil der skal ligge i rod mappen til server softwaren, hvor man kan ndre host, database, user, password for databasen, og vlge hvilken COM-port programmet skal bruge. Beskrivelse Serveren i dette projekt skulle ikke vre et vrktj som vi plejer, men nrmere et bindeled mellem databasen og flisfyret, som s for en god ordens skyld kan skrive noget data i et logvindue s man kan se hvad der sker. Serveren er rimelig simpel opbygget, der er en seriel wrapper til at tage sig af det alt til det serielle (genbrugt fra tidligere projekt), en Server-Settings fil til at holde det data brugeren skal kunne ndre. En container fil til at holde de klasser og variabler jeg skulle bruge rundt omkring i projektet, og en trd der str og kalder alle de ndvendige funktionen, hvis der er brug for dem, trden ligger i CFlisfyrDlg som er min hovedeklasse. Funktioner OnInitDialog: I denne standart oprettede funktion vlger jeg at kalde StartSerial() og DBConnect, samt stte min sms counter til 0. AppendText : Da jeg ofte havde brug for at tage den tekst der var i log vinduet og tilfje en ny line og noget nyt tekst valgte jeg at lave en funktion jeg kunne kalde med den streng der skulle tilfjes i den nye linje under teksten. Da jeg alligevel har fat i alt tekst der skrives her bliver der ogs sat et tidsstempel p s det er til at se hvornr der sidst kom noget ind. Her hndterer jeg ogs autoscroll, da det normalt reagere p enter, som vi ikke bruger i dette projekt. CheckAcknowledges : Denne funktion bruges til at tjekke op p om der er get over 5 minutter siden vi sendte konfigurations smsen ud og der ikke er kommet svar. Frst ser vi om der er get 300 sekunder eller derover, hvis der er det tjekkes der for om der er sendt 1 retry sms ud. I tilfldet at der er sendt 1 retry sms ud vil commerror p installationen blive sat til true, hvilket resultere i installationen vil st under critical p web siden. Hvis der ikke er blevet sendt en retry sms, vil der blive sendt en og counteren tlles op, samt der vil i log vinduet blive skrevet Retry send config to TLFNR. DBConnect: I denne funktion indlser jeg data fra Server-Settings filen og opretter forbindelse til databasen. DBReadCommands: Denne funktion gr ind i databasen og ser i command, hvis den stder p en linje hvor der ikke er sat nogen executed tid p returnere den id, commandid og installationid til en data container til senere brug. DBReadPhone : Denne funktion bliver kaldt med et installationsid for at kunne hente det rigtige telefon nummer, imei nr, update rate og id p installationen, og returnere det til en data container klasse. Hvis der bliver sendt et 0 med som installations id vlger den at hente hele listen frem, da de s er tegn p vi skal sende en config sms til alle installationer. DeleteSms : Denne funktion kaldes nr vi lukker serveren, og nr vi har modtaget et fastlagt antal smser, den sender en at+cmgd=1,3 kommando ud til modemmet for at slette alle lste, sendte og usendte smser. HandleAcknowledge: Hvis vi modtager en conf ok besked kalder vi denne funktion med afsenderens telefonnummer, derefter leder vi vores liste igennem efter frste forekomst af dette nummer, som vi s sletter fra listen. keepaliveandread : Vi havde skrevet i kravspecifikationen at serveren skulle hente sit eget telefon nummer i databasen, og at den ville lse i databasen hver 15. Minut for at holde sig i live. Det blev denne funktion oprettet til. Frst prver jeg at kre sql strengen select name, value from config;, hvis det lykkedes smider jeg det hentede data i en container til senere brug. Hvis der af en eller anden rsag ikke kan fs forbindelse med databasen, lukker jeg forbindelsen og bner den igen. OnBnClickedClose : Frst sttes continueThread til 0, for at stoppe main trden i at kre videre, s bliver DeleteSms() kaldt for at rydde op. Efter en pause ser vi om der er bent for en seriel forbindelse, som vi s lukke hvis der er. Og det samme sker med database forbindelsen. Og til slut lukker serveren ned. OnBnClickedStart : Frst Skrives der i logvinduet at vi tjekker og indstter pinkode hvis ndvendigt, hvorefter vi kalder SetPin(), s flusher jeg data p den serielle port inden jeg fortstter. continueThread sttes til 1, keepaliveandread() kaldes, der skrives til logvinduet (Server phonenr read from db: + phonenr) og main trden bliver kaldt. readFrame : Er en lille worker funktion til at lse dataen p den serielle forbindelse, og putte det i en vector som derefter returneres. runthread : Her ser vi efter om continueThread er forskellig fra 0, hvis den er det kre vi MyMainThread(). MyMainThread : Dette er selve hoveddelen af programmet. Vi starter med at se om der er data i k p den serielle forbindelse. Hvis der er data i k, lser vi det ind og ser om det er et + i teksten, da det vil indikere at vi har fet en modem kommando ind. I tilfldet der er et plus splittes teksten op, i command og tekst, samt stter en bool til true for at markere vi har en plus kommando til senere. Efter vi har splittet dataen, ser vi om teksten er ok eller error, da det er beskeder der kun skal sendes til logvinduet. Hvis plus boolen er true, ser vi om command indeholder cmti eller wind. Ved cmti: starter vi med at lede efter et , som kommer lige fr tallet der indikere hvilken sms det er der er kommet, nr vi har fundet et , stter vi smscount til alt til hjre for det og fjerner : fra enden. S generere vi at kommandoen og sender den af sted, og efter en lille pause kalder vi ReadSms(). Ved wind: denne del er sdan set mest lavet som en lille fail safe, hvis vi skulle vre s uheldige at f en ekstra besked ind fra modem startup. S hvis vi fr sdan en skriver vi til logvinduet Wind modtaget og teksten som vi modtog. Ellers skriver vi den tekst vi har modtaget til logvinduet. Vi tjekker ogs op p om ResetSms er net til 20, i hvilket tilflde vi kalder DeleteSms() og skriver til logvinduet Smser slettet da vi nede grnsen. Der tjekkes igen om p om continueThread er positiv, hvis dette er tilfldet kalder vi DBReadCommands og splitter dataen op, samt omregner commandid til en int som vi kan tjekke op p, i tilfldet at inten er over 1 er det et tegn p vi skal bruge det installationsid der er i containeren, ellers skal der nemlig sendes en config sms ud til alle. Derefter kalder vi sendconfig(). Efter config er blevet sendt holder vi en pause, og kalder CheckAcknowledges(), efterfulgt af endnu en pause. Til sidst i main trden ser vi om der er get 900 eller over sekunder, hvis dette er tilfldet kaldes keepaliveandread(). ReadSettings: Frst bnes filen Server-Settings, og derefter splittes den op i de forskellige variabler. Host, username, password, database til databasen. Comport til den serielle og pincode til modemmet. Og filen lukkes igen. ReadSms: Nr vi nr ind i readsms funktionen er at kommandoen til at gre det allerede blevet sendt, s vi starter ned at holde en rimelig lang pause, for at sikre os hele smsens indhold er i den serielle k. Derefter lser vi den og skriver den p skrmen samt sender den videre til SmsSplit(). SendConfig : Frst ses der efter om commandid er 1 eller noget andet, hvis den er 1 kaldes inst = DBReadPhone(0); ellers kaldes inst = DBReadPhone(InstallationsID); som beskriver om det er en eller alle der skal have tilsendt en config sms. S fyldes telefonnummer, imeinummer og updaterate i strenge. S udregner vi tvrsummen af imei nummeret, som vi bruger s modtagerne kan se det er en config sms til den. S kaldes SendSmsHead() med telefonnummeret. S opbygges smsdataen, med det udregnede imei, servertelefonnummer og updaterate, som bruges nr vi kalder SendSmsData. Til sidst tjekkes op p om IDnr er forskellig fra 0, da vi s skal tilfje installationsid og telefonnummer til listen over hvem der har fet tilsendt en config sms. SendSmsData: Efter SendSmsHead har taget sig af delen med at taste at kommandoen og indstte nummeret bliver der herfra sendt den data af sted der er blevet vedlagt i en vector, nr alt dataen er sendt ud til modemmet med de sm pauser sendes kommandoen 0x1A svarende til CTRL+Z, hvilket indikere for modemmet at vi er frdige med at skrive smsen og den skal sendes af sted. Modemmets svar skrives derefter til logvinduet. SendSmsHead: Her starter jeg p at sende smserne, frst bliver der skrevet en del af ATkommandoen til modemmet (at+cmgs=), derefter sender jeg det telefonnummer som blev sendt med da funktionen blev kaldt, og det hele afsluttes s med at stte et og et carriage return p, og holde en lille pause. SetPin : Her starter vi med at sende at+cpin? kommandoen ud, og afventer svar. I tilfldet at modemmet nsten lige er blevet startet op vlger vi at sge efter +cpin: i dataen fra den serielle port, da der sendes noget data vi ikke skal bruge lige som modemmet starter. Hvis modemmet returnere +cpin: sim pin lses der i Server-Settings filen og at kommandoen genereres (at+cpin=2595). Dataen sendes af sted og vi starter en lykke der venter p at f wind: 11 tilbage, hvilket indikere at modemmet er oppe og kre. Hvis modemmet returnere +cpin: ready skriver vi No pincode needed og hopper hurtigt videre. Der er selvflgelig ogs muligheden at vi fr noget uventet data tilbage, hvilket vil resultere i der i logvinduet vil st Error in set pin part of the code. SmsSplit: Her modtages smsen som den sendes fra modemmet, s jeg starter med at hente afsenderens nummer ud, og fjerner derefter alt fr den egentlige besked. Frst tjekkes beskeden for om den er conf ok, hvis dette er tilfldet gr vi videre til HandleAcknowledge med afsenderens nummer. Ellers sikre vi os at dataen er inden for de rammer vi har specificeret i vores interne sms protokol. Nr smsen er sluppet igennem dette tjek bliver den delt op ved flere gange at blive sendt igennem Splitter(). S bliver installationsid p afsender telefonnummeret fundet, og det medtagede data puttes i logtabellen. Og der skrives i logvinduet Sms added to Log. Splitter : Splitteren har en reference til den data den skal arbejde med, og laver ikke det helt store, den sger efter : i teksten og returnere teksten til venstre for det, og stter den data referencen peger p til alt til hjre for :. StartSerial: Jeg starter med at lse i Server-Settings filen hvilken COM-port der skal bruges, og bner derefter den serielle forbindelse med en fastlagt baud rate p 1200. De 1200 blev valgt for at holde det ens p server og pic. tversum : Denne funktion bruges nr vi skal sende en config sms til installationerne, da vi har valg at de ikke skal reagere p smser hvis ikke den starter med tvrsummen af deres imei nr. s vi sender imei nummeret vi har fra databasen ned og ligger dem sammen tegne for tegn. Og returnerer resultatet. writeFrame: Writeframe er lavet til at tage en vector med noget data, og skrive det til den serielle forbindelse, men nogle sm pauser s modemmet ikke bliver forpustet, hvorefter det hele sluttes af med at sende en carriage return og endnu en lille pause. *yzI J ~
10
11
12
13
14
15 7 8 qrs~z꾶zoozggzozhOOJQJh KbhX.OJQJh KbhHKOJQJh KbhiNOJQJh Kbh[DOJQJ h h[Dh[Dh[DOJQJh#OJQJh
16 WOJQJh Kbhv OJQJh Kbh
17 WOJQJh KbhOJQJh KbhIOJQJh Kbh#OJQJh KbhEWOJQJ$ *J ~
18
19
20  rs~gdiNgd8gdiNgd[Dgd[Dgd#gdEWgdEW$a$gdEWJUMN[ETTgd<2gdiNgd8:BSanHIJTGPtbj 18:;̶궫̫̫̠̘~v~vh
21 WOJQJh Kbh OJQJ h<2h<2h
22 Wh<2hiNOJQJh KbhsOJQJh Kbh{;OJQJh Kbh5"OJQJh Kbh8]OJQJh KbhiNOJQJh KbhXOJQJh)^OJQJh Kbh
23 WOJQJh Kbhv OJQJ.;@ABC&-LMNYEQT8@Tc j y z """Ĺ׹☮☍wwh Kbh8OJQJh Kbhk6sOJQJh Kbhh /OJQJh Kbh(OJQJh KbhFOJQJh Kbh
24 WOJQJh KbhHKOJQJh KbhOOJQJhOOJQJh KbhiNOJQJh Kbh6OJQJh
25 WOJQJh Kbh OJQJ+ !""$%%%%'"') *++,,-.D///0 1x22gd!Sgd8gdOgdOgdiN"""N#T#\#%%%%%%%&)&&&'"'&)b)i))) *E*O*****+'+,+4+w+++++++,,,,,,,Ƚ~~hz3XOJQJh Kbh)OJQJh Kbh2OJQJh Kbh OJQJh Kbhz3XOJQJh Kbh 7lOJQJh KbhiNOJQJ hOhOhz3XhOhvOJQJh KbhvOJQJh Kbh
26 WOJQJh Kbh:>OJQJ0,--6->-----:.D.....///000O0U000s1y111#2,2x2222;3E3j3v3P4\444l5v555 66[6666߶߫߶h OJQJhHKOJQJh Kbh2OJQJh KbhHKOJQJhz3XOJQJh Kbh OJQJh Kbho>OJQJh KbhiNOJQJh Kbhz3XOJQJh KbhOJQJ42j3w3R4\45566gd2gd8gdiN21h:pC. A!n"n#$% j 666666666vvvvvvvvv666666>6666666666666666666666666666666666666666666666666hH6666666666666666666666666666666666666666666666666666666666666666662 0@P`p2( 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p8XV~ OJPJQJ_HmHnHsHtHJ`J X.Normal dCJ_HaJmHsHtH n@n EW Overskrift 1$$@&'5B*CJOJPJQJ\^JaJph6_n@n 8 Overskrift 2$$@&'5B*CJOJPJQJ\^JaJphONA N Standardskrifttype i afsnitViV 0Tabel - Normal4
27 l4a 6k 6 0Ingen oversigt h>@h EWTiteld,POm$)@B*CJ4KHOJPJQJ^JaJ4ph6]VV EW
28 Titel Tegn)@B*CJ4KHOJPJQJ^JaJ4ph6]bb EWOverskrift 1 Tegn'5B*CJOJPJQJ\^JaJph6_b!b 8Overskrift 2 Tegn'5B*CJOJPJQJ\^JaJphOPK![Content_Types].xmlj0Eжr(΢Iw},-j4 wP-t#bΙ{UTU^hd}㨫)*1P' ^W0)T9<l#$yi};~@(Hu* Dנz/0ǰ $ X3aZ,D0j~3߶b~i>3\`?/[G\!-Rk.sԻ..a濭?PK!֧6 _rels/.relsj0 }Q%v/C/}(h"O
29 = C?hv=Ʌ%[xp{۵_Pѣ<1H0ORBdJE4b$q_6LR7`0̞O,En7Lib/SeеPK!kytheme/theme/themeManager.xml M
30 @}w7c(EbˮCAǠҟ7՛K Y, e.|,H,lxɴIsQ}#Ր ֵ+!,^$j=GW)E+&
31 8PK!%FՀNtheme/theme/theme1.xmlYMoE#F{oc'vGuرHS-q;ޝfvg53NjHH8PTj%.H 3މ$i#ZA}H1^3tH<i{5M¶wkؿ!p`Dz6*^W D)/-IS11V(¥@#Zmu)4Pc`ŅJo#gc?QR/L 4c 68k.R~4$
32 ^xKWzF]|2 8X62E8*֕05z^gRKgV<K uw֬5\|ʜέNleXd6k沃7 onwůWZ o@Zϸ1gە52 Pd1T\k1EȰ RӔ9HPuKo/疴,$}AS>L1Ìg?|z|d9T8 T/G?|xY㧿E5g?MGeD 3^q5'#q>aib3 %NR"}sYGq=x[@^uDbh(v^ѲJnNZqVĉooB1G=C;~@Huw(uK}%+t.ґM3mC\U6CFΪ".
33 凄9n'
34 U,8fe*Rr0~ד
35 "Q/ RV|$Rw0tʰi"U<o`-~ЍpVa4(F{\Uw[!–Mӻ-:*DKhNiOQ6.C|ͣz[&IU}.l].-<Ik.6Yo;9^8!)c5e4C}"â3gCRf}$h캧2cJr ;\[aHWX$V<+z9?lng.hE38+S0UյRgV7VH+LΛ7aA0WtE3h۽7EHF8 Y1 bn w*byx$پ,@\׉R(=Q,)'KQk5qpq
36 Qz,k!_ Y4[an}`B-,#U,ђMpE`3XYdxcZВҊ}Z)("QpFl"1_*P W#G6]:fivK4d 7u\`Jmo) 23S~7+#]mq#](08w
37 A[s)k8}"Aa?R dڒɾSճ˲d#Q%uejC†C&Y0>g4
38 S7{{ F} 4 +vUKol~1yUVU8Vk;֜\9ŰX D) ?*|FL u"A3d]dm2iVֵ褽o<rO8[kvxpsj"y][jq~11?hu⣻-ߟ0%M2oJ90uo%ҍPK! ѐ'theme/theme/_rels/themeManager.xml.relsM
39 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-![Content_Types].xmlPK-!֧6 +_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!%FՀNtheme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK]
40 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
41 <a:clrMap xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/>. J;",6 "#26!$|H # AA@0( 
42 B
43 S  ?..< vQ0
44 e:4 X.h /o>XBFHK!Sz3X)^ Kb#ic 7lk6sp6#hV?Dv s?MA[D{;C:>RdXIiN@ v <28] %3:5O2)gEW
45 W 85"(:..@$$x($$.X@UnknownG* Times New Roman5Symbol3. * Arial7.{ @Calibri7K@CambriaA BCambria Math"%R&+ZF'U'U!nr0n.n.2HP  $PEW2!xxkevinkevinOh+'0h 
46 $ 0 <HPX`kevinNormalkevin7Microsoft Office Word@b@6r:@s;'՜.+,0 hp  privatUn.  Titel
47  !"#$%'()*+,-./012346789:;<>?@ABCDGRoot Entry F
48 {;I1Table&WordDocument4JSummaryInformation(5DocumentSummaryInformation8=CompObj{
49  F)Microsoft Office Word 97-2003-dokumenter
50 MSWordDocWord.Document.89q

Properties

Name Value
svn:mime-type application/octet-stream

  ViewVC Help
Powered by ViewVC 1.1.20