IFC FAQ

1, Co je to IFC?

IFC je skratka od Internet Filling Card cize internetove plnenie karty.

Momentalne IFC zahrna:
1, nabijanie a predlzovanie casovych listkov a ich korekcie
2, plnenie elektronickej penazenky
3, blokovanie kariet

Netreba si to mylit s EFC - to je Emtest Fleet Control - dispecerske centrum, nema s IFC okrem podobnej skratky nic spolocne

2, Kde sa nachadzaju udalostne subory na strojceku?

Standartne je to /opt/emtest/var/

Niekedy ako napriklad v Kuvajte to moze byt vo vstupnych datach: /opt/emtest/var/spool/incoming/ - toto umiestnenie uz je velmi zriedkave

3, Aky nazov maju udaloste subory?

Standartne je to events.idx a events.dat

Pripadne je mozne sa stretnut aj s nazvami udalosti.idx a udalosti.dat (pozor na male pociatocne pismeno. Udalosti.dat je nieco ine) - je to povodny nazov udalostnych suborov, ktory bol zmeneny na events. Vlastne by sme sa s nazvom udalosti uz v praxi ani nemali stretnut.

Pripony .idx a .dat napovedaju, ze sa jedna o indexovane subory, kvoli rychlemu vyhladavaniu. .idx obsahuje utriedeny zoznam SNR kariet, pre ktore existuje udalost (1 alebo viac) a offset do datoveho suboru. V datovom subore su potom vsetky potrebne udaje o udalostiach. Nad indexovych suborom sa vyhladava pomocou binarneho vyhladavania (polenie intervalov).

4, Ako sa dostanu udalostne subory na strojcek?

Udalostne subory sa zvycajne na strojcek stahuju z websluzby cez GPRS, zriedkavejsie WIFI pripojenie. Stahovanie obvykle zacina pri vstupe do vydaja a konci pri vystupe z vydaja, ale je mozne v PrjConfigu nastavit, aby stahovanie zacalo uz pri nabehu strojceka. Stahuje sa vzdy v stanovenom intervale (obvykle 1 hodina) s tym, ze ak sa prave nachadzam na zastavke, tak sa nestahuje - je to kvoli tomu, ze v momente stahovania musia byt udalostne subory zamknute, aby nedochadzalo k nekorektnemu citaniu z prave zapisovaneho suboru a teda nie je v nich mozne ani vyhladavat. Na zastavkach nastupuju ludia a teda prave vtedy su spracovavane poziadavky na zapis udalosti. (V pripade, ze pride poziadavka na vyhladanie udalosti pre kartu a stahovanie prave bezi, vyhladanie je ukoncene s tym, ze ziadna udalost nebola najdena a spracovanie karty pokracuje dalej)

Dalsou moznostou je, ze sa udalosti nestahuju, ale su prenasane cez IntelKomunikaciu spolu s datami (ako externe data napr.). Vyzaduje si to zvlastne nastavenie v PrjConfigu. V takomto pripade sa udalosti prenasaju vzdy cele, nie iba prirastkove subory (vid bod 5).

Vo vseobecnosti plati, ze udalosti sa na strojcek dostavaju vzdy ako jeden subor (events - bez pripony) a az na mieste su rozdelene stahovacom na indexovu a datovu cast.

5, Co je to events_tmp.idx a events_tmp.dat v /opt/emtest/var/

Stahovanie udalostnych suborov je optimalizovane tak, ze sa nestahuju vzdy vsetky udalosti (cele subory), ale iba prirastky. To znamena, ze sa v uz stiahnutych suboroch najde najvyssie cislo udalosti a stahuju sa iba udalosti s cislom vyssim. events_tmp.idx a events_tmp.dat su prave tieto prirastkove subory. Tie su potom mergovane do udalostnych suborov.

6, Co je to ProcessedEvents.dat v /opt/emtest/var/

