Sustav za udaljeno ispitivanje mjernih instrumenata1. Uvod Znanost o mjerenju je vrlo bitan aspekt...
Transcript of Sustav za udaljeno ispitivanje mjernih instrumenata1. Uvod Znanost o mjerenju je vrlo bitan aspekt...
SVEUCILIŠTE U ZAGREBUFAKULTET ELEKTROTEHNIKE I RA CUNARSTVA
DIPLOMSKI RAD br. 022
Sustav za udaljeno ispitivanje
mjernih instrumenataHrvoje Zeba
Zagreb, listopad 2011.
iii
Umjesto ove stranice umetnite izvornik Vašeg rada.
Da bi ste uklonili ovu stranicu obrišite naredbu\izvornik.
SADRŽAJ
1. Uvod 1
2. Umjeravanje 2
2.1. Udaljeno umjeravanje . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3. Opis eCal sustava 4
3.1. Arhitektura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2. Komponente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.1. Komunikacijski protokol . . . . . . . . . . . . . . . . . . . . 5
3.2.2. Kripto modul . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2.3. Remote Procedure Call komponenta . . . . . . . . . . . . . . 10
3.2.4. Arhitektura poslužitelja . . . . . . . . . . . . . . . . . . . . . 11
3.2.5. Arhitektura klijenta . . . . . . . . . . . . . . . . . . . . . . . 13
3.2.6. GPIB sabirnica . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.7. eCal skriptni jezik . . . . . . . . . . . . . . . . . . . . . . . 16
4. Pregled Virtual Instrument Software Architecture specifikacije 17
4.1. Virtual Instrument Software Architecture sucelje . . . . . . . . . . . 17
4.2. Nacini rada sa aspektima . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3. Adresiranje uredaja unutar VISA specifikacije . . . . . . . . . . . . . 19
5. Pregled Java Native Interface specifikacije 21
5.1. Nacin rada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2. Povezivanje sa programskom potporom . . . . . . . . . . . . . . .. 22
6. Povezivanje VISA specifikacije sa eCal sustavom 24
6.1. Potrebne izmjene . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2. Komunikacija VISA protokolom . . . . . . . . . . . . . . . . . . . . 25
6.2.1. void openSession() . . . . . . . . . . . . . . . . . . . . . . . 25
v
6.2.2. void closeSession() . . . . . . . . . . . . . . . . . . . . . . . 26
6.2.3. String[] scanDevices() . . . . . . . . . . . . . . . . . . . . . 26
6.2.4. int openDevice(String instrAddress) . . . . . . . . . . . .. . 26
6.2.5. void clearDevice(int sessionId) . . . . . . . . . . . . . . . .. 26
6.2.6. String sendCommand(int sessionId, String cmdString) . . . . 26
6.2.7. void writeCommand(int sessionId, String cmdString). . . . . 26
6.2.8. void lockDevice(int sessionId) . . . . . . . . . . . . . . . . .26
6.2.9. void unlockDevice(int sessionId) . . . . . . . . . . . . . . .. 27
6.2.10. Obuhvacanje funkcionalnosti . . . . . . . . . . . . . . . . . . 27
6.3. Relevantne izmjene HSM klase . . . . . . . . . . . . . . . . . . . . . 27
6.4. Demonstracija rada eCal sustava sa VISA protokolom . . . .. . . . . 28
7. Zaklju cak 32
Literatura 33
A. Primjer jednostavne korisnicke skripte 35
B. Ispis visa.java datoteke 36
C. Ispis visa.cpp datoteke 38
D. Izmjene icalClient.java datoteke - Unified Diff format 44
vi
1. Uvod
Znanost o mjerenju je vrlo bitan aspekt svakodnevnog životai znanosti. Omogu-
cuje nam razmjenu svih dobara koja se na bilo koji nacin mogu mjeriti jer nam daje
postupke kojima je moguce objektivno odrediti te mjerene velicine. Razvojem teh-
nologije, otvaraju se mogucnosti za nove postupke mjerenja pa se znanost o mjerenju
neprestano usavršava [1].
Da bi se svi oni, koji sudjeluju u razmjeni mjerenih dobara, mogli sporazumjeti oko
mjera, potrebno je uvesti referentne mjere. U tu svrhu uveden je medunarodni metricki
sustav mjernih jedinica (SI).
Tocnost i ispravnost mjerenja su izuzetno važnicimbenici. U svakodnevnom ži-
votu o njima ovisi odredivanje vrijednosti dobara koja se razmjenjuju, a u znanosti o
njima ovisi kvaliteta zakljucaka dobivenih odredenom metodologijom. Ovicimbenici
ovise o tocnosti i ispravnosti uredaja ili etalona koji se koriste u postupku mjerenja pa
i oni sami moraju biti tocni i ispravni. Da bi se to postiglo, navedene mjerne uredaje je
potrebno umjeriti, a etalone izravno usporediti [1].
Iz navedenih razloga, bitno je uspostaviti hijerarhiju mjerodavnih tijela zaduže-
nih za umjeravanje koja uživaju povjerenje svih ukljucenih u taj proces. Hijerarhijska
struktura mjerodavnih tijela daje mjernu slijedivost od najviše medunarodne razine pa
do krajnjih mjeriteljskih laboratorija. Prilikom umjeravanja uredaja ili izravne uspo-
redbe etalona niže razine, izdaju se potvrde, tj. umjernice.
Razvoj komunikacijskih mreža i racunalnih tehnologija daje nove mogucnosti u
postupcima umjeravanja koji bi mogli zaobici nedostatke danas korištenih postupaka.
1
2. Umjeravanje
Da bi se mjerni uredaj umjerio, mora se izdvojiti iz okoline u kojoj vrše mjerenja i
transportirati do laboratorija u kojemu se vrši umjeravanje. Ova metoda ima nekoliko
nedostataka. Najocitiji je da se instrument ne umjerava u okolini u kojoj se koristi,
a u kojoj mogu postojati specificni cimbenici koji utjecu na rad instrumenta i stvaraju
sistematsku pogrešku. Ticimbenici mogu biti temperatura, relativna vlažnost i pritisak
zraka, razna elektromagnetska zracenja, itd. Nadalje, transport uredaja može imati
nepredvidljive posljedice na tocnost i ispravnost mjernog uredaja te unosi dodatnu
mjernu nesigurnost.
2.1. Udaljeno umjeravanje
Ideja udaljenog umjeravanja se zasniva na mogucnosti transporta mjernog uredaja
koji se koristi za umjeravanje na lokaciju gdje se nalazi uredaj koji treba umjeriti. Da
bi se održala mjerna slijedivost koja implicitno postoji kod standardne metode, uredaj
koji se transportira iz laboratorija mora biti adekvatno zašticen od vanjskihcimbenika
koji mogu utjecati na postupak umjeravanja te cijeli postupak mora biti u što vecoj
mjeri automatiziran da bi se smanjila mogucnost ljudske pogreške [1].
Racunalne tehnologije današnjice nam omogucavaju realizaciju ovakvog sustava.
Mobilne mreže u kombinaciji sa klijent-poslužitelj paradigmom omogucavaju pokret-
ljivost i neovisnost o lokaciji umjeravanja. Sustav javnihkljuceva (eng. Public Key
Infrastructure - PKI) omogucava zaštitu mjernog postupka od neovlaštenog uplitanja
te mjernu slijedivost. Komponente za povezivanje mjernih uredaja sa racunalom omo-
gucavaju njihovo kontroliranje i pracenje kroz automatizirana ili polu-automatizirana
programska rješenja. Razvoj skriptnih jezika poput Javascript-a i jednostavnost njiho-
vog povezivanja sa ostalim programskim rješenjima omogucuje prilicno jednostavno
definiranje i širok spektar postupaka umjeravanja.
2
Udaljeno umjeravanje zahtjeva promjenu paradigme umjeravanja, ali u konacnici
smanjuje troškove vlasnicima mjernih uredaja i pojednostavljuje cijeli postupak umje-
ravanja.
3
3. Opis eCal sustava
Koristeci tehnologije navedene u proslom poglavlju, kao rezultat višegodišnjeg
projekta na Zavodu za osnove elektrotehnike i elektricka mjerenja Fakulteta elektro-
tehnike i racunarstva Sveucilišta u Zagrebu razvijeno je programsko okružje "eCal" za
podršku udaljenom ispitivanju i umjeravanju mjernih uredaja. Taj sustav, koji je po-
drobnije opisan u doktorskoj disertaciji [1], automatizira postupak umjeravanja mjer-
nih uredaja koja se mogu obavljati na lokaciji gdje se sam uredaj nalazi, bez potrebe
za njegovim preseljenjem u umjerni laboratorij.
Postupak umjeravanja u opcem slucaju se svodi na spajanje mjernih uredaja za
odredeni postupak umjeravanja, prikljucivanje uredaja na prijenosno racunalo, autori-
zaciju nadležne osobe u sustavu te pokretanje procedure za taj postupak umjeravanja
[1].
3.1. Arhitektura
Sustav je organiziran kao modificirana klijent-poslužitelj arhitektura u kojoj i pos-
lužitelj i klijent imaju aktivnu ulogu. Poslužiteljski diosustava je izraden u C++ pro-
gramskom jeziku [2] i projektiran je za operacijske sustavesukladne POSIX normi
(eng. Portable Operating System Interface for Unix) [3]. Koristi više-dretvenost za
obradu zahtjeva sa klijenata i izvršavanje skripti za umjeravanje te MySQL kao bazu
podataka.
Klijentski dio sustava je izraden u Java programskom jeziku [4]. Sucelje klijent-
skog dijela prikazuje HTML sadržaj (eng. Hypertext Markup Language) dohvacen sa
poslužitelja za što se koristi Cobra komponenta Lobo projekta [5]. Klijent djeluje kao
proxy izmedu skripti za umjeravanje koje se izvršavaju na poslužitelju i lokalno spoje-
nih mjernih uredaja.
4
Komunikacija se odvija preko TCP/IP sucelja (eng. Transmission Control Proto-
col/Internet Protocol) [6], dvosmjerna je i zašticena posebno definiranim protokolom
slicnim SSL-u (eng. Secure Sockets Layer) [7]. U smjeru klijentposlužitelj, klijent
šalje zahtjeve za objektima na poslužitelju koji mogu biti HTML sadržaj ili skripta
koja se treba izvršiti. Klijent nema nacina znati kakav je objekt u pitanju. Posluži-
telj prema klijentu šalje RPC zahtjeve [8] koji mogu biti vezani za komunikaciju sa
mjernim uredajima ili za kontrolu samog klijenta.
3.2. Komponente
U ovom poglavlju su opisane glavne komponente koje sacinjavaju eCal sustav. Re-
lacije u bazi te dio sustava koji su zaduženi za manipulacijupodacima u ovom kontek-
stu nisu bitni pa se nece razmatrati.
3.2.1. Komunikacijski protokol
Protokol je podijeljen u dvije faze. U prvoj fazi se autorizira klijent i razmje-
njuju kljucevi te se provjerava dostupnost RPC (eng. Remote Procedure Call) funk-
cija na klijentu. Druga faza obuhvaca razmjenu RPC zahtjeva i odgovora u smjeru
poslužitelj-klijent te razmjenu zahtjeva za objektima i vracanjem objekta u smjeru
klijent-poslužitelj. Redoslijed poruka po fazama je prikazan na slici 3.1.
Ukoliko pri dešifriranju bilo koje od poruka dode do greške, komunikacija se pre-
kida. U nastavku su opisane strukture pojedinih poruka.
Digital seal - digitalna omotnica
Digitalna omotnica se pojavljuje u nekoliko poruka koje se javljaju u eCal sus-
tavu, a ima opci oblik koji je opisan tablicom 3.1. Korišteni kriptografski algoritmi
su AES (eng. Advanced Encryption Standard) u CBC nacinu rada (eng. Cipher-block
chaining) te RSA (eng. Rivest, Shamir and Adleman).
Digital seal - podaci o klijentu
Tablica 3.2 prikazuje polja, njihove velicine te opise uDigital seal - podaci o ko-
risnikuporuci. Sadržaj digitalne omotnice u ovoj poruci je prikazan tablicom 3.3.
5
Slika 3.1: Redoslijed poruka u eCal komunikacijskom protokolu
Tablica 3.1: Digital seal - opci oblik
Naziv Velicina u byte-ovima Opis
enc_msg_size 4 Velicina enc_msg dijela
enc_msg enc_msg_size AES-om enkriptirana poruka
enc_iv_size 4 Velicina enc_iv dijela
enc_iv enc_iv_size RSA-om kriptiran AES kljuc i IV vektor
enc_sha1_size 4 Velicina enc_sha1 dijela
enc_sha1 enc_sha1_size RSA-om kriptiran SHA1(enc_msg)
Digital seal - podaci za inicijaciju veze
Tablica 3.4 prikazuje polja, njihove velicine te opise uDigital seal - podaci za
inicijaciju vezeporuci. Sadržaj digitalne omotnice u ovoj poruci je prikazan tablicom
3.5.
Izgled poruka u drugoj fazi
Drugu fazu karakteriziracinjenica da poruke i odgovori imaju isti oblik. Taj oblik
je opisan tablicom 3.6. Razlikuje ih se potypepolju cije su vrijednosti opisane u tablici
3.7. info polje daje dodatne informacije, ukoliko su potrebne.
Ukoliko se radi o zahtjevu za objektom, udatapolju se nalazi putanja do zahtjeva-
6
Tablica 3.2: Digital seal - podaci o klijentu
Naziv Velicina u byte-ovima Opis
size 4 Velicina content dijela
content size Sadržaj digitalne omotnice
Tablica 3.3: Sadržaj digitalne omotnice u poruciDigital seal - podaci o klijentu
Naziv Velicina u byte-ovima Opis
challenge 4 Broj koji je poslužitelj poslao nakon inicijalizacije veze
user_id 20 Identifikacijska oznaka korisnika
rpc_xml_size 4 Velicina rpc_xml dijela
rpc_xml rpc_xml_size Klijentska XML RPC struktura
nog objekta. Uinfo polju se mogu naci dvije vrijednosti. Odnose se na situaciju u kojoj
je zahtjevani objekt skripta, a neka druga skripta je vec aktivna. U ostalim situacijama
ovo polje nema efekta. Moguce vrijednosti su:
– 0 – samo vrati prikladan odgovor,
– 1 – zaustavi aktivnu skriptu i pokreni zahtjevanu.
Ako je u pitanju odgovor na taj zahtjev, onda seinfo polju nalazi informacija o
statusu zahtjeva. Moguci statusi su:
– 0 – objekt je HTML dokument i nalazi se udatapolju,
– 1 – objekt je skripta koja je upravo pokrenuta (datapolje je prazno),
– 2 – objekt nije pronaden (datapolje je prazno),
– 3 – objekt je skripta ali je neka druga skripta aktivna pa se ništa nije desilo.
U RPC zahtjevu i odgovoru,info polje nema efekta. XML (eng. Extensible Markup
Language) RPC zahtjev i odgovor se nalaze udatapolju.
3.2.2. Kripto modul
Da bi se osigurala potpuna zaštita i slijednost mjernog postupka, na uredajima je
potrebno imati poseban modul koji se nalazi izmedu uredaja i sabirnice na koju je spo-
jen. Uloga mu je da u sebi drži identifikacijske oznake uredaja te da sa poslužiteljem
preko klijenta na kojega je spojen, ali bez njegovog utjecaja, uspostavi zašticenu vezu.
HSM modul (eng. Hardware Security Module) može raditi u zašticenom nacinu
rada u kojemu kriptira i dekriptira sav promet prema mjernomuredaju te može raditi u
7
Tablica 3.4: Digital seal - podaci za incijaciju veza
Naziv Velicina u byte-ovima Opis
size 4 Velicina content dijela
content size Sadržaj digitalne omotnice
Tablica 3.5: Sadržaj digitalne omotnice u poruciDigital seal - podaci za inicijaciju veze
Naziv Velicina u byte-ovima Opis
challenge 4 Broj koji je poslužitelj poslao nakon inicijalizacije veze
aes_key_size 4 Velicina AES kljuca u bitovima
aes_key aes_key_size / 8 AES kljuc za kriptiranje prometa
aes_iv 16 CBC Initialization vektor
pass-throughnacinu u kojemu propušta sav promet prema uredaju.
Ukoliko se modul nalazi u zašticenom nacinu rada, u nezašticeni je moguce preci
iskljucivo pozivomhsm_clear()funkcije.
Naredbe koje HSM modul razumije imaju oblik:*HSM:cmd:arg!. arg su argu-
menti za pojedinu naredbu dokcmdmože biti:
– ID - zahtjev za identifikacijom,
– AUTH - zahtjev za autorizacijom,
– COMM - naredba koja se treba proslijediti uredaju,
– SIGN - zahtjev za potpisivanjem podataka koji su prošli prema i od uredaja
Odgovori imaju opci oblik *HSM:response!gdje responseovisi o naredbi koja se
izvršila. Moguca stanja i njihovi prijelazi unutar HSM modula se mogu vidjeti na slici
3.3. U slucaju greške, HSM modul vracaERRORunutarresponsepolja.
ID naredba
ID naredba ne prima nikakve argumente te uresponsepolju vraca znakovni niz
identifikacije uredaja.
AUTH naredba
AUTH naredba kao argument uzimaBase64kodiranu digitalnu omotnicu. Opci
izgled omotnice je opisan u poglavlju 3.2.1. Vrijednosti sadržane u omotnici su dane
tablicom 3.8. HSM modul potom odgovara drugom digitalnom omotnicom koja je
8
Tablica 3.6: Oblik poruke sa zahtjevima i odgovorima
Naziv Velicina u byte-ovima Opis
sequence 4 Redni broj poruke ili odgovora
info 4 Dodatne informacije o poruci
type_size 1 Tip poruke
data_size 4 Velicina data dijela
data data_size Sadržaj poruke ili odgovora
Tablica 3.7: Moguci tipovi poruka
Vrijednost Opis
1 Zahtjev za objektom
2 Odgovor na zahtjev za objektom
3 RPC zahtjev
4 RPC odgovor
opisana u tablici 3.9. Odgovor se nalazi uresponsepolju i kodiran je saBase64algo-
ritmom [9]. Nakon izmjene ovih poruka komunikacija izmedu HSM modula i poslu-
žitelja je zašticena. Redoslijed izmjene poruka se može vidjeti na slici 3.2.
Tablica 3.8: Sadržaj digitalne omotnice u argumentima AUTH naredbe
Naziv Velicina u byte-ovima Opis
challenge 4 Slucajni broj koji generira poslužitelj
aes_key 16 AES kljuc za kriptiranje komunikacije
aes_iv 16 CBC Initialization vektor
Tablica 3.9: Sadržaj digitalne omotnice uresponsepolju AUTH naredbe
Naziv Velicina u byte-ovima Opis
challenge 4 Slucajni broj koji dobiven od poslužitelja
COMM naredba
Ova naredba kao argument prima podatke enkriptiraneAES[10] kljucem postav-
ljenim pri AUTH naredbi te kodiraneBase64algoritmom. Dekriptirani podaci se šalju
uredaju. Njegov odgovor se enkriptira istimAESkljucem te se kodiraBase64algorit-
mom i šalje se poslužitelju uresponsepolju.
SIGN naredba
SIGN naredba uresponsepolju vraca SHA-1sumu podataka koji su prošli kroz
HSM modul. TaSHA-1suma je enkriptiranaRSA[11] algoritmom koristeci privatni
kljuc modula te kodiranaBase64algoritmom.
9
Slika 3.2: Redoslijed poruka pri AUTH naredbi
Slika 3.3: Stanja i njihovi prijelazi u HSM modulu
3.2.3. Remote Procedure Call komponenta
RPCje realiziran kaoXML (eng. eXtensible Markup Language) struktura zahtjeva
i odgovora. Podržava jednostavne tipove podataka kao što suinteger, string i float te
hijerarhije struktura istih.
Klijent i poslužitelj imaju popisRPCfunkcija te se prilikom uspostave veze ti po-
pisi usporeduju. Ukoliko klijent nema svu funkcionalnost koju poslužitelj zahtjeva,
dolazi do prekidanja veze.
Sintaksa i, do odredene mjere, semantika se provjeravajuDTD-om (eng. Document
Type Definition) [12] koji je naveden u nastavku.
<!DOCTYPE rpc [
<!ELEMENT rpc (function+)>
10
<!ELEMENT function (item*)>
<!ELEMENT item (#PCDATA|item)*>
<!ATTLIST rpc version CDATA #REQUIRED>
<!ATTLIST function name ID #REQUIRED>
<!ATTLIST item name CDATA #REQUIRED>
<!ATTLIST item type (string|integer|float|struct) #REQUIRED>
]>
Ovaj RPC podržava primitivne tipove i hijerarhijske strukture primitivnih tipova.
Popis RPC funkcija koje poslužitelj zahtjeva su navedene u nastavku:
– client_display() – prikaži odredeni objekt unutar klijentskog sucelja,
– client_quit() – bezuvjetno zaustavljanje klijenta,
– hsm_scan() – pretraži sabirnicu i vrati popis pronadenih mjernih uredaja,
– hsm_send() – pošalji naredbu uredaju i vrati odgovor,
– hsm_write() – pošalji naredbu uredaju bezcekanja na odgovor,
– hsm_clear() – resetiraj uredaj,
– client_input_float() – zahtjevaj od klijeta unos broja s pomicnim zarezom,
– client_input_integer() – zahtjevaj od klijenta unos cijelobrojnog broja,
– client_input_string() – zahtjevaj od klijenta unos znakovnog niza,
– client_msgbox() – prikaži na klijentu prozor sa zadanom porukom.
3.2.4. Arhitektura poslužitelja
U ovom poglavlju su opisani bitniji objekti korišteni pri realizaciji poslužiteljskog
dijela eCal sustava te nacini na koji su povezani. Slika 3.4 opisuje protok podataka
kroz poslužitelj nakon autorizacije klijenta.
Slika 3.4: Protok podataka kroz poslužitelj nakon autorizacije klijenta
Vecina komunikacije medu objektima ide preko redova poruka implementiranih u
message::queue klasi.
11
icalAES, icalRSA i icalSeal klasa
Sva enkripcija saAESodnosnoRSAalgoritmima ide preko instanci ovih klasa. Do-
datno, uicalSealklasi je implementirana funkcionalnost digitalne omotnice. Detalje
su opisani u 3.2.1. poglavlju.
icalDatabase klasa
Kroz ovu klasu je realizirana komunikacija sa bazom. Implementira potrebne ope-
racije nad bazom pa su svi potrebniSQLupiti na jednom mjestu.
icalComm klasa
Ova klasa služi za obuhvacanje funkcionalnosti za komunikaciju sa klijentom preko
TCP sucelja. Sposoban je komunicirati ustreami u blocknacinima rada.Streamna-
cin se koristi za komunikaciju sa klijentom dok traje autorizacija dok seblockkoristi
nakon autorizacije kada se postaviAESkljuc za enkripciju kanala.
icalServer klasa
Nakon inicijalizacije potrebnih struktura i povezivanja na bazu, poslužiteljceka
zahtjeve za povezivanjem na TCP sucelju preko instance opisaneicalCommklase.
Kada zahtjev od klijenta dode, instancira seicalEngineklasa koja preuzima daljnju
komunikaciju sa klijentom, aicalServerinstanca nastavljacekati na nove zahtjeve.
icalEngine klasa
Nakon instanciranja,icalEngineobjekt inicira autorizaciju klijenta. Ukoliko je
autorizacija uspješna,icalEngineinstancira, izmedu ostalih,icalHttp te icalScriptklase.
Nakon toga zapocinje petlju u kojojceka zahtjeve za objektima od klijenta. Kada zah-
tjev dode, icalEnginega proslijeduje instanciicalHttp klase. Ako se radi o odgovoru
naRPCzahtjev, odgovor se prosljeduje instanciicalRPCklase odakle se to prosljeduje
u skriptu koja je napravilaRPCzahtjev.
icalHttp klasa
Instance ove klase su zadužene za prihvacanje zahtjeva za objektima, provjeru dos-
tupnosti objekta klijentu te provjeru u kojoj se odreduje da li je objekt skripta ili ne.
Ukoliko se ne radi o skripti, objekt se neizmijenjen vraca klijentu. Ako je traženi
12
objekt skripta, ona se predaje instanciicalScript klase koja je izvršava te se klijentu
vraca odgovarajuci odgovor.
icalScript klasa
Instance ovih klasa su zadužene za izvršavanje skripti te kontrolu njihova izvršava-
nja.
modClient klasa
Instance ovih klasa skriptama na raspolaganje stavljaju RPCfunkcije koje klijent
ima. Popis funkcija uz kratki opis se može naci u poglavlju 3.2.3.
modServer klasa
Instance ovih klasa skriptama na raspolaganje stavljaju funckije potrebne za kon-
troliranje poslužitelja i pristup bazi.
icalRPC klasa
Instanca ovog klasa služe za transformaciju memorijskih struktura u ekvivalentne
XML RPC zahtjeve i obratno te provjeru njihove ispravnosti s obzirom na definiciju.
Detalji RPC sustava su navedeni u poglavlju 3.2.3.
3.2.5. Arhitektura klijenta
U ovom poglavlju su opisani bitni objekti korišteni pri realizaciji klijentskog dijela
eCal sustava te nacini na koji su povezani. Slika 3.5 prikazuje protok podataka kroz
instance klasa nakon autorizacije.
Slika 3.5: Protok podataka kroz instance klasa u klijentu nakon autorizacije
13
icalAES, icalRSA, icalSeal, icalComm i icalRPC
Instance ovih klasa su ekvivalentne onima u poslužiteljskom dijelu sustava, ali su
implementirane u Java programskom jeziku.
Vecina komunikacije medu instancama klasa ide preko redova poruka implementi-
ranih u icalMessage::Queue klasi.
icalClient klasa
Instanca ove klase obuhvaca funkcionalnost klijenta. U njoj su implementirane
RPC funkcije te komunikacija sa poslužiteljem iGPIB (eng. General Purpose Inter-
face Bus) sabirnicom. Nakon instanciranja pokušava se povezati sa poslužiteljem i
autorizirati se. Ukoliko je autorizacija uspješna, instancira icalBrowser komponentu te
ulazi u petlju koja je zadužena za obradu RPC zahtjeva i obraduzahtjeva za prosljedi-
vanjem odgovora na zahtjev za objektima.
HSM klasa
Ova klasa je definirana unutar icalClient klase a implementira funkcionalnost po-
trebnu za komunikaciju sa mjernim uredajima tehsm_*RPC pozive.
icalBrowser klasa
Instanca ove klase je zadužena za prikaz HTML sadržaja, a nadogradnja je COBRA
komponente iz Lobo projekta.
HSM emulacija
S obzirom da HSM modul trenutno nije u potpunosti realiziran, u klijentu je im-
plementirana emulacija koja potrebne podatke o uredaju uzima iz konfiguracijske da-
toteke. Instance ove klase obraduju zahtjeve za HSM naredbama tecuvaju stanja po-
jedinog mjernog uredaja.
3.2.6. GPIB sabirnica
GPIB (eng. General Purpose Interface Bus) sabirnicu je razvio Hewlett-Packard
1975. godine pod nazivomHewlett-Packard Interface Bus. Radi se o 8-bitnom para-
lelnom sucelju koje može adresirati do 15 instrumenata po jednoj upravljackoj jedinici
14
na sabirnici. Sabirnica koristi 16 aktivnih vodova. Ostatak, od njih 24, je spojeno
na masu. Podijeljeni su u tri grupe. Osam ih se koristi za prijenos podataka, tri za
sinkronizaciju veze, a preostalih 5 za adresiranje sabirnice. Uredaji na sabirnici mogu
imati tri uloge: upravljacka (eng. controller), govornicka (eng. talkers) i slušacka (eng.
listeners). Izvorno je standard podržavao brzine do 1Mbit/s što je kasnije prošireno na
10Mbit/s. Brzine nisu odredene samim protokolom niti je prijenos podataka nužno sin-
kroniziran, vec je sve prepušteno instrumentima koji po sabirnici razmjenjuju podatke
[13].
Godinama se održala kao vodece rješenje za povezivanje mjerne opreme ali su se
razvojem racunalne industrije razvila nova, brža, jeftinija i prihvacenija rješenja. Neka
od tih rješenja ukljucuju USB (eng. Universial Serial Bus) i LAN (eng. Local Area
Network).
General Purpose Interface Bus sucelje
Programska potpora za GPIB sabirnicu daje nekoliko funkcija koje se mogu koristit
[14]. Te funkcije su:
– scanDevices() – pretražuje sabirnicu i vraca popis pronadenih uredaja,
– openDeviceImpl() – uspostavlja vezu sa zadanim uredajem,
– clearDeviceImpl() – raskida vezu sa zadanim uredajem,
– sendCommandImpl() – šalje naredbu uredaju i ceka rezultat,
– writeCommandImpl() – šalje naredbu uredaju i neceka rezultat.
Slika 3.6: Stanja uredaja na GPIB sabirnici
Dijagram stanja uredaja se može vidjeti na slici 3.6. Programska potpora koja
omogucuje korištenje ovih funkcija u Java programskom jeziku obuhvaca ovu funkci-
onalnost unutar klasa koje pojednostavljuju korištenje. Te klase su:
15
– GPIBDriver – apstraktna klasa koja obuhvaca komunikaciju sa sabirnicom i
uredajima,
– WindowsGPIBDriver – klasa koja implementira funkcionalnost GPIBDriver
klase,
– GPIBEnumerator – klasa koja obuhvaca funkcionalnost enumeratora nakon
pretraživanja sabirnice,
– GPIBDeviceIdentifier – klasa koja implementira reprezentaciju uredaja te služi
kaofactoryklasa za pretraživanje sabirnice i instanciranje GPIBDevice klase,
– GPIBDevice – klasa koja implementira komunikaciju sa pojedinim uredajem.
Adrese na GPIB sabirnici su cjelobrojni brojevi pa su i identifikacije uredaja unutar
eCal sustava cijeli brojevi.
3.2.7. eCal skriptni jezik
Skriptni jezik koji se koristi u eCal sustavu je Mozillina implementacija Javascript
jezika [15] proširena funkcijama potrebnim za izvedbu udaljenog mjerenja.
Ova implementacija je ekvivalentna onima koje se koriste uMozilla Firefox web
pregledniku pa postoji širok spektar dokumentacije na internetu. Stoga, nije potrebno
ulaziti u detalje jezika.
Sustav je organiziran tako da se vecina posla oko pretraživanja sabirnice, identifika-
cije uredaja i njihove autorizacije obavlja u skriptama koje su skrivene od korisnika. U
skripti za rad sa uredajima je potrebno definiraticalibrate() funkciju. Isto je potrebno
definirati varijabluhsm_mapu kojoj se navodi opis i grupa kojoj uredaji pripadaju.
Tu informaciju sustav koristi pri slaganju okoline prije nego izvrši potrebnu skriptu.
Primjer jednostavne testne skripte je naveden u Dodatku A.
16
4. Pregled Virtual Instrument
Software Architecture specifikacije
Skraceno VISA, ova specifikacija definira nacin na koji se vrši komunikacija sa
mjernim uredajima spojenim na racunalo. Široko je prihvacena pa postoji raspros-
tranjena programska potpora koja komunikaciju sa raznim sabirnicama za spajanje
mjernih uredaja transformira u jedinstven nacin komunikacije propisan specifikacijom.
VISA obuhvaca, izmedu ostalih, funkcionalnost GPIB, USB i LAN sucelja što bitno
olakšava izradu programske potpore za kontrolu i nadziranje mjernih uredaja [16, 17].
Ova specifikacija je nastala suradnjom nekoliko tvrtki kojese bave proizvodnjom
mjernih uredaja u pokušaju standardizacije nacina komunikacije racunala i njihovih
proizvoda.
4.1. Virtual Instrument Software Architecture sucelje
VISAdefinira nekoliko vrsta aspekata uredaja [16] s kojima se može raditi:
– INSTR – aspekt koji obuhvaca razne operacije koje uredaj pruža,
– MEMACC – aspekt koji obuhvaca operacije nad suceljem,
– INTFC – aspekt koji obuhvaca specificne operacije nad GPIB sušeljem,
– BACKPLANE – aspekt koji obuhvaca specificne operacije nad VXI sistemom,
– SERVANT – aspekt za napredne korisnike koji žele pisati programsku potporu
za same uredaje,
– SOCKET – aspekt koji obuhvaca operacije nad TCP/IP suceljem.
Za potrebe eCal sustava iskoristiv je samoINSTRaspekt te se ostali nece razmatrati.
INSTRaspekt podržava operacijecitanja i pisanja pa dobro pristaje u postojeci model
17
eCal sustava u kojemu se trenutno koristiGPIB sabirnica. API (eng. Application
Interface) funkcije, izvucene iz specifikacije, kojece se koristiti su:
– viFindRsrc()– zapocinje pretragu po sabirnicama za traženim aspektima,
– viFindNext()– dohvaca iduci aspekt iz pretrage zapocete prethodnom funkci-
jom,
– viOpenDefaultRM()– otvara sjednicu prema glavnom aspektu,
– viOpen()– otvara sjednicu prema traženom aspektu,
– viClose()– zatvara otvorenu sjednicu,
– viLock()– zakljucava aspekt,
– viUnlock()– otkljucava aspekt,
– viRead()– cita podatke sa aspekt,
– viWrite()– piše podatke u aspekt,
– viClear()– cisti aspekt od prethodnih operacija.
Aspekti imaju atribute koji odreduju razne karakteristike pojedinog uredaja. U
ovom kontekstu nisu iskoristivi pa se nece razmatrati.
Pošto VISA specifikacija dozvoljava dijeljenje aspekata izmedu nekoliko sjednica,
potrebno je svaki korišteni aspekt zakljucati nakon otvaranja sjednice. Time se izbje-
gava istovremeno korištenje uredaja izmedu više sjednica.
Prva operacija koja se mora napraviti za pristup VISA aspektima je otvaranje glav-
nog aspekta saviOpenDefaultRM(). Nakon toga se mora dohvatiti popis postojecih
uredaja saviFindRsrc()i viFindNext()funkcijama. Za svaki pronadeni uredaj se prije
upotrebe mora otvoriti sjednica saviOpen()te zakljucati saviLock() funkcijom. Sa
uredajem se komunicira saviRead(), viWrite() teviClear() funkcijama. Prije završetka
korištenja, uredaj treba otkljucati saviUnlock() funkcijom te sjednicu zatvoriti savi-
Close()funkcijom. Prije završetka rada treba zatvoriti i glavnu sjednicu saviClose()
funkcijom. Slika 4.1 prikazuje stanja uredaja i njihove prijelaze unutar VISA specifi-
kacije nakon pretraživanja sabirnice i otvaranja sjedniceprema glavnom aspektu.
18
Slika 4.1: Stanja uredaja unutar VISA specifikacije
4.2. Nacini rada sa aspektima
VISA specifikacija definira dva nacina rada instrumenata. Prvi je sinkroni nacin
u kojemu se uredaju šalju naredbe i te operacije blokiraju daljnje izvršavanje dok se
naredbe ne izvrše. Drugi je asinkroni. U njemu se šalju naredbe uredaju i te operacije
ne blokiraju daljnje izvršavanje. Informacije o statusu naredbi uredaj dojavljuje nakon
njihova izvršavanja.
Pošto je klijentski dio eCal sustava višedretven te se pristup uredajima odvija u
zasebnoj dretvi, dovoljno je koristi sinkroni nacin. Asinkroni nacin se nece razmatrati.
4.3. Adresiranje uredaja unutar VISA specifikacije
Moguci izgledi adresa unutar VISA specifikacije su definirane tablicom 4.1. vi-
FindRsrc()funkcija kao argument, izmedu ostalih, uzima izraz kojim se opisuje tip
aspekta te sucelja po kojima se pretraga treba obaviti. Izraz je zadan posebno definira-
nim jezikom slicnim regularnim izrazima [18] proširen mogucnostima logickih izraza
sa atributima aspekta. Gramatika koja ga opisuje je navedena u nastavku.regularExpr
treba biti znakovni niz s kojim se usporeduju adrese svih uredaja u kojemu mogu pos-
tojati specijalni znakovi opisani tablicom 4.2.
expr := regularExpr [’{’ attrExpr ’}’]
attrExpr := attrTerm |
attrExpr ’||’ attrTerm
attrTerm := attrFactor |
attrTerm ’&&’ attrFactor
attrFactor := ’(’ attrExpr ’)’ |
’!’ attrFactor |
relationExpr
relationExpr := attributeId compareOp numValue |
19
attributeId equalityOp stringValue
compareOp := ’==’ | ’!=’ | ’>’ | ’<’ | ’>=’ | ’<=’
equalityOp := ’==’ | ’!=’
attributeId := character (character|digit|underscore)*
numValue := digit+ |
’-’ digit+ |
’0x’ hex_digit+ |
’0X’ hex_digit+
stringValue := ’"’ character* ’"
Tablica 4.1: Adrese u VISA specifikaciji
Sucelje Izgled adrese
VXI VXI[ board]::VXI logical address[::INSTR]
VXI VXI[ board]::MEMACC
VXI VXI[ board][::VXI logical address]::BACKPLANE
VXI VXI[ board]::SERVANT
GPIB-VXI GPIB-VXI[ board]::VXI logical address[::INSTR]
GPIB-VXI GPIB-VXI[ board]::MEMACC
GPIB-VXI GPIB-VXI[ board][::VXI logical address]::BACKPLANE
GPIB GPIB[board]::primary address[::secondary address][::INSTR]
GPIB GPIB[board]::INTFC
GPIB GPIB[board]::SERVANT
ASRL ASRL[board][::INSTR]
TCPIP TCPIP[board][::LAN device name]::SERVANT
TCPIP TCPIP[board]::host address[::LAN device name][::INSTR]
TCPIP TCPIP[board]::host address[::HiSLIP device name[,HiSLIP port]][::INSTR]
TCPIP TCPIP[board]::host address::port::SOCKET
USB USB[board]::manufacturer ID::model code::serial number[::USB interface number][::INSTR]
PXI PXI[bus]::device[::function][::INSTR]
PXI PXI[interface]::bus-device[.function][::INSTR]
PXI PXI[interface]::CHASSISchassis::SLOTslot[::FUNCfunction][::INSTR]
PXI PXI[interface]::MEMACC
Tablica 4.2: Specijalni znakovi u regularnim izrazima definiranim u VISA specifikaciji
Znak Znacenje
? Zamjena za bilo koji znak
\ Tretiraj naredni znak kao obicni
[lista] Zamjena za znakove navedene u listi
[^lista] Zamjena za sve znakove osim onih navedenih u listi
* Prethodni izraz se može pojaviti 0 ili više puta
+ Prethodni izraz se može pojaviti 1 ili više puta
izraz | izraz Pojaviti se može ili izraz sa desne ili izraz sa lijeve strane
(exp) Grupiranje izraza
20
5. Pregled Java Native Interface
specifikacije
SkracenoJNI, je standardni nacin povezivanja vanjske programske potpore sa Java
platformom. JNI je ugraden u Java virtualni stroj te je to jedini nacin komunikacije te
virtualnog stroja sa njegovim okružjem. Pomocu JNI-a je moguce koristiti Java virtu-
alni stroj unutar neke druge programske potpore. Dobar dio standardne funkcionalnosti
unutar Java platforme ovise JNI-u [19, 20].
5.1. Nacin rada
Vanjska programska potpora JNI funkcije poziva preko pokazivaca na JNI sucelje
koji je ispravan samo u kontekstu dretve koja se izvršava. Funkcije vanjske program-
ske potpore, izložene JNI-u, dobivaju ovaj pokazivac kao argument.
Javavirtualni stroj ima implementiran sustav koji se brine za automatsko osloba-
danje zauzetih aspekta kada više nisu potrebni (eng.grabage collector), stoga se mora
obratiti posebna pažnja pri izradi vanjske programske potpore. Razlog tomu jecinje-
nica da u C++ jeziku (u kojemuce ta programska potpora biti pisana) takav sustav
ne postoji pa seJava virtualnom stroju mora eksplicitno reci koji aspekti više nisu
potrebni. Navedeno se odnosi na složeneJavaobjekte koji se prenose u programsku
potporu referencom. Na primitivne objekte nije potrebno paziti jer se po potrebi kopi-
raju.
Pažnju treba obratiti i na znakovne nizove. Java virtualni stroj interno radi sa UTF-
16 (eng. Universal Character Set Transformation Format) znakovnim nizovima pa ih je
u vanjskoj programskoj potpori, prije korištenja, potrebno pretvoriti u UTF-8. UTF-8
je dostatan za rad sa VISA specifikacijom.
21
S obzirom da je nivo kompleksnosti potrebnih funkcija izVISAspecifikacije nizak,
potrebna je samo osnovna funkcionalnost izJNI specifikacije. Tu su ukljucene funk-
cije za konverziju primitivnihJava java tipova u primitivne nativne tipove i obratno.
Programska potpora u ovom kontekstu nema potrebu za interakcijom saJavaokolinom
(izuzev konverzije primitivnih tipova) pa je potrebno promatrati iskljucivo interakciju
Javaokoline sa programskom potporom.
5.2. Povezivanje sa programskom potporom
Vanjska potpora se ucitava pozivomSystem.loadLibrary()funkcije kojoj se predaje
ime datoteke koja sadrži biblioteku funkcija vanjske programske potpore.
Da bi se iz Java okoline pozvala funkcija u programskoj potpori napisanoj u C++
jeziku, potrebno se pridržavati nekoliko pravila:
– funkcija unutar C++ jezika mora biti definirana kao vanjska Cfunkcija (extern
"C") da bi se izbjeglo automatsko generiranje C++ imena,
– ime funkcije mora imati oblik Java_paket_klasa_funkcijagdje jepaketime pa-
keta unutar kojega jeklasa ime klase kroz kojuce funkcija funkcija biti dos-
tupna.
Postoji i mogucnost nadgradnje funkcija istog imena s razlicitim argumentima pa
se u ime ubacuju i imena tipova argumenata ali to nije potrebno pa se nece niti razma-
trati.
Prvi argument funkcije je pokazivac na JNI sucelje. Ukoliko se radi o staticnoj
funkciji, drugi argument je referenca na klasu u kojoj je funkcija definirana. Ako
funkcija nije staticna, drugi argument je referenca na instancu klase ucijem kon-
tekstu je funkcija pozvana. Ostali argumenti trebaju odgovarati argumentima funk-
cije definirane unutar Java jezika. Iznimke se iz programskepotpore mogu generirati
ThrowNew()funkcijom, a koristice se za dojavu grešaka pri komunikaciji sa ureda-
jima.
Postupak oblikovanja JNI programske potrpore se svodi na implementaciju klase
u Java programskom jeziku u kojoj se deklariraju "nativne" funkcije. Datoteka sa tom
22
klasom prevodi u Javabyte codete se iz tog byte koda, posebnim programom, generira
h (eng. header; datoteka u kojoj se definira sucelje programske potpore) datoteka
pogodna za korištenje u C/C++ programskom jeziku.
23
6. Povezivanje VISA specifikacije sa
eCal sustavom
U prošlim poglavljima je obraden dioVISAi JNI specifikacije kojice biti potreban
za integracijuVISAprotokola sa eCal sustavom. Izmjenece biti potrebne samo u kli-
jentskom dijelu eCal sustava s obzirom da je on veza izmedu skripti za umjeravanje i
mjernih uredaja. Potrebno je apstrahirati adresiranje unutarVISAspecifikacije. Adrese
u VISAspecifikaciji su znakovni nizovi, a u eCal sustavu su numericke vrijednosti.
Programska potporace biti napisana naLinux operacijskom sustavu kojace se, uz
manje izmjene, moci prebaciti i uWindowsokružje.
Informacije o korištenom VISA SDK (eng. Software Development Kit) paketu se
mogu naci u literaturi [21].
6.1. Potrebne izmjene
Da bi se eCal sustav prilagodio za VISA protokol potrebno je napraviti slijedece
izmjene:
– napisati programsku potporu zaJNI koja ce izložiti potrebnu funkcionalnost
VISAprotokola eCal klijentu,
– prepravitihsm_scan(), hsm_send(), hsm_write(), hsm_clear() RPCfunkcije da
koristeVISAfunkcionalnost,
– u klijentski dio dodati mapiranje izmeduVISAadresa te adresa u eCal sustavu,
– prepraviti podrškuHSMemulacije.
24
6.2. Komunikacija VISA protokolom
Potrebne funkcije su deklarirane uvisa.javadatoteci. Deklarirane su sanativemo-
difikatorom da bi se naznacilo da se radi o vanjskim funkcijama kojima se komunicira
preko JNI sucelja. Proglašene su privatnima jer sevisa klasa brine oko obuhvaca-
nja funkcionalnosti i mapiranja adresa iz eCal sustava. Sve funkcije mogu generirati
iskljucivo IOExceptioniznimku koja signalizira nekakav problem sa komunikaciom.
Niti jednoj funkciji se ne može pristupati istovremeno iz više deretvi pa se to treba osi-
gurati u višim slojevima sustava. U eCal sustavu je to vec osigurano pa nije potrebno
ulaziti u daljnja razmatranja. Puni ispisvisa.javadatoteke je u Dodatku B avisa.cpp
datoteke u Dodatku C. U nastavku je relevantni diovisa.javadatoteke pa slijedi opis
svake od funkcija.
p r i v a t e s t a t i c n a t i v e vo id openSess ion ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id c l o s e S e s s i o n ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e S t r i n g [ ] scanDev i ces ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e i n t openDevice ( S t r i n g i n s t r A d d r e s s )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id c l e a r D e v i c e (i n t s e s s i o n I d ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e S t r i n g sendCommand (i n t s e s s i o n I d , S t r i n g cmdSt r ing )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id writeCommand (i n t s e s s i o n I d , S t r i n g cmdSt r ing )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id l ockDev ice (i n t s e s s i o n I d ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id un lockDev ice (i n t s e s s i o n I d ) throws IOExcep t ion ;
Biblioteka sa nativnom programskom potporom se ucitava prilikom prvog ucitava-
nja visaklase u Java okružju. To se osigurava ustaticbloku klase. U njemu se poziva
openSession()funckija. Relevantni diostaticbloka je naveden u nastavku.
s t a t i c {
System . l o a d L i b r a r y ( " v i s a " ) ;
t r y {
openSess ion ( ) ;
}
ca tch ( IOExcep t ion e ) {
throw new Runt imeExcept ion ( e . getMessage ( ) ) ;
}
}
6.2.1. void openSession()
FunkcijaopenSession()se brine oko otvaranja sjednice sa glavnim VISA aspektom.
25
6.2.2. void closeSession()
FunckijacloseSession()se brine oko zatvaranja sjednice sa glavnim VISA aspek-
tom. Implementirana je radi korektnosti jer je glavna sjednica aktivna od ucitavanja
programske potpore pa sve do završetka rada programa.
6.2.3. String[] scanDevices()
Ova funkcija pretražuje sve aspekteINSRT tipa te vraca njihove adrese u polju
znakovnih nizova. Može je se pozivati više puta unutar vremena rada programa.
6.2.4. int openDevice(String instrAddress)
Ova funkcija otvara sjednicu prema uredaju. Argument joj je adresa uredaja unutar
VISA okružja a vracasessionIdkoji se koristi pri ostalim operacijama sa uredajem.
6.2.5. void clearDevice(int sessionId)
Ova funkcija zatvara sjednicu sa uredajem. Nakon poziva ovoj funkciji uredaj se
više ne može koristiti ali ga se može ponovno otvoriti pozivom openDevice()funkciji.
Otvorena sjednica prema uredaju je usessionIdparametru.
6.2.6. String sendCommand(int sessionId, String cmdString)
Ova funkcija uredaju šalje naredbu teceka njegov odgovor. Otvorena sjednica
sa uredajem je usessionIdparametru, a naredba se nalazi ucmdStringparametru.
Odgovor se vraca u povratnoj vrijednosti.
6.2.7. void writeCommand(int sessionId, String cmdString)
Kao i sendCommand()funkcija, ova funkcija uredaju šalje naredbu ali neceka na
odgovor. Otvorena sjednica sa uredajem je usessionIdparametru, a naredba se nalazi
u cmdStringparametru.
6.2.8. void lockDevice(int sessionId)
Ova funkcija osigurava ekskluzivan pristup uredaju sasessionIdsjednicom.
26
6.2.9. void unlockDevice(int sessionId)
Ova funkcija otpušta ekskluzivni pristup uredaju sasessionIdsjednicom.
6.2.10. Obuhvacanje funkcionalnosti
visaklasa obuhvaca funkcionalnost VISA protokola i komunikaciju sa uredajima.
U njoj postojifindDevices()funkcija koja interno pozivascanDevices(), radi mapiranje
adresa te instanciradeviceklasu za svaki pronadeni ureda. Polje tih instanci klasa vraca
u povratnoj vrijednosti.
device klasa
Ova se klasa brine oko otvaranja i zatvaranja sjednice premauredaju. Isto tako se
brine i oko zakljucavanja i otkljucavanja uredaja te se brine i oko komunikacije. Popis
funkcija koje sadrži je opisan u nastavku.
pub l i c c l a s s d e v i c e {
pub l i c d e v i c e (i n t d e v i c e I d ) throws IOExcep t ion ;
pub l i c vo id c l e a r ( ) throws IOExcep t ion ;
pub l i c S t r i n g sendCommand ( S t r i n g cmdSt r ing )throws IOExcep t ion ;
pub l i c vo id writeCommand ( S t r i n g cmdSt r ing )throws IOExcep t ion ;
pub l i c i n t ge tDev i ceAddress ( ) ;
pub l i c i n t g e t D e v i c e I d ( ) ;
}
Konstruktor kao parametar uzima mapiranudeviceIdadresu te pozivaopenDevice()
i lockDevice()funkcije. FunkcijagetDeviceId()vraca mapiranu adresu dodijeljenu
uredaju od stranefindDevices()funkcije. Potrebna je zbog identifikacije uredaja u
sistemu.getDeviceAddress()funkcija vraca adresu uredaja unutarVISAokružja. Ta
adresa se koristi pri utvrdivanju potrebe za emulacijomHSMmodula. Ostale funkcije
su samo omotane verzije vec opisanih funkcija.
6.3. Relevantne izmjene HSM klase
Kako je opisano u prijašnjim poglavljima, potrebne izmjeneu klijentu su dosta lo-
kalizirane. Potrebno je mijenjati samo HSM klasu definiranuunutar icalClient klase jer
je ona most izmedu RPC poziva i mjernih uredaja. Kako je mapiranje adresa izvedeno
27
u samojvisa klasi, potrebno je samo instancirativisa klasu te je tražiti da pronade
uredaje. Nakon toga treba spremiti reference na te uredaje i njihove identifikacijske
brojeve proslijediti skriptama koje ih zahtijevaju. IspisizmjenaicalClient.javadato-
teke uUnified Diff formatu se može vidjeti u Dodatku D.
6.4. Demonstracija rada eCal sustava sa VISA proto-
kolom
Buduci da tema rada nije bilo samo umjeravanje uredaja nego integracija novog
protokola u eCal sustav, za svrhe demonstracije je uzeta jednostavna skripta iz Do-
datka A. Pojedine funkcije su dodatno izmijenjene da ispisuju informacije o aktivnosti
na ekran. U nastavku su prikazane pojedine faze izvršavanjaskripte te rezultati izvrša-
vanja VISA funkcija.
Prva faza obuhvaca uspostavljanje veze izmedu klijenta i poslužitelja te otvaranje
sjednice prema glavnom aspektu. Slika 6.1 prikazuje pocetni prozor u klijentu dok
slika 6.2 prikazuje prozor konzole sa porukama.
Slika 6.1: Pocetni prikaz na klijentu
U drugoj fazi odabiremo kalibraciju iz izbornika sa lijeve strane te odabiremo ’Pro-
vjera rada VISA sucelja’ iz padajuceg izbornika. To je vidljivo na slici 6.3.
28
Slika 6.2: Ispis poruka na konzoli pri pokretanju klijenta
Slika 6.3: Odabir ’Provjera rada VISA sucelja’ iz padajuceg izbornika
U iducoj fazi se dešava pretraživanje sabirnica i uspostavljanje veze sa uredajima
što se može vidjeti na ispisu sa slike 6.4. Pronadeni uredaji su ponudeni u padajucem
izborniku klijenta (slika 6.5).
Zadnja faza obuhvaca slanje*IDN? naredbe uredaju te prikaz rezultata u klijentu.
To je vidljivo na slikama 6.7 i 6.6.
29
Slika 6.4: Ispis poruka na konzoli pri pretraživanju sabirnica i uspostavi veze sa uredajima
Slika 6.5: Odabir uredaja u klijentu
Slika 6.6: Ispis poruka na konzoli nakon izvršenja skripte
30
Slika 6.7: Prikaz rezultata skripte u klijentu
31
7. Zaklju cak
Udaljeno umjeravanje je brzo rastuce podrucje te je eCal sustav samo jedno od
postojecih rješenja. Da bi ga se moglo koristiti izvan akademskog okružija, potrebno
ga je prilagoditi što širem spektru opreme koja se koristi u industriji. KorištenjeVISA
protokola u tom kontekstu je smisleno jer je relativno popularan i dobro podržan od
strane proizvodaca mjerne opreme.
Pri realizaciji potrebnih izmjena, bilo je potrebno prouciti sve vezane specifika-
cije te eCal sustav. Navedene izmjene nisu bile problematicne s obzirom da su sve
komponente dobro definirane te je cilj izmjena bio jasan. Snaga paradigme objektno
orijentiranog programiranja je u ovom slucaju došla do izražaja jer su izmjene samog
sustava bile minimalne. Bilo je potrebno što više se približiti implementaciji program-
ske potpore GPIB sucelja. Idealno bi bilo reimplementirati postojecu funkcionalnost
GPIB sucelja, ali to nije smisleno buduci da i sama VISA specifikacija obuhvaca iz-
medu ostalih i GPIB.
32
L ITERATURA
[1] Marko Jurcevic. Sustav za udaljeno ispitivanje i umjeravanje mjernih uredaja.
Doktorska disertacija, FER, 2011.
[2] C++ - Wikipedia. http://en.wikipedia.org/wiki/C%2B%2B. posje-
ceno 15. kolovoza 2011.
[3] POSIX - Wikipedia.http://en.wikipedia.org/wiki/POSIX. posje-
ceno 15. kolovoza 2011.
[4] Oracle Technology Network for Java Developers.http://www.oracle.
com/technetwork/java/index.html. posjeceno 14. kolovoza 2011.
[5] Cobra - Java HTML Renderer & Parser.http://lobobrowser.org/
cobra.jsp. posjeceno 15. kolovoza 2011.
[6] TCP/IP model - Wikipedia. http://en.wikipedia.org/wiki/TCP/
IP_model. posjeceno 15. kolovoza 2011.
[7] Transport Security Layer - Wikipedia. http://en.wikipedia.org/
wiki/Secure_Sockets_Layer. posjeceno 15. kolovoza 2011.
[8] Remote Procedure Call - Wikipedia.http://en.wikipedia.org/wiki/
Remote_procedure_call. posjeceno 15. kolovoza 2011.
[9] Base64 - Wikipedia.http://en.wikipedia.org/wiki/Base64. po-
sjeceno 17. kolovoza 2011.
[10] Advanced Encryption Standard - Wikipedia.http://en.wikipedia.org/
wiki/Advanced_Encryption_Standard. posjeceno 19. kolovoza 2011.
[11] RSA - Wikipedia. http://en.wikipedia.org/wiki/RSA. posjeceno
19. kolovoza 2011.
33
[12] XML DTD - An Introduction to XML Document Type Definitions. http://
www.xmlfiles.com/dtd/. posjeceno 23. kolovoza 2011.
[13] General Purpose Interface Bus (GPIB).http://www.ni.com/gpib/. po-
sjeceno 11. kolovoza 2011.
[14] JPIB: a Java API for GPIB Devices.http://jpib.sourceforge.net/.
posjeceno 22. kolovoza 2011.
[15] Mozilla JavaScript. https://developer.mozilla.org/en/
JavaScript. posjeceno 17. kolovoza 2011.
[16] The VISA Specification. http://www.ivifoundation.org/docs/
vpp43.pdf. posjeceno 23. kolovoza 2011.
[17] IVI Foundation.http://www.ivifoundation.org/. posjeceno 27. ko-
lovoza 2011.
[18] Regular expression - Wikipedia.http://en.wikipedia.org/wiki/
Regular_expression. posjeceno 19. kolovoza 2011.
[19] Tutorials & Code Camps, Chapter 5: JNI Technology. http:
//java.sun.com/developer/onlineTraining/Programming/
JDCBook/jni.html. posjeceno 25. kolovoza 2011.
[20] Java Native Interface Specification.http://download.oracle.com/
javase/6/docs/technotes/guides/jni/spec/jniTOC.html.
posjeceno 25. kolovoza 2011.
[21] VISA SDK. http://download.ni.com/support/softlib/visa/
NI-VISA/5.0/linux/NI-VISA-5.0.0.iso. posjeceno 23. kolovoza
2011.
34
Dodatak A
Primjer jednostavne korisnicke skripte
hsm_map [ " vo l1 " ] = new i n s t r u m e n t _ c l a s s ( " i n s t r u m e n t 1 " , " v o l t m e t r i " ) ;
f u n c t i o n d i s p l a y ( name , group , id , r e s p o n s e ) {
va r html = "<html ><body >" ;
h tml += " n az i v : " + name + " @" + group + " ( " + i d + " ) < br >" ;
h tml += "∗IDN ? : " + r e s p o n s e + "<br >" ;
h tml += " s i g n a t u r e : " + c l i e n t . hsm_sign ( i d ) ;
h tml += " </ body > </ html >" ;
c l i e n t . d i s p l a y _ c o n t e n t ( html , " main " ) ;
}
f u n c t i o n c a l i b r a t e ( ) {
va r r e s 1 = hsm . vo l1 . send ( "∗IDN? " ) ;
d i s p l a y ( hsm . vo l1 . name , hsm . vo l1 . group , hsm . vo l1 . id , r es 1 . r e s p o n s e ) ;
c l i e n t . msgbox ( " p r e s sok t o c o n t i n u e " , " c o n t i n u e . . . " ) ;
re turn t rue ;
}
35
Dodatak B
Ispis visa.java datoteke
package bus ;
import j a v a . i o . IOExcep t ion ;
import j a v a . l ang . Runt imeExcept ion ;
pub l i c c l a s s v i s a
{
p r i v a t e s t a t i c n a t i v e vo id openSess ion ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id c l o s e S e s s i o n ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e S t r i n g [ ] scanDev i ces ( ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e i n t openDevice ( S t r i n g i n s t r A d d r e s s )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id c l e a r D e v i c e (i n t s e s s i o n I d ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e S t r i n g sendCommand (i n t s e s s i o n I d , S t r i n g cmdSt r ing )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id writeCommand (i n t s e s s i o n I d , S t r i n g cmdSt r ing )throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id l ockDev ice (i n t s e s s i o n I d ) throws IOExcep t ion ;
p r i v a t e s t a t i c n a t i v e vo id un lockDev ice (i n t s e s s i o n I d ) throws IOExcep t ion ;
s t a t i c {
System . l o a d L i b r a r y ( " v i s a " ) ;
t r y {
openSess ion ( ) ;
}
ca tch ( IOExcep t ion e ) {
throw new Runt imeExcept ion ( e . getMessage ( ) ) ;
}
}
p r i v a t e S t r i n g [ ] m_dev iceAddresses ;
pub l i c c l a s s d e v i c e {
p r i v a t e i n t m_dev iceId = −1;
p r i v a t e i n t m_sess ion Id =−1;
p r i v a t e S t r i n g m_dev iceAddress =n u l l ;
36
pub l i c d e v i c e (i n t d e v i c e I d ) throws IOExcep t ion {
i f ( m_dev iceAddresses ==n u l l | | d e v i c e I d >= m_dev iceAddresses . l e n g t h )
throw new IOExcep t ion ( " I n v a l i d d e v i c e i d " ) ;
m_dev iceAddress = m_dev iceAddresses [ d e v i c e I d ] ;
m_dev iceId = d e v i c e I d ;
m_sess ion Id = openDevice ( m_dev iceAddress ) ;
l ockDev ice ( m_sess ion Id ) ;
}
pub l i c vo id c l e a r ( ) throws IOExcep t ion {
i n t s e s s i o n I d = m_sess ion Id ;
m_sess ion Id =−1;
m_dev iceId = −1;
m_dev iceAddress =n u l l ;
un lockDev ice ( s e s s i o n I d ) ;
c l e a r D e v i c e ( s e s s i o n I d ) ;
}
pub l i c i n t g e t D e v i c e I d ( ) {
re turn m_dev iceId ;
}
pub l i c S t r i n g ge tDev i ceAddress ( ) {
re turn m_dev iceAddress ;
}
pub l i c S t r i n g sendCommand ( S t r i n g cmdSt r ing )throws IOExcep t ion {
re turn v i s a . sendCommand ( m_sess ion Id , cmdSt r ing ) ;
}
pub l i c vo id writeCommand ( S t r i n g cmdSt r ing )throws IOExcep t ion {
v i s a . writeCommand ( m_sess ion Id , cmdSt r ing ) ;
}
}
pub l i c d e v i c e [ ] f i n d D e v i c e s ( ) throws IOExcep t ion {
m_dev iceAddresses =n u l l ;
m_dev iceAddresses = scanDev i ces ( ) ;
i f ( m_dev iceAddresses ==n u l l )
re turn n u l l ;
d e v i c e [ ] d e v i c e s =new d e v i c e [ m_dev iceAddresses . l e n g t h ] ;
f o r ( i n t i = 0 ; i < m_dev iceAddresses . l e n g t h ; i ++)
d e v i c e s [ i ] = new d e v i c e ( i ) ;
re turn d e v i c e s ;
}
}
37
Dodatak C
Ispis visa.cpp datoteke
# inc lude < v i s a . h>
# inc lude < s t d i n t . h>
# inc lude < c s t d i o >
# inc lude < c s t r i n g >
# inc lude < s t r i n g >
# inc lude " b u s _ v i s a . h "
/ / main s e s s i o n hand le
V iSess ion g_defaul tRM =s t a t i c _ c a s t< ViSess ion >(−1);
/ / throw a java e x c e p t i o n
bool t h rowJava IOExcep t i on ( JNIEnv∗ env , cons t char∗ excep t ionMessage )
{
j c l a s s e = env−>F i n d C l a s s ( " j a v a / i o / IOExcep t ion " ) ;
i f ( e == NULL)
re turn f a l s e ;
env−>ThrowNew ( e , excep t ionMessage ) ;
env−>De le teLoca lRe f ( e ) ;
re turn t rue ;
}
/ / e x t r a c t c s t y l e s t r i n g s from java s t r i n g s
bool g e t J a v a S t r i n g ( JNIEnv∗ env , j s t r i n g s t r i n g , s t d : : s t r i n g& c p p _ s t r i n g )
{
cons t char∗ c _ s t r i n g = env−>GetSt r ingUTFChars ( s t r i n g , NULL ) ;
i f ( c _ s t r i n g == NULL)
re turn f a l s e ;
c p p _ s t r i n g = c _ s t r i n g ;
env−>Re leaseSt r ingUTFChars ( s t r i n g , c _ s t r i n g ) ;
re turn t rue ;
}
38
/ / c r e a t e new s t r i n g a r ray o f s i z e e l e m e n t s
j o b j e c t A r r a y c r e a t e J a v a S t r i n g A r r a y ( JNIEnv∗ env , j s i z e s i z e )
{
j c l a s s s t r i n g _ c l a s s = env−>F i n d C l a s s ( " j a v a / l ang / S t r i n g " ) ;
i f ( s t r i n g _ c l a s s == NULL)
re turn NULL;
j s t r i n g i n s t r A d d r = env−>NewStringUTF ( " " ) ;
i f ( i n s t r A d d r == NULL)
re turn NULL;
re turn env−>NewObjectArray ( s i z e , s t r i n g _ c l a s s , i n s t r A d d r ) ;
}
/ / open t h e d e f a u l t s e s s i o n
JNIEXPORT vo id JNICALL J a v a _ b u s _ v i s a _ o p e n S e s s i o n ( JNIEnv∗ env , j c l a s s )
{
i f ( viOpenDefaultRM(&g_defaul tRM ) >= VI_SUCCESS )
re turn ;
t h rowJava IOExcep t i on ( env , " Unablet o open t h e d e f a u l t s e s s i o n " ) ;
}
/ / c l o s e t h e d e f a u l t s e s s i o n
JNIEXPORT vo id JNICALL J a v a _ b u s _ v i s a _ c l o s e S e s s i o n ( JNIEnv∗ env , j c l a s s )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn ;
}
v i C l o s e ( g_defaul tRM ) ;
}
/ / open a s e s s i o n t o t h e d e v i c e a t i n s t r A d d r
JNIEXPORT j i n t JNICALL Java_bus_v i sa_openDev i ce ( JNIEnv∗ env , j c l a s s , j s t r i n g i n s t r A d d r )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn 0 ;
}
V iSess ion s e s s i o n I d =s t a t i c _ c a s t< ViSess ion >(−1);
s t d : : s t r i n g _ i n s t r A d d r e s s ;
i f ( g e t J a v a S t r i n g ( env , i n s t r A d d r , _ i n s t r A d d r e s s ) ==f a l s e )
re turn 0 ;
39
i f ( viOpen ( g_defaultRM ,
cons t_cas t<ViChar∗>( _ i n s t r A d d r e s s . c _ s t r ( ) ) ,
VI_NULL ,
VI_NULL ,
&s e s s i o n I d ) < VI_SUCCESS )
{
th rowJava IOExcep t i on ( env , " Unablet o open t h e d e v i c e " ) ;
re turn 0 ;
}
re turn s t a t i c _ c a s t < u i n t 3 2 _ t >( s e s s i o n I d ) ;
}
/ / c l o s e d e v i c e s e s s i o n
JNIEXPORT vo id JNICALL J a v a _ b u s _ v i s a _ c l e a r D e v i c e ( JNIEnv∗ env , j c l a s s , j i n t s e s s i o n I d )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn ;
}
v i C l o s e (s t a t i c _ c a s t< ViSess ion >( s e s s i o n I d ) ) ;
}
/ / send a command t o t h e d e v i c e and wa i t f o r t h e resp o n se
JNIEXPORT j s t r i n g JNICALL Java_bus_visa_sendCommand ( JNIEnv∗ env ,
j c l a s s ,
j i n t s e s s i o n I d ,
j s t r i n g cmdSt r ing )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn NULL;
}
s t d : : s t r i n g _cmdSt r ing ;
i f ( g e t J a v a S t r i n g ( env , cmdStr ing , _cmdSt r ing ) ==f a l s e )
re turn NULL;
ViUInt32 wr i t eCoun t ;
i f ( v i W r i t e ( s t a t i c _ c a s t<ViUInt32 >( s e s s i o n I d ) ,
( ViByte ∗ ) _cmdSt r ing . d a t a ( ) ,
_cmdSt r ing . s i z e ( ) ,
&wr i t eCoun t ) < VI_SUCCESS )
{
th rowJava IOExcep t i on ( env , " Unablet o w r i t e t o t h e d e v i c e " ) ;
re turn NULL;
}
i f ( w r i t eCoun t != s t a t i c _ c a s t<ViUInt32 >( _cmdSt r ing . s i z e ( ) ) )
40
{
t h rowJava IOExcep t i on ( env , " Unablet o w r i t e t o t h e d e v i c e " ) ;
re turn NULL;
}
s t d : : s t r i n g _cmdResponse ;
whi le ( t rue )
{
ViUInt32 readCount = 0 ;
ViByte cmdResponseBuf fer [ 8 1 9 2 ] ;
i f ( v iRead ( s e s s i o n I d , cmdResponseBuf fer ,s i z e o f( cmdResponseBuf fer ) , &readCount ) < VI_SUCCESS )
{
th rowJava IOExcep t i on ( env , " Unablet o read from t h e d e v i c e " ) ;
re turn NULL;
}
_cmdResponse += s t d : : s t r i n g ( (char ∗ ) cmdResponseBuf fer , readCount ) ;
i f ( readCount != s i z e o f( cmdResponseBuf fer ) )
break ;
}
re turn env−>NewStringUTF ( _cmdResponse . c _ s t r ( ) ) ;
}
/ / send a command t o t h e d e v i c e
JNIEXPORT vo id JNICALL Java_bus_v isa_wr i teCommand ( JNIEnv∗ env ,
j c l a s s ,
j i n t s e s s i o n I d ,
j s t r i n g cmdSt r ing )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn ;
}
s t d : : s t r i n g _cmdSt r ing ;
i f ( g e t J a v a S t r i n g ( env , cmdStr ing , _cmdSt r ing ) ==f a l s e )
re turn ;
V iUInt32 wr i t eCoun t ;
i f ( v i W r i t e ( s t a t i c _ c a s t<ViUInt32 >( s e s s i o n I d ) ,
( ViByte ∗ ) _cmdSt r ing . d a t a ( ) ,
_cmdSt r ing . s i z e ( ) ,
&wr i t eCoun t ) < VI_SUCCESS )
{
th rowJava IOExcep t i on ( env , " Unablet o w r i t e t o t h e d e v i c e " ) ;
re turn ;
}
41
i f ( w r i t eCoun t != s t a t i c _ c a s t<ViUInt32 >( _cmdSt r ing . s i z e ( ) ) )
t h rowJava IOExcep t i on ( env , " Unablet o w r i t e t o t h e d e v i c e " ) ;
}
/ / scan f o r dynamic d e v i c e s
JNIEXPORT j o b j e c t A r r a y JNICALL J a v a _ b u s _ v i s a _ s c a n D e v i ce s ( JNIEnv∗ env , j c l a s s )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn NULL;
}
V i F i n d L i s t f i n d L i s t ;
ViUInt32 numIns t ruments ;
ViChar _ i n s t r A d d r [ VI_FIND_BUFLEN ] ;
i f ( v i F i n d R s r c ( g_defaultRM ,
( ViChar∗ ) " ?∗ INSTR" ,
&f i n d L i s t ,
&numInst ruments ,
_ i n s t r A d d r ) < VI_SUCCESS )
re turn NULL;
j o b j e c t A r r a y i n s t r A d d r _ a r r a y = c r e a t e J a v a S t r i n g A r r a y ( env , numIns t ruments ) ;
i f ( i n s t r A d d r _ a r r a y == NULL)
{
v i C l o s e ( f i n d L i s t ) ;
re turn NULL;
}
j s t r i n g i n s t r A d d r = env−>NewStringUTF ( (char ∗ ) _ i n s t r A d d r ) ;
i f ( i n s t r A d d r == NULL)
{
v i C l o s e ( f i n d L i s t ) ;
re turn NULL;
}
env−>Se tOb jec tA r rayE lemen t ( i n s t r A d d r _ a r r a y , 0 , i n s t r A d d r );
f o r ( i n t i = 1 ; i < numIns t ruments ; i ++)
{
i f ( v iF indNex t ( f i n d L i s t , _ i n s t r A d d r ) < VI_SUCCESS )
{
th rowJava IOExcep t i on ( env , " E r r o rg e t t i n g i n s t r u m e n t l i s t " ) ;
break ;
}
i n s t r A d d r = env−>NewStringUTF ( (char ∗ ) _ i n s t r A d d r ) ;
42
i f ( i n s t r A d d r == NULL)
break ;
env−>Se tOb jec tA r rayE lemen t ( i n s t r A d d r _ a r r a y , i , i n s t r A d d r );
}
v i C l o s e ( f i n d L i s t ) ;
re turn i n s t r A d d r _ a r r a y ;
}
/ / l o c k t h e d e v i c e
JNIEXPORT vo id JNICALL J a v a _ b u s _ v i s a _ l o c k D e v i c e ( JNIEnv∗ env , j c l a s s , j i n t s e s s i o n I d )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn ;
}
i f ( v iLock ( s e s s i o n I d , VI_EXCLUSIVE_LOCK , VI_TMO_IMMEDIATE , VI_NULL , VI_NULL) < VI_SUCCESS )
th rowJava IOExcep t i on ( env , " Unablet o l ock t h e d e v i c e " ) ;
}
/ / un lock t h e d e v i c e
JNIEXPORT vo id JNICALL J a v a _ b u s _ v i s a _ u n l o c k D e v i c e ( JNIEnv∗ env , j c l a s s , j i n t s e s s i o n I d )
{
i f ( g_defaul tRM == s t a t i c _ c a s t< ViSess ion >(−1))
{
t h rowJava IOExcep t i on ( env , " D e f a u l ts e s s i o n no t open " ) ;
re turn ;
}
i f ( v iUn lock ( s e s s i o n I d ) < VI_SUCCESS )
th rowJava IOExcep t i on ( env , " Unablet o un lock t h e d e v i c e " ) ;
}
43
Dodatak D
Izmjene icalClient.java datoteke -
Unified Diff format
d i f f −−g i t a / c l i e n t / i c a l / i c a l C l i e n t . j a v a b / c l i e n t / i c a l / i c a l Cl i e n t . j a v a
index f6be30c . . e5a51b6 100644
−−− a / c l i e n t / i c a l / i c a l C l i e n t . j a v a
+++ b / c l i e n t / i c a l / i c a l C l i e n t . j a v a
@@ −9,7 +9 ,7 @@import j a v a . s e c u r i t y .∗ ;
import j a v a . s e c u r i t y . c e r t .∗ ;
import j a v a . u t i l .∗ ;
−import be . ac . u lb . gp ib .∗ ;
+ import bus .∗ ;
pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
p r i v a t e c l a s s C l i e n t Q u i t implements ica lRPC . Func t i on {
@@ −34,6 +34 ,7 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
p r i v a t e c l a s s HsmEmulation {
p r i v a t e c l a s s hsm_t {
S t r i n g m_id ;
+ S t r i n g m_address ;
ica lAES m_aes_key ;
icalRSA m_pr iv_key ;
icalRSA m_server_key ;
@@ −67,6 +68 ,8 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
throw e ;
}
+ m_address = i n f o [ 0 ] ;
+
m_id = HexCoder . Encode (md . d i g e s t ( c e r t _ b y t e s ) ) ;
m_aes_key =n u l l ;
@@ −81,14 +84 ,9 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
}
}
− p r i v a t e hsm_t [ ] m_hsms ;
+ p r i v a t e HashMap< S t r i n g , hsm_t > m_hsms ;
44
pub l i c HsmEmulation ( S t r i n g e m u l a t i o n _ c o n f ) {
− m_hsms = new hsm_t [ 3 2 ] ;
−
− f o r ( i n t i = 0 ; i < m_hsms . l e n g t h ; i ++)
− m_hsms [ i ] = n u l l ;
−
i f ( e m u l a t i o n _ c o n f == n u l l )
re turn ;
@@ −111,6 +109 ,8 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
i f ( d e v i c e s == n u l l )
re turn ;
+ m_hsms = new HashMap ( ) ;
+
S t r i n g [ ] devs = d e v i c e s . s p l i t ( " , " ) ;
f o r ( i n t i = 0 ; i < devs . l e n g t h ; i ++) {
@@ −124,39 +124 ,39 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
i f ( i n f o . l e n g t h != 4)
con t inue ;
− i n t i d = I n t e g e r . p a r s e I n t ( i n f o [ 0 ] ) ;
−
− i f ( m_hsms [ i d ] != n u l l )
− con t inue ;
−
t r y {
− m_hsms [ i d ] = new hsm_t ( i n f o ) ;
+ hsm_t h = new hsm_t ( i n f o ) ;
+ m_hsms . pu t ( i n f o [ 0 ] , h ) ;
}
ca tch ( F i l eNo tFoundExcep t i on e ) {
e . p r i n t S t a c k T r a c e ( ) ;
− m_hsms [ i d ] = n u l l ;
}
ca tch ( IOExcep t ion e ) {
e . p r i n t S t a c k T r a c e ( ) ;
− m_hsms [ i d ] = n u l l ;
}
ca tch ( NoSuchAlgor i thmExcept ion e ) {
e . p r i n t S t a c k T r a c e ( ) ;
− m_hsms [ i d ] = n u l l ;
}
}
}
pub l i c boolean I sEmu la ted (i n t i d ) {
− re turn m_hsms [ i d ] != n u l l ;
+ re turn m_hsms . con ta insKey ( ge tDev i ce ( i d ) . m_address ) ==t rue ;
}
pub l i c vo id Rese t ( ) {
45
− f o r ( i n t i = 0 ; i < m_hsms . l e n g t h ; i ++)
− i f ( m_hsms [ i ] != n u l l ) {
− m_hsms [ i ] . m_aes_key =n u l l ;
− m_hsms [ i ] . m_buf fe r =new S t r i n g B u i l d e r ( ) ;
− }
+ I t e r a t o r i t = m_hsms . v a l u e s ( ) . i t e r a t o r ( ) ;
+
+ whi le ( i t . hasNext ( ) == t rue ) {
+ hsm_t h = ( hsm_t ) i t . nex t ( ) ;
+
+ h . m_aes_key =n u l l ;
+ h . m_buf fe r = new S t r i n g B u i l d e r ( ) ;
+ }
+ }
+
+ pub l i c hsm_t ge tDev i ce (i n t i d ) {
+ re turn ( hsm_t ) m_hsms . g e t (HSM.t h i s . m_devices [ i d ] . ge tDev i ceAddress ( ) ) ;
}
pub l i c S t r i n g DecodeCommand (i n t id , S t r i n g command ) {
@@ −175,7 +175 ,7 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
S t r i n g a rg = _cmd [ 2 ] . s u b s t r i n g ( 0 , _cmd [ 2 ] . l e n g t h ( )− 1 ) ;
i f ( cmd . e q u a l s ( " ID " ) == t rue )
− re turn " ∗HSM: " + m_hsms [ i d ] . m_id + " ! " ;
+ re turn " ∗HSM: " + ge tDev i ce ( i d ) . m_id + " ! " ;
i f ( cmd . e q u a l s ( "AUTH" ) == t rue ) {
re turn " ∗HSM: " + A u t h e n t i c a t e ( id , a rg ) + " ! " ;
@@ −195,7 +195 ,7 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
}
p r i v a t e S t r i n g A u t h e n t i c a t e (i n t id , S t r i n g d a t a ) {
− i c a l S e a l s = new i c a l S e a l ( m_hsms [ i d ] . m_priv_key , m_hsms [ i d ] . m_server_key ) ;
+ i c a l S e a l s = new i c a l S e a l ( ge tDev i ce ( i d ) . m_priv_key , ge tDev i ce ( i d ) . m_server_key ) ;
byte [ ] au th = s . E x t r a c t ( Base64Coder . decode ( d a t a . toCharAr ray ( ) ) ) ;
@@ −213,18 +213 ,18 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
byte [ ] i v = new byte [ 1 6 ] ;
i n . r ead ( i v ) ;
− m_hsms [ i d ] . m_aes_key =new ica lAES ( key , i v ) ;
+ ge tDev i ce ( i d ) . m_aes_key =new ica lAES ( key , i v ) ;
re turn new S t r i n g ( Base64Coder . encode ( c h a l l e n g e ) ) ;
}
p r i v a t e S t r i n g Decode (i n t id , S t r i n g d a t a ) {
byte [ ] d = Base64Coder . decode ( d a t a ) ;
− m_hsms [ i d ] . m_aes_key . Decryp t ( d ) ;
+ ge tDev i ce ( i d ) . m_aes_key . Decryp t ( d ) ;
S t r i n g s = new S t r i n g ( d ) ;
46
− m_hsms [ i d ] . m_buf fe r . append ( s ) ;
+ ge tDev i ce ( i d ) . m_buf fe r . append ( s ) ;
re turn s ;
}
@@ −232,7 +232 ,7 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
p r i v a t e S t r i n g Encode (i n t id , S t r i n g d a t a ) {
byte [ ] t o _ e n c r y p t = n u l l ;
− m_hsms [ i d ] . m_buf fe r . append ( d a t a ) ;
+ ge tDev i ce ( i d ) . m_buf fe r . append ( d a t a ) ;
t r y {
byte [ ] d = d a t a . g e t B y t e s ( "UTF8" ) ;
@@ −252,7 +252 ,7 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
f o r ( i n t i = d . l e n g t h ; i < s i z e ; i ++)
t o _ e n c r y p t [ i ] = (byte ) pad ;
− m_hsms [ i d ] . m_aes_key . Enc ryp t ( t o _ e n c r y p t ) ;
+ ge tDev i ce ( i d ) . m_aes_key . Enc ryp t ( t o _ e n c r y p t ) ;
} ca tch ( Unsuppor tedEncod ingExcep t ion e ) {
re turn "ERROR" ;
}
@@ −274,28 +274 ,27 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
byte [ ] sha1 = n u l l ;
t r y {
− sha1 = md . d i g e s t ( m_hsms [ i d ] . m_buf fe r . t o S t r i n g ( ) . g e t B yt e s ( "UTF−8" ) ) ;
+ sha1 = md . d i g e s t ( ge tDev i ce ( i d ) . m_buf fe r . t o S t r i n g ( ) . ge t B y t e s ( "UTF−8" ) ) ;
} ca tch ( Unsuppor tedEncod ingExcep t ion e ) {
e . p r i n t S t a c k T r a c e ( ) ;
re turn "ERROR" ;
}
− byte [ ] s i g _ e n c = m_hsms [ i d ] . m_pr iv_key . P r i v a t e E n c r y p t ( sha1) ;
+ byte [ ] s i g _ e n c = ge tDev i ce ( i d ) . m_pr iv_key . P r i v a t e E n c r y p t ( sha1 ) ;
re turn new S t r i n g ( Base64Coder . encode ( s i g _ e n c ) ) ;
}
}
p r i v a t e JFrame m_parent ;
− p r i v a t e GPIBDevice [ ] m_devices ;
+ p r i v a t e v i s a m_visa ;
+ p r i v a t e v i s a . d e v i c e [ ] m_devices ;
p r i v a t e icalRSA m_loca l ;
p r i v a t e HsmEmulation m_emulat ion ;
pub l i c HSM( JFrame pa ren t , ica lRPC rpc , icalRSA l o c a l , S t r i n g e m u la t i o n _ c o n f ) {
− m_devices =new GPIBDevice [ 3 2 ] ;
−
− f o r ( i n t i = 0 ; i < m_devices . l e n g t h ; i ++)
− m_devices [ i ] = n u l l ;
47
+ m_visa = new v i s a ( ) ;
+ m_devices = n u l l ;
m_emulat ion = new HsmEmulation ( e m u l a t i o n _ c o n f ) ;
@@ −330,9 +329 ,6 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
S t r i n g e r r o r = " " ;
f o r ( i n t i = 0 ; i < m_devices . l e n g t h ; i ++) {
− i f (HSM. t h i s . m_devices [ i ] == n u l l )
− con t inue ;
−
t r y {
HSM. t h i s . m_devices [ i ] . c l e a r ( ) ;
}
@@ −340,30 +336 ,31 @@pub l i c f i n a l c l a s s i c a l C l i e n t ex tends Thread {
/ / I t doesn ’ t m a t t e r a t t h i s p o i n t
e . p r i n t S t a c k T r a c e ( ) ;
}
−
− HSM. t h i s . m_devices [ i ] = n u l l ;
}
+
+ HSM. t h i s . m_devices = n u l l ;
m_emulat ion . Rese t ( ) ;
− Enumerat ion d e v i c e s L i s t = G P I B D e v i c e I d e n t i f i e r . g e t D e v ic e s ( ) ;
−
− whi le ( e r r o r == " " ) {
− G P I B D e v i c e I d e n t i f i e r d e v i c e I d e n t i f i e r = ( G P I B D e v i c e I d en t i f i e r ) d e v i c e s L i s t . nex tE lemen t ( ) ;
−
− t r y {
− d e v i c e s += d e v i c e I d e n t i f i e r . ge tAdd ress ( ) ;
+ t r y {
+ HSM. t h i s . m_devices = m_visa . f i n d D e v i c e s ( ) ;
+ i n t dev iceCoun t = HSM.t h i s . m_devices . l e n g t h ;
− HSM. t h i s . m_devices [ d e v i c e I d e n t i f i e r . ge tAdd ress ( ) ] = d e v i c e I d en t i f i e r . open ( ) ;
+ f o r ( i n t i = 0 ; i < dev iceCoun t ; i ++) {
+ i n t d e v i c e I d = HSM.t h i s . m_devices [ i ] . g e t D e v i c e I d ( ) ;
+ d e v i c e s += I n t e g e r . t o S t r i n g ( d e v i c e I d ) ;
− i f ( d e v i c e s L i s t . hasMoreElements ( ) )
+ i f ( i != dev iceCoun t− 1)
d e v i c e s += " " ;
e l s e
break ;
}
− ca tch ( N u l l P o i n t e r E x c e p t i o n e ) {
− e r r o r = " Unable t o g e t t h e d e v i c e l i s t " ;
− }
+ }
+ ca tch ( IOExcep t ion e ) {
48
+ e r r o r = " Unable t o g e t t h e d e v i c e l i s t " ;
+ }
+ ca tch ( N u l l P o i n t e r E x c e p t i o n e ) {
+ e r r o r = " Unable t o g e t t h e d e v i c e l i s t " ;
}
ica lRPC . r S t r u c t r e t =new ica lRPC . r S t r u c t ( " r e t u r n " ) ;
49
Sustav za udaljeno ispitivanje mjernih instrumenata
Sažetak
Diplomski rad obraduje eCal sustav i potrebne izmjene da bi ga se moglo koristitisa
VISAprotokolom za udaljena umjeravanja na širokom spektru mjernih uredaja. Sustav
trenutno radi iskljucivo saGPIB sabirnicom.VISAprotokol je odabran jer obuhvaca
funkcionalnosti mnoštva drugih sabirnica na koje se mogu spojiti mjerni uredaji. Rad
se dotice tehnologija korištenih u eCal sustavu. Medu njima suJNI (eng. Java Native
Interface) i korištenje Javascript jezika za kontrolu i upravljanje sustavom. Obraduju se
i tehnike potrebne za realizaciju cijelog sustava. Neke od njih su PKI (eng. Public Key
Infrastructure), RPC (eng. Remote Procedure Call) te objektnoorijentirana paradigma.
Klju cne rijeci: eCal, umjeravanje, udaljeno umjeravanje, GPIB, VISA, Java, C++,
JNI, RPC, PKI
System for remote examination of measuring instruments
Abstract
This paper describes the eCal system and the changes requiredfor it to be able
to communicate with measurement instruments over the VISA protokol. The system
currently uses the GPIB bus. VISA protocol was selected because it encapsulates
functionalities of many other instrumentation buses. Someof the technologies and
techniques used the eCal system are also described. Technologies include JNI (Java
Native Interface) and embedded Javascript which is used to control and manage the
system. Techniques include PKI (Public Key Infrastructure), RPC (Remote Procedure
Call) and object oriented paradigm.
Keywords: eCal, calibration, remote calibration, GPIB, VISA, Java, C++,JNI, RPC,
PKI