• No results found

CORBA initialisatie

In document Custodian® Embedded Mobile (pagina 32-34)

Het belangrijkste onderdeel van het Custodian® systeem is de communicatie van de Embedded module met het Back Office systeem, door middel van CORBA. Om gebruik te maken van CORBA moeten er een aantal dingen gedaan worden. Om de uitleg hiervan te versimpelen is in figuur 20 eerst de opzet van een CORBA connectie te zien.

Figuur 20 –Opzet CORBA connectie

De ORB is hetgeen wat de connectie verzorgt tussen twee CORBA implementaties. De verbinding hiertussen kan via TCP/IP opgezet worden, maar ook bijvoorbeeld lokaal op één systeem. Dit maakt het mogelijk om tussen twee programma’s, eventueel geïmplementeerd in twee verschillende programmeertalen te communiceren alsof het één programma is. Een ORB kan door meerdere ontwikkelaars geleverd worden, maar in de JDK wordt deze bijgeleverd. Alleen de Back Office maakt hier gebruik van, de Nokia-12i heeft een ingebouwde ORB welke tijdens het opstarten geïnitialiseert wordt. Om op de server gebruik te kunnen maken van de ORB, moet het volgende commando aangeroepen worden in de prompt:

C:\>orbd –ORBInitialPort 1050 –port 1051

ORBInitialPort 1050 is hier de port waarop CORBA-connecties binnen kunnen komen. Port 1051 wordt gebruikt voor het accepteren van objecten. Voor beide poorten moest de beveiliging naar de server uitgezet worden. Hierna kan de server opgestart worden.

Het opstarten van een CORBA-server is niet complex. Toch moet er in deze context op gelet worden dat de poort via waar CORBA verbinding wilt maken gedefinieerd wordt. Ook deze moet open staan voor

verbindingen van buitenaf. In regel 2 van Code voorbeeld A is te zien dat er een eigenschap genaamd

ORBPersistenServerPort op 1234 wordt gezet. Hierna wordt de array waarin onder andere deze eigenschap

staat samen met args gebruikt om de ORB te initialiseren. args zijn de parameters die tijdens het opstarten van de server meegegeven worden. Het opstarten van de server gebeurd als volgt:

C:\Custodian\java BOMain –ORBInitialPort 1050

Properties props = new Properties();

props.put("com.sun.CORBA.POA.ORBPersistentServerPort","1234"); ORB orb = ORB.init(args, props);

BackOfficeImpl ccImpl = new BackOfficeImpl(); ccImpl.setORB(orb);

POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootPOA.the_POAManager().activate();

org.omg.CORBA.Object ref = rootPOA.servant_to_reference(ccImpl);

NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService")); nc.rebind(nc.to_name("BackOffice"), ref);

Code voorbeeld A – Initialisatie van CORBA op Back Office

(client)Main() (server)Main()

Object Referentie Object Implementatie

Object Request Broker (ORB) Object Request Broker (ORB) Skelet Code Stub Code

Zodra deze server opgestart is kan de Embedded module zelf een CORBA-client initialiseren. Dit doet hij door op zoek te gaan naar de naamservice en deze naar een object om te zetten. Vervolgens kan binnen dit object een nieuw object gezocht worden dat gebruikt wordt als een representatie van de Back Office. Op dit object kunnen aanroepen gedaan worden. Dit is in Code voorbeeld B te zien. De code in het lichtblauw wordt gebruikt om object emb over te zenden naar de server. Deze zal dan een object hebben waarop ook aanroepen gedaan kunnen worden.

Hashtable props = new Hashtable();

props.put("com.nokia.m2m.orb.UseM2MGateway","no"); ORB orb = ORB.init(null, props);

String nsURL = "corbaloc::212.203.27.194:1050/NameService";

NamingContextExt nc = NamingContextExtHelper.narrow(orb.string_to_object(nsURL));

EmbeddedImpl embeddedImpl = new EmbeddedImpl(); embeddedImpl.setORB(orb);

POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.activate_object(embeddedImpl);

rootpoa.the_POAManager().activate();

org.omg.CORBA.Object ref = rootpoa.servant_to_reference(embeddedImpl); Embedded emb = EmbeddedHelper.narrow(ref);

BackOffice backOffice = BackOfficeHelper.narrow(nc.resolve_str("BackOffice"));

Code voorbeeld B – Initialisatie van CORBA op Embedded

Het implementeren van de complete communicatie met de ORB is niet aan de ontwikkelaar. CORBA gebruikt hiervoor handig IDL bestanden, vanuit waar de meeste bestanden gegenereerd worden. Hierin geeft de ontwikkelaar aan hoe de implementatie klassen eruit zullen zien. Voor dit systeem zag de IDL file er als volgt uit:

module replace {

interface Embedded {

boolean changeSetting(in string setting, in string value); boolean reqPermission();

oneway void serverState(in string state); string getAssetLog();

};

interface BackOffice {

oneway void logEntry(in string log); oneway void eDisconnect(in string id);

oneway void newValue(in string source, in string type, in short value); oneway void debug(in string debug);

oneway void setEmbedded(in string id, in Embedded emb); };

};

Replace wordt hierin tijdens het compileren vervangen door de naam van het te gebruiken package, in dit

geval nl.ict.custodian.corba. Door het aanroepen van de IDL compiler, IDLJ, op de volgende manier, worden bestanden gegenereerd die nodig zijn voor de communicatie met de ORB.

C:\>idlj –fallTie –pkgTranslate replace nl.ict.custodian.corba corba.idl

De bestanden die door deze actie worden gegenereerd zijn te zien in tabel 4. Deze bestanden moeten op zowel de cliënt als de server aanwezig zijn. Zodra ze niet gesynchroniseerd zijn, dan werkt de CORBA communicatie niet. Het probleem hierbij is echter dat de J2ME implementatie op de Nokia-12i een aantal functies mist. Om die reden zijn er een aantal aanpassingen gedaan in de bestanden, waardoor deze wel werken.

BackOffice bestanden Embedded bestanden _BackOfficeStub.java BackOffice.java BackOfficeHelper.java BackOfficeHolder.java BackOfficeOperations.java BackOfficePOA.java BackOfficePOATie.java _EmbeddedStub.java Embedded.java EmbeddedHelper.java EmbeddedHolder.java EmbeddedOperations.java EmbeddedPOA.java EmbeddedPOATie.java

Tabel 4 - IDL Gegenereerde bestanden

Aan de hand van alle voorgaande acties is op de cliënt nu een object verkregen waarop methoden

aangeroepen kunnen worden. Dit object heeft is een representatie van de server en voor de gebruiker is het voor de rest alsof het één programma is. Als de server ook nog een representatie van de cliënt wilt gebruiken, moet deze eerst doorgegeven worden door middel van een aanroep. In de IDL file is al te zien hoe dit eruit gaat zien. Op de Back Office zal de methode setEmbedded(String id, Embedded emb) aangeroepen worden.

emb is ook hier het object dat de Embedded module representeert.

In document Custodian® Embedded Mobile (pagina 32-34)