ProcessedEvents.dat je subor, v ktorom sa uchovavaju informacie o udalostiach uz zapisanych na kartu. Ku kazdej udalosti je tam zapisane jej ID a cas vykonania. (8B struktura 4+4B). Tento subor sa pri kazdom stahovani uploaduje do websluzby a zmaze sa.

7, Co vsetko treba urobit, aby sme pridali IFC do nasho projektu? (Pre vyvojarov)

7.1 - Najprv si do projektu includneme potrebne libky. Su to:

a, ecardevent - spracovanie udalostneho suboru a jeho struktur
b, evfileprocessor - zapisovanie udalosti na kartu
c, eventdownloader - stahovanie udalosti - ma zmysel iba pre hlavny linuxovy strojcek, citacka nestahuje udalosti, su na nu kopirovane

Tieto kniznice su zavisle na dataIO, platobnom a pod. takze nie vzdy je mozne pouzit najnovsiu verziu zo styxa (resp. treba skontrolovat projlibsy, ak je tam nejaky problem, bud si dvihnut svoje verzie, alebo treba vykompilit novu verziu). Navyse evfileprocessor ma osobitne verzie pre hlavny a citacku. Preto konkretne verzie bude lepsie prebrat so mnou (O.Benadik)

7.2 - Druhym krokom je rozbehnutie stahovania udalosti. Tyka sa hlavnej aplikacie linuxoveho strojceka, citacka bude popisana neskor. Revizorska citacka to riesi vlastnym sposobom.

Stahovanie zabezpecuje kniznica libeeventdownloader.
Pouzitie kniznice je jednoduche.
- Stahovanie sa spusta volanim EEventsCommMng::GetInstance().StartDownloading(0); Tuto metodu je treba volat uz pri nabehu aplikacie, alebo vstupe do vydaja, standartne sa to da nastavit v PrjConfigu. Najvhodnejsie to bude skopirovat z nejakeho projektu, kde to uz funguje - odporucam FareSystem/trunk
- Funkciu SetSlaveIP NIE JE potrebne volat, je to prezitok zo starych cias
- Ak bolo stahovanie spustene pri vstupe do vydaja, je vhodne ho pri odchode z vydaja zasa ukoncit volanim StopDownloading.
- Treba volat EEventsCommMng::GetInstance().SetIsOnBusstop( true/false ) - pri prichode/odchode zo zastavky - najlepsie opat skopirovat z trunkoveho OnBoardComputeru
- samozrejme treba mat nastavene potrebne veci v PrjConfigu, ked to budeme skusat

7.3 - Spracovanie udalosti ma na starosti extraOperation EEventFiller. Jedine, co treba, tak si ju skopirovat z trunkoveho strojceka, pridat do svojho projektu a nezabudnut zaregistrovat v ExtraOperationManagerovi. Pozor na to, ze EEventFiller sa trosku lisi na citacke a hlavnom, preto by bolo dobre ho kopirovat zo spravneho projektu (lisia sa zobrazovanim informacnej hlasky napr)
To by malo byt vsetko.

7.4 - Prenos udalosti na citacku. Ako uz bolo povedane, citacka si udalosti nestahuje sama (nema GPRS pripojenie), ale udalosti stahuje hlavny strojcek a po stiahnuti ich skopiruje na citacku. Preto jedine, co treba spravit na citacke je pridat potrebne skripty/binarky Su to:

Citacka (skopirujeme naprkilad z slave_trencin):
/opt/emtest/bin/event_copy - zamykanie suborov a kopirovanie
/opt/emtest/bin/copy_processed_events - to iste, ale s vykonanymi udalostami
/opt/emtest/etc/init.d/download_keys + prislusny symlink v rc.d - stiahnutie ssh klucov

Hlavny (skopirujeme napriklad z hlavny_pal_sk)
/opt/emtest/bin/copy_events_to_slave.sh - skript na skopirovanie suborov na citacku - checkne dostupnost citacky, skopiruje
/opt/emtest/bin/get_processed_events.sh - to iste, ale vykonane udalosti
/opt/emtest/etc/init.d/generate_keys + prislusny symlink v rc.d - generovanie ssh klucov

