logo.png

Bunny

clonage Owis

controleur CORBA



Home Up


Contents



1 Introduction

$ ./bin/Controller -n Security/Controller
                                              $ python gui/GUI.py


1.1 Envoie d'ordres

Les ordres transitent sous forme d'un pseudo codage XML semblable tout ou parti au contenu de fichier de configuration. Envoyer les ordres consiste à écrire ce texte dans une SOCKET.


1.2 Remontée des alarmes

Le client doit pouvoir s'inscrire au près du serveur afin de recevoir les alertes. A priori il s'agit du processus decrit ci-dessus mais inversé.

Remarque: notre client devient par conséquent également un serveur.


1.3 Récupération des valeurs

Afin de proposer un contrôle visuel, le client doit aussi être en mesure de récupérer les valeurs en vigueure sur le serveur. Celà consiste je suppose à envoyer un ordre puis à déchiffrer la chaîne reçue en retour.


2 Architecture du controleur Corba


2.1 Fichiers sources

Figure 1: fichiers source
\begin{figure}\dirtree{%
.0 ctrlSecurity.
.1 Makefile.
.1 idl.
.2 Security.idl.
...
...nnect\_controller.py.
.2 test\_controller.py.
.1 gui.
.2 GUI.py.
}\end{figure}


2.2 Interface CORBA

Le Makefile génère deux interface en C++ et en PYTHON :

$ omniidl -bcxx -Wba -I/usr/local/hess/dash/idl -Cstub idl/Security.idl
$ omniidl -bpython -I/usr/local/hess/dash/idl idl/Security.idl

Figure 2: fichiers de l'interface CORBA
\begin{figure}\dirtree{%
.0 security.
.1 stub.
.2 Security.hh.
.2 SecuritySK.cc....
...ity.
.2 \_\_init\_\_.py.
.1 Security\_\_POA.
.2 \_\_init\_\_.py.
}\end{figure}


2.3 Serveur C++

Le Makefile génère deux objets et un executable (cf cvs/dash/Makefile.dash) :

g++ ... -c stub/SecuritySK.cc -o out/SecuritySK.o
g++ ... -c src/ctrlSecurity.C -o out/ctrlSecurity.o
g++ ... out/ctrlSecurity.o out/SecuritySK.o -o bin/ctrlSecurity

Figure 3: fichiers du serveur C++
\begin{figure}\dirtree{%
.0 security.
.1 out.
.2 SecuritySK.o.
.2 Controller.o.
.1 bin.
.2 Controller.
}\end{figure}

Notez bien le paramètre !

$ ~cvs/security/bin/Controller -n Security/Controller

Figure 4: noms CORBA du serveur C++
\begin{figure}\dirtree{%
.0 roche.
.1 Security.
.2 Controleur.
}\end{figure}

$ nameclt list
roche/

$ nameclt list roche
Security/

$ nameclt list roche/Security
Controller


2.4 Clients PYTHON

Il y a redite puisque le python est un langage interprété.

Figure 5: fichiers des clients PYTHON
\begin{figure}\dirtree{%
.0 security.
.1 scripts.
.2 connect\_controller.py.
.2 test\_controller.py.
.1 gui.
.1 GUI.py.
}\end{figure}


2.4.1 Simple connection

Ce script à la mérite d'être indépendant de la classe Dash dans le sens où il ne fait pas appel à ses fonctions pour initier la connexion au controleur CORBA.

fichier  cvs/security/scripts/connect_controller.py :

...
from omniORB import CORBA
import CosNaming
import Security,Security__POA
import Dash

global orb
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references("RootPOA")
rootContext=orb.resolve_initial_references("NameService")._narrow(CosNaming.NamingContext)
poaManager = poa._get_the_POAManager()
poaManager.activate()

name = []
name.insert(0,CosNaming.NameComponent("Controller", ""))
name.insert(0,CosNaming.NameComponent("Security", ""))
name.insert(0,CosNaming.NameComponent("roche", ""))
obj=rootContext.resolve(name)
controller = obj._narrow(Security.Controller)
if controller.GetState() == Dash.StateController.Safe:
    controller.Configure()

print "Position 1:",controller.GetPosition(1)


2.4.2 Interface non graphique

Ce script utilise les fonctions de la classe Dash pour établir la connection.

#!/usr/bin/env python

import os, sys

sys.path.append(os.environ["HESSUSER"])
sys.path.append(os.environ["HESSUSER"]+"/dash")
sys.path.append(os.environ["HOME"]+"/src/security")

from dash.python import StateController,Server,Message,LoopHandler
import Dash, Dash__POA
import Security, Security__POA

""" This is the Corba client"""
class SecurityUIClient(StateController.StateController_i):

    def __init__(self):

        StateController.StateController_i.__init__(
            self,
            name = "Security/UI",
            options = ["-ORBclientCallTimeOutPeriod","600000"]
            )
          
"""The main object gather Corba client and connected Corba server"""
class SecurityUI:

    def find_controller(self):
        """Client will try to find the controller """
        name = "Security/Controller"

        self.server = self.client.find_server(name)
        if self.server is not None:
            """Polymorphisme """
            self.server = self.server._narrow(Security.Controller)   

    def __init__(self):

        self.client = SecurityUIClient()
        self.find_controller()

if __name__ == '__main__':
    os.environ["LC_ALL"] = "C"

    """ connect to the controller"""
    ui = SecurityUI()

    if ui.server == None:
        print "cannot contact Corba server"

    else:
        print "state :"
        ui.server.GetState()

    print ui.server

    print "Terminating (please ignore following insults)\n\t\t---\n"

Figure 6: noms CORBA du client PYTHON
\begin{figure}\dirtree{%
.0 roche.
.1 Security.
.2 UI.
}\end{figure}

$ nameclt list
roche/

$ nameclt list roche
Security/

$ nameclt list roche/Security
Controller
UI


2.4.3 Interface graphique

Figure 7: noms CORBA du GUI PYTHON
\begin{figure}\dirtree{%
.0 roche.
.1 Security.
.2 GUI.
}\end{figure}

$ nameclt list
roche/

$ nameclt list roche
Security/

$ nameclt list roche/Security
Controller
GUI


3 Implémentation du controleur Corba


3.1 Fonction ConfigureHardware

Home Up

This document is also available in PDF and PostScript format.



2016-02-15