Edouard@1439: #!/usr/bin/env python Edouard@1439: # -*- coding: utf-8 -*- Edouard@1439: Edouard@1439: import sys Edouard@1440: #from twisted.python import log Edouard@1439: from autobahn.twisted import wamp Edouard@1439: from autobahn.twisted.websocket import WampWebSocketClientFactory, connectWS Edouard@1440: from twisted.internet.defer import inlineCallbacks Edouard@1439: from autobahn.wamp import types Edouard@1440: from autobahn.wamp.serializer import MsgPackSerializer Edouard@1441: from twisted.internet.protocol import ReconnectingClientFactory Edouard@1439: import json Edouard@1439: Edouard@1439: _WampSession = None Edouard@1439: _PySrv = None Edouard@1439: Edouard@1440: ExposedCalls = ["StartPLC", Edouard@1440: "StopPLC", Edouard@1440: "ForceReload", Edouard@1440: "GetPLCstatus", Edouard@1440: "NewPLC", Edouard@1440: "MatchMD5", Edouard@1440: "SetTraceVariablesList", Edouard@1440: "GetTraceVariables", Edouard@1440: "RemoteExec", Edouard@1440: "GetLogMessage", Edouard@1441: "ResetLogCount", Edouard@1440: ] Edouard@1440: Edouard@1440: def MakeCallee(name): Edouard@1440: global _PySrv Edouard@1440: def Callee(*args,**kwargs): Edouard@1440: return getattr(_PySrv.plcobj, name)(*args,**kwargs) Edouard@1440: return Callee Edouard@1440: Edouard@1440: Edouard@1439: class WampSession(wamp.ApplicationSession): Edouard@1440: Edouard@1440: @inlineCallbacks Edouard@1439: def onJoin(self, details): Edouard@1439: global _WampSession Edouard@1439: _WampSession = self Edouard@1439: print 'WAMP session joined by :', self.config.extra["ID"] Edouard@1440: for name in ExposedCalls: Edouard@1440: reg = yield self.register(MakeCallee(name), name) Edouard@1439: Edouard@1439: def onLeave(self, details): Edouard@1439: global _WampSession Edouard@1439: _WampSession = None Edouard@1439: print 'WAMP session left' Edouard@1439: Edouard@1441: class ReconnectingWampWebSocketClientFactory(WampWebSocketClientFactory, ReconnectingClientFactory): Edouard@1441: def clientConnectionFailed(self, connector, reason): Edouard@1441: print("WAMP Client connection failed .. retrying ..") Edouard@1441: self.retry(connector) Edouard@1441: def clientConnectionLost(self, connector, reason): Edouard@1441: print("WAMP Client connection lost .. retrying ..") Edouard@1441: self.retry(connector) Edouard@1441: Edouard@1439: def RegisterWampClient(wampconf): Edouard@1439: Edouard@1439: WSClientConf = json.load(open(wampconf)) Edouard@1439: Edouard@1440: ## start logging to console Edouard@1440: # log.startLogging(sys.stdout) Edouard@1439: Edouard@1440: # create a WAMP application session factory Edouard@1439: component_config = types.ComponentConfig( Edouard@1439: realm = WSClientConf["realm"], Edouard@1439: extra = {"ID":WSClientConf["ID"]}) Edouard@1439: session_factory = wamp.ApplicationSessionFactory( Edouard@1439: config = component_config) Edouard@1439: session_factory.session = WampSession Edouard@1439: Edouard@1440: # create a WAMP-over-WebSocket transport client factory Edouard@1441: transport_factory = ReconnectingWampWebSocketClientFactory( Edouard@1439: session_factory, Edouard@1439: url = WSClientConf["url"], Edouard@1440: serializers = [MsgPackSerializer()], Edouard@1439: debug = False, Edouard@1439: debug_wamp = False) Edouard@1439: Edouard@1440: # start the client from a Twisted endpoint Edouard@1439: conn = connectWS(transport_factory) Edouard@1440: print "WAMP client connecting to :",WSClientConf["url"] Edouard@1439: return conn Edouard@1439: Edouard@1439: def GetSession(): Edouard@1439: global _WampSession Edouard@1439: return _WampSession Edouard@1439: Edouard@1439: def SetServer(pysrv): Edouard@1439: global _PySrv Edouard@1439: _PySrv = pysrv Edouard@1439: