runtime/WampClient.py
author Edouard Tisserant
Sun, 08 Feb 2015 16:50:54 +0100
changeset 1440 e8daabf2c438
parent 1439 a68cd4253259
child 1441 826730e60407
permissions -rw-r--r--
Runtime : Added PLCobject methods registring. IDE : Added WAMP connector. Still need some fixes
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
#from twisted.python import log
from autobahn.twisted import wamp
from autobahn.twisted.websocket import WampWebSocketClientFactory, connectWS
from twisted.internet.defer import inlineCallbacks
from autobahn.wamp import types
from autobahn.wamp.serializer import MsgPackSerializer
import json

_WampSession = None
_PySrv = None

ExposedCalls = ["StartPLC",
                "StopPLC",
                "ForceReload",
                "GetPLCstatus",
                "NewPLC",
                "MatchMD5",
                "SetTraceVariablesList",
                "GetTraceVariables",
                "RemoteExec",
                "GetLogMessage",
                ]

def MakeCallee(name):
    global _PySrv
    def Callee(*args,**kwargs):
        return getattr(_PySrv.plcobj, name)(*args,**kwargs)
    return Callee


class WampSession(wamp.ApplicationSession):

    @inlineCallbacks
    def onJoin(self, details):
        global _WampSession
        _WampSession = self
        print 'WAMP session joined by :', self.config.extra["ID"]
        for name in ExposedCalls:
            reg = yield self.register(MakeCallee(name), name)

    def onLeave(self, details):
        global _WampSession
        _WampSession = None
        print 'WAMP session left'

def RegisterWampClient(wampconf):

    WSClientConf = json.load(open(wampconf))

    ## start logging to console
    # log.startLogging(sys.stdout)

    # create a WAMP application session factory
    component_config = types.ComponentConfig(
        realm = WSClientConf["realm"],
        extra = {"ID":WSClientConf["ID"]})
    session_factory = wamp.ApplicationSessionFactory(
        config = component_config)
    session_factory.session = WampSession

    # create a WAMP-over-WebSocket transport client factory
    transport_factory = WampWebSocketClientFactory(
        session_factory,
        url = WSClientConf["url"],
        serializers = [MsgPackSerializer()],
        debug = False,
        debug_wamp = False)

    # start the client from a Twisted endpoint
    conn = connectWS(transport_factory)
    print "WAMP client connecting to :",WSClientConf["url"]
    return conn

def GetSession():
    global _WampSession
    return _WampSession

def SetServer(pysrv):
    global _PySrv
    _PySrv = pysrv