8, Preco mi spadne hlavna aplikacia po nabiti IFC udalosti na citacke?

Po nabiti udalosti na citacke sa zapisuje statistika a posiela sa na hlavny - ak su rozdielne verzie libedataoutput na citacke a na hlavnom, moze to sposobit pad aplikacie. Zaujimave je, ze pri kupe listka na citacke sa tiez zapisuje statistika a posiela na hlavny a ten nepada - pravdepodobne ide o to, ze pri IFC sa posiela statisticky objekt EUdalost a pad sposobuje len on

9, Nestahuju sa mi udalosti. Co s tym?

- Asi najcastejsi problem. Ma mnozstvo moznych pricin.

- najprv treba skontrolovat nastavenie v PrjConfigu. PrjConfig moze byt nahrany cez externe data, takze prednostne treba kontrolovat ten v /opt/emtest/var/spool/incoming/ Co treba mat nastavene je popisane tu na wiki. Obcas som sa stretaval s problemom, ze clovek, co si v PrjConfigu nieco prepisoval nechtiac pokazil jeho strukturu, tak mu ostalo nevalidne xml-ko, ktore sa uz samozrejme neda strojovo citat, pritom na pohlad vyzera vsetko ok. Preto je dobre skontrolovat strukturu xml-ka napriklad otvorenim v nejakom prehliadaci (funguje v exploreri, firefoxe aj novsich operach) - ak je tam nejaky syntakticky problem, prehliadac nas na to upozorni.

- ak je v PrjConfigu vsetko nastavene dobre, treba skusit pingnut IP servera, na ktorom sa nachadza nasa websluzba. Ak nejde ping, nejde samozrejme ani stahovanie. Na strojcekoch sa na internet pristupuje obvykle cez SIMku a GPRS - treba skontrolovat, ci mame v ifconfigu interface ppp0 - ak nie je, tak je daco v neporiadku so SIMkou. Ak sa tam interface ppp0 nachadza, tak to znamena, ze nasa SIMka 'nevidi' na nas server.

- ak ide ping, mozeme skusit nasledovnu vec:

     cd /tmp/
     wget http://192.168.11.97:81/ifcemcardwebsvc/ifcemcard.asmx

pokusime sa pristupit k websluzbe - k URL nastavenemu v PrjConfigu. Dobre je predtym zmenit si adresar na tmp, aby sme mali pravo zapisu. Nie je nevyhnutne, ale vyhneme sa matucim vypisom

V pripade nauspechu uvidime nieco ako:

     Connecting to 192.168.11.97:81 (192.168.11.97:81)                               
     wget: cannot connect to remote host (192.168.11.97): Network is unreachable 

alebo

     Connecting to 192.168.11.97:81 (192.168.11.97:81)
     wget: server returned error: HTTP/1.1 404 Not Found

Znamena to, ze v prvom pripade nemame pristup k danej adrese, v druhom pripade by sme aj pristup mali, ale URL je zla.

V pripade uspechu uvidime zrejme taketo nieco:

     Connecting to 192.168.11.97:81 (192.168.11.97:81)
     ifcemcard.asmx       100% |***********************************************************************************************************************************************|  9592  --:--:-- ETA

- treba skontrolovat, ci mame na strojceku nastaveny spravny zavod. Hlavne zavod == 0 moze byt problem, pripadne zavod, co nie je v databaze

- ak ide ping, ostava uz len nahliadnut do logov. Tie je vhodne si grepnut na EEventsCommMng a hladam taketo riadky:

     T [14:55:58-24.03.] IFC(14096) EEventsCommMng.cpp[617]: long int EEventsCommMng::GetIncrementalEventFile : Start Downloading..., IP = http://192.168.12.97:81/ifcemcardwebsvc/ifcemcard.asmx
     T [14:56:01-24.03.] IFC(14096) EEventsCommMng.cpp[708]: long int EEventsCommMng::GetIncrementalEventFile : +++++++ callig webservice failed
     E [14:56:01-24.03.] IFC(14096) EEventsCommMng.cpp[712]: long int EEventsCommMng::GetIncrementalEventFile : callig webservice GenerateEventFile failed, fault_string = No route to host

