# This file is part of Beremiz, a Integrated Development Environment for
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
# See COPYING file for copyrights details.
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#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
from twisted.internet.protocol import ReconnectingClientFactory
ExposedCalls = ["StartPLC",
""" Get Callee or Subscriber corresponding to '.' spearated object path """
while names: obj = getattr(obj, names.pop(0))
class WampSession(wamp.ApplicationSession):
def onJoin(self, details):
ID = self.config.extra["ID"]
print 'WAMP session joined by :', ID
for name in ExposedCalls:
reg = yield self.register(GetCallee(name), '.'.join((ID,name)))
for name in SubscribedEvents:
reg = yield self.subscribe(GetCallee(name), name)
def onLeave(self, details):
print 'WAMP session left'
class ReconnectingWampWebSocketClientFactory(WampWebSocketClientFactory, ReconnectingClientFactory):
def clientConnectionFailed(self, connector, reason):
print("WAMP Client connection failed .. retrying ..")
def clientConnectionLost(self, connector, reason):
print("WAMP Client connection lost .. retrying ..")
def LoadWampClientConf(wampconf):
WSClientConf = json.load(open(wampconf))
def RegisterWampClient(wampconf):
WSClientConf = LoadWampClientConf(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 = ReconnectingWampWebSocketClientFactory(
url = WSClientConf["url"],
serializers = [MsgPackSerializer()],
# start the client from a Twisted endpoint
conn = connectWS(transport_factory)
print "WAMP client connecting to :",WSClientConf["url"]