OpenOPCService.py
上传用户:liufeng210
上传日期:2016-03-28
资源大小:164k
文件大小:4k
源码类别:

PlugIns编程

开发平台:

Python

  1. ###########################################################################
  2. #
  3. # OpenOPC Gateway Service
  4. #
  5. # A Windows service providing remote access to the OpenOPC library.
  6. #
  7. # Copyright (c) 2007-2008 Barry Barnreiter (barry_b@users.sourceforge.net)
  8. #
  9. ###########################################################################
  10. import win32serviceutil
  11. import win32service
  12. import win32event
  13. import _winreg
  14. import select
  15. import socket
  16. import os
  17. import time
  18. import OpenOPC
  19. try:
  20.     import Pyro.core
  21.     import Pyro.protocol
  22. except ImportError:
  23.     print 'Pyro module required (http://pyro.sourceforge.net/)'
  24.     exit()
  25. Pyro.config.PYRO_MULTITHREADED = 1
  26. opc_class = OpenOPC.OPC_CLASS
  27. opc_gate_port = 7766
  28. def getvar(env_var):
  29.     """Read system enviornment variable from registry"""
  30.     try:
  31.         key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\ControlSession ManagerEnvironment',0,_winreg.KEY_READ)
  32.         value, valuetype = _winreg.QueryValueEx(key, env_var)
  33.         return value
  34.     except:
  35.         return None
  36. # Get env vars directly from the Registry since a reboot is normally required
  37. # for the Local System account to inherit these.
  38. if getvar('OPC_CLASS'):  opc_class = getvar('OPC_CLASS')
  39. if getvar('OPC_GATE_PORT'):  opc_gate_port = int(getvar('OPC_GATE_PORT'))
  40. class opc(Pyro.core.ObjBase):
  41.     def __init__(self):
  42.         Pyro.core.ObjBase.__init__(self)
  43.         self._remote_hosts = {}
  44.         self._init_times = {}
  45.         self._tx_times = {}
  46.     def get_clients(self):
  47.         """Return list of server instances as a list of (GUID,host,time) tuples"""
  48.         
  49.         reg = self.getDaemon().getRegistered()
  50.         hosts = self._remote_hosts
  51.         init_times = self._init_times
  52.         tx_times = self._tx_times
  53.         
  54.         hlist = [(k, hosts[k] if hosts.has_key(k) else '', init_times[k], tx_times[k]) for k,v in reg.iteritems() if v == None]
  55.         return hlist
  56.     
  57.     def create_client(self):
  58.         """Create a new OpenOPC instance in the Pyro server"""
  59.         
  60.         opc_obj = OpenOPC.client(opc_class)
  61.         base_obj = Pyro.core.ObjBase()
  62.         base_obj.delegateTo(opc_obj)
  63.         uri = self.getDaemon().connect(base_obj)
  64.         opc_obj._open_serv = self
  65.         opc_obj._open_self = base_obj
  66.         opc_obj._open_host = self.getDaemon().hostname
  67.         opc_obj._open_port = self.getDaemon().port
  68.         opc_obj._open_guid = uri.objectID
  69.         
  70.         remote_ip = self.getLocalStorage().caller.addr[0]
  71.         try:
  72.             remote_name = socket.gethostbyaddr(remote_ip)[0]
  73.             self._remote_hosts[uri.objectID] = '%s (%s)' % (remote_ip, remote_name)
  74.         except socket.herror:
  75.             self._remote_hosts[uri.objectID] = '%s' % (remote_ip)
  76.         self._init_times[uri.objectID] =  time.time()
  77.         self._tx_times[uri.objectID] =  time.time()
  78.         return Pyro.core.getProxyForURI(uri)
  79.     def release_client(self, obj):
  80.         """Release an OpenOPC instance in the Pyro server"""
  81.         self.getDaemon().disconnect(obj)
  82.         del self._remote_hosts[obj.GUID()]
  83.         del self._init_times[obj.GUID()]
  84.         del self._tx_times[obj.GUID()]
  85.         del obj
  86.    
  87. class OpcService(win32serviceutil.ServiceFramework):
  88.     _svc_name_ = "OpenOPCService"
  89.     _svc_display_name_ = "OpenOPC Gateway Service"
  90.     
  91.     def __init__(self, args):
  92.         win32serviceutil.ServiceFramework.__init__(self, args)
  93.         self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
  94.     
  95.     def SvcStop(self):
  96.         self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
  97.         win32event.SetEvent(self.hWaitStop)
  98.     def SvcDoRun(self):
  99.         daemon = Pyro.core.Daemon(port = opc_gate_port)
  100.         daemon.connect(opc(), "opc")
  101.         while win32event.WaitForSingleObject(self.hWaitStop, 0) != win32event.WAIT_OBJECT_0:
  102.             socks = daemon.getServerSockets()
  103.             ins,outs,exs = select.select(socks,[],[],1)
  104.             for s in socks:
  105.                 if s in ins:
  106.                     daemon.handleRequests()
  107.                     break
  108.                     
  109.         daemon.shutdown()
  110.         
  111. if __name__ == '__main__':
  112.     win32serviceutil.HandleCommandLine(OpcService)