Tu vidim, ze som sa pokusal stahovat udalosti z danej URL, volanie websluzby zlyhalo s chybovou hlaskou 'No route to host' Po opatovnom skontrolovani URL sa obratime na kompetentnych :)

Dalsia zloba, ktoru je mozne zhliadnut v logoch je: GenerateEventFile result = n Toto znamena, ze som sa k webovej sluzbe pripojil (cize nie je problem so spojenim) ale websluzba mi vratila nejaku chybu. S tymto sa treba obratit na tvorcu WS Igora.

10, Udalosti sa stiahnu, ale maju velkost 12B indexovy subor a 0B datovy

Stiahli sa prazdne udalostne subory (12B v indexovom subore je hlavicka). Pravdepodobne nie je na strojceku nastaveny zavod. Udalosti sa vzdy stahuju pre konkretny zavod. Ak je na strojceku zavod 0, alebo hocijaky iny zavod, pre ktory nie su v databaze nijake udalosti, stiahnu sa prazdne subory.

11, Udalosti sa stahuju, ale nepribuda tam udalost, ktoru som vytvoril.

- Jedna moznost je, ze stahujem udalosti z inej databazy ako do ktorej udalosti pridavam :) - Druha moznost je, ze na danom strojceku uz boli stahovane udalosti pre iny zavod a udalostne subory tam ostali. Stahovanie funguje tak, ze sa najde najvyssie cislo udalosti v subore a stahuju sa len udalosti s cislom vyssim (kvoli minimalizacii objemu prenasanych dat). Udalosti z toho predchadzajuceho zavodu mohli mat vyssie cislo udalosti ako je ta nami pridana a teda sa vlastne nic nestahuje, lebo to vyzera, ze uz vsetko mam stiahnute. Pomoc je v tomto pripade jednoducha: staci zmazat udalostne subory zo strojceka.

12, Preco mi nenabije udalost penazenky?

Okrem mnozstva inych dovodov (neexistuje udalost na tuto kartu, nestahuju sa udalosti, neprenasaju sa udalosti na vedlajsi, ide o novy balicek, kde niekto/nieco IFC pokazil) sa casto vyskytuje pripad, ze nesedia cisla udalosti na karte a v subore. Ide o to, ze pri nabijani penazenky je pozadovana kontinuita nabijania - ak mam na karte cislo udalosti napriklad 9, jedina udalost, ktoru mozem zapisat je ta s cislom 10.

logoch to mozem vycitat z nasledujuceho riadku:

     "purseData->GetEventNumber() = %d, purseEvent->GetEventNumber() = %d"

PurseData su penazenkove data vycitane z karty, PurseEvent je udalost plnenia penazenky

13, Chyby pri prenose udalostnych suborov na citacku

  0     - OK 
        - kopirovanie prebehlo v poriadku                    
  11    - slave not reachable (ping failed)
         - najcastejsie preto, ze ta citacka nie je pripojena resp vobec neexistuje :) V HwConfigu byva zvycajne nastaveny maximalny pocet citaciek, v autobusoch ich realne moze byt menej. Kopirovanie na vsetky tie citacky, co su v configu a nie su v autobuse potom konci s chybou 11.
  12    - ssh connection failed (probably problem with ssh keys)
  - treba skontrolovat, ci na hlavnom strojceku je skript na generovaie klucov a na citacke skript na ich stahovanie.
  - vo vyssich verziach OS na mijolach sa pomenili adresare a symlinky na adresare, ktore obsahuju kluce, takze vznikla situacia, ked boli dva navzajom na seba ukazujuce symlinky a ziadny realny adresar. Vyriesi to skript master004 na generovanie klucov na hlavnom strojceku.
  - zaujimavy pripad bol na citacke, kde na systemovej particii uz nebolo dost miesta, aby sa tam stiahli ssh kluce (kilobyty radovo :)) - preto sa tam spustala dasia instancia ssh na zvlastnom porte (13579) na aplikacnej particii
  127   - command not found (event_copy not found on slave)
  - citacka neobsahuje programcek na kopirovanie udalosti. (musi tam byt program, pretoze tie subory treba pocas kopirovania zamykat). Treba sa obratit na autora balika.
  13-15 - return codes from event_copy
  - toto by ani nemalo nastavat v praxi.
  13 - zly pocet command line argumentov pre event_copy.
	printf( "4 parameters expected, exiting... \n" );
	printf( "parameter 1 = first file to lock \n" );
	printf( "parameter 2 = second file to lock \n" );
	printf( "parameter 3 = how many times will try to lock the files (until succeed) \n" );
	printf( "parameter 4 = timeout between tries (in miliseconds) \n" );
  14 - zlyhalo zamknutie prveho suboru
  15 - zlyhalo zamknutie druheho suboru
       Pri neuspesnom pokuse o zamknutie suboru sa chvilu spi a potom skusa znova. Vid command line argumenty event_copy trochu vyssie
       Skutocne hodnoty sa daju vycitat zo skriptu copy_events_to_slave.sh na hlavnom, standartne je to 5 pokusov s 400 milisekundovymi prestavkami.

14, Co je to Udalosti.dat?

V prvom rade treba povedat, ze subor Udalosti.dat (s velkym U) nema s IFC nic spolocne. Ide o subor, ktory sa na strojcek nahrava standartnou cestou s datami v cards.zip, rozbaluje sa do /opt/emtest/var/spool/incoming/ spracovava ho platobny a obsahuje napriklad informacie o povolenych zavodoch a blokovanych kartach (tzv stare blokovanie ktore v aplikacii zabezpecuje ExtraOperation CardEventBlock alebo BlockCard)

Dokumentacia k suboru Udalosti.dat:

Dokumentacia/Projekty_ISO/31_PlnenieKarty/Analyzy/PrirastkovySubor/EMCD02_ANA001_04_04_InternetovyPredaj-prirastky.doc

15, Moze v projekte fungovat stare a nove blokovanie subezne?

  1. stare blokovanie = Udalosti.dat
  2. nove blokovanie = IFC

Ano, moze. Obe blokovania sa navzajom nejako neovplyvnuju, obe funguju ako ExtraOperation (ktora z nich bude vykonana skor pravdepodobne zalezi od poradia vkladania do ExtraOperationManagera v konkretnej aplikacii). Pri oboch plati, ze neblokuju kartu, ak uz je zablokovana, takze to bude v praxi fungovat tak, ze prva z nich (nech je to uz ktorakolvek) ju zablokuje a druha nespravi nic okrem nejakej zbytocnej rezie s hladanim udalosti a vyhodnocovanim.

16, Ako zistim, ci je v subore udalost pre moju kartu?

Existuje prehliadac udalostnych suborov. Nachadza sa na mamute:
/WinADO_Soft/InterneEXE/IFC/IFC_PrehliadacUdalosti_*datum* //odporuca sa pouzivat ten s najvyssim datumom ;)
Tento prehliadac nacita udalostne subory, ktore sa nachadzaju v tom istom adresari ako exac a zobrazi ich nazvy. Po dvojkliku vypise vsetky udalosti utriedene podla SNR karty

17, Ake su velkosti zaznamov v udalostnom subore?

indexovy zaznam 12 B

blokovanie 39 B
penazenka 47 B
mesacnik 67 B

Takze prirastok 10 udalosti blokovania a 10 udalosti penazenky bude mat velkost 10*12 + 10*39 + 10*12 + 10*47 = 1100 B

18, Subeh stahovania udalostnych suborov a spracovania udalosti (nahravanie na kartu)

Pri update udalostneho suboru, ktory bezi na pozadi v intervale stanovenom v PrjConfigu moze teoreticky dojst k situacii, ze moze byt zamietnute spracovanie udalosti pri prilozeni karty. Prirastkove subory sa sice stahuju a zaroven merguju s hlavnym suborom udalosti bokom (na inej ceste), po skonceni mergovania su ale uz hotove presuvane na standartnu cestu a v tomto okamihu su pre aplikaciu nedostupne. Tento okamih trva pocas vykonavania systemoveho prikazu na presun suborov.

19, Reset udalostneho suboru

K resetu udalostneho suboru moze dojst dvoma sposobmi:

1, Reset iniciovany strojcekom

Raz za cas je potrebne vykonat precistenie udalostneho suboru a to tak, ze sa stiahne cely nanovo. Je to z dovodu, ze pri stahovani prirastkov sa uz vykonane udalosti mazu iba z indexoveho suboru, v datovom ostavaju a teda by casom iba narastal. Mazat udalosti z datoveho suboru nie je mozne kvoli casovej narocnosti. Preto v stanovenom intervale (nastavenom v PrjConfigu ) spravi strojcek to, ze po standartnom dotiahnuti prirastku si zacne bokom stahovat cely udalostny subor nanovo. Pocas toho je 'stary' udalostny subor stale k dispozicii a nahravanie udalosti funguje. Ked sa cely subor dotiahne, tak sa stare subory nahradia novymi. To je v podstate jediny moment, kedy su udalosti nepristupne pre nahravanie.

2, Reset iniciovany serverom

Ak je to potrebne, je mozne vyvolat reset udalostneho suboru aj zo strany servera. V tomto pripade to funguje tak, ze strojcek si v stanovenom intervale vypyta prirastok, ale namiesto neho dostane cely udalostny subor. Tento subor ma v hlavicke poznaceny priznak, ze ide o cely subor, nielen prirastok a preto si ho strojcek potom nemerguje, ale prepise si nim svoje subory. Co sa tyka dostupnosti udalostnych suborov je tento sposob omnoho nevhodnejsi, pretoze spracovanie udalosti je pozastavene na cely cas stahovania (moze byt aj 1/2 hodina).

20, Prerusenie stahovania

Ak je stahovanie suborov z nejakeho dovodu prerusene (napriklad kvoli vypadku GPRS siete), neskor uz nie je mozne v tomto stahovani pokracovat, zacina sa vzdy od zaciatku.

21, Nahravanie 'predgenerovaneho' udalostneho suboru na revizorsku citacku

Pod pojmom predgenerovany udalostny subor sa rozumie to, ze na serveri bezi sluzba, ktora pravidelne generuje aktualny udalostny subor. Tento subor je potom mozne napr. pribalit do cards.zip a rozohravat na strojceky, alebo ho pridat medzi revizorske data a rozohravat na revizorske citacky. Tento sposob je vhodny vtedy, ak nie je mozne stahovat udalosti na zariadeni cez GPRS, alebo je treba minimalizovat objem prenesenych dat - udalostny subor sa dostane na zariadenie predgenerovany a zariadenie si potom stahuje uz iba prirastky.

V pripade revizorskej citacky je postup jednoduchy: staci vygenerovany udalostny subor nahrat na server do adresara …..\EMT_BinData\AuditorData\ pod nazvom 'udalosti' (male 'u', bez pripony). Odtial sa do revizorskej citacky nahra spolu s datami pri vlozeni citacky do kolisky. Pri prihlaseni revizora sa subor skopiruje z \Flash Disk\EMTest\AuditorData\ (miesto, kde sa na revizorskej nachadzaju data) na miesto spracovania (\Built-in Storage\RevizorskaCitacka\), rozdeli sa na .idx a .dat cast a ulozi pod nazvom Events.*

Nie je potrebne nic nastavovat do konfigov.

22, Nahravanie udalosti cez WIFI

Udalostny subor je mozne nahravat do strojceka aj spolu s datami - ak sa pribali do externych dat. Zvyklo sa pribalovat do cards.zip, teraz by sa uz malo do blacklist.zip.