def main(): # 1. Extend IDataObserver and IStackObserver # 2. Add a Physical Layer (TCP Client) to the StackManager # 3. Create a MasterConfig. # 4. Add a Master Stack to the StackManager # 5. Let the process run print "Running the Slave" stack_observer = StackObserver() # observer = DataObserver() acceptor = CmdAcceptor() phys_layer_settings = opendnp3.PhysLayerSettings() stack_manager = opendnp3.StackManager() # stack_manager.AddTCPClient('tcpclient', phys_layer_settings, '127.0.0.1', 20000) stack_manager.AddTCPServer('tcpserver', phys_layer_settings, '10.0.0.2', 20000) #stack_manager.AddTCPServer('tcpserver', phys_layer_settings, '10.0.60.17', 20000) # master_stack_config = opendnp3.MasterStackConfig() slave_stack_config = opendnp3.SlaveStackConfig() # master_stack_config.master.DoUnsolOnStartup = True # master_stack_config.link.LocalAddr = 100 # master_stack_config.link.RemoteAddr = 1 slave_stack_config.link.LocalAddr = 1 slave_stack_config.link.RemoteAddr = 100 # master_stack_config.link.useConfirms = True # set the stack observer callback to our Python-extended class # master_stack_config.master.mpObserver = stack_observer slave_stack_config.slave.mpObserver = stack_observer # the integrity rate is the # of milliseconds between integrity scans #master_stack_config.master.IntegrityRate = 1000 # The third argument needs to be a log FilterLevel. The Python # API does not have access to this enum, but it can be "fed" to # the AddMaster method because the PhysLayerSettings LogLevel # member is a FilterLevel enum. # command_acceptor = stack_manager.AddMaster('tcpclient', 'master', phys_layer_settings.LogLevel, observer, master_stack_config) command_acceptor = stack_manager.AddSlave('tcpserver', 'slave', phys_layer_settings.LogLevel, acceptor, slave_stack_config) # Need to wait because the polling is now occurring on its own # thread. If we exited immediately, the callbacks would never # be called. sleep(2) print('Binaries: %d' % (len(binary_list))) print('Analogs: %d' % (len(analog_list))) print('Counters: %d' % (len(counter_list))) print('ControlStatus: %d' % (len(controlstatus_list))) print('Setpointstatus: %d' % (len(setpointstatus_list))) while (True): sleep(60)
def main(): parser = argparse.ArgumentParser() parser.add_argument('--slave_ip', dest="slave_ip", help='IP Address of the slave node.', required=True) parser.add_argument('--life_time', dest="life_time", help='Time after which slave must die!', required=True) parser.add_argument('--vt', dest="vt", help='Is virtual time enabled', required=True) args = parser.parse_args() # 1. Extend IDataObserver and IStackObserver # 2. Add a Physical Layer (TCP Client) to the StackManager # 3. Create a MasterConfig. # 4. Add a Master Stack to the StackManager # 5. Let the process run print "Running the Slave. Pid = ", os.getpid() stack_observer = StackObserver() # observer = DataObserver() acceptor = CmdAcceptor() phys_layer_settings = opendnp3.PhysLayerSettings() stack_manager = opendnp3.StackManager() stack_manager.AddTCPServer('tcpserver', phys_layer_settings, args.slave_ip, 20000) # master_stack_config = opendnp3.MasterStackConfig() slave_stack_config = opendnp3.SlaveStackConfig() # master_stack_config.master.DoUnsolOnStartup = True # master_stack_config.link.LocalAddr = 100 # master_stack_config.link.RemoteAddr = 1 slave_stack_config.link.LocalAddr = 1 slave_stack_config.link.RemoteAddr = 100 # master_stack_config.link.useConfirms = True # set the stack observer callback to our Python-extended class # master_stack_config.master.mpObserver = stack_observer slave_stack_config.slave.mpObserver = stack_observer # the integrity rate is the # of milliseconds between integrity scans #master_stack_config.master.IntegrityRate = 1000 # The third argument needs to be a log FilterLevel. The Python # API does not have access to this enum, but it can be "fed" to # the AddMaster method because the PhysLayerSettings LogLevel # member is a FilterLevel enum. # command_acceptor = stack_manager.AddMaster('tcpclient', 'master', phys_layer_settings.LogLevel, observer, master_stack_config) command_acceptor = stack_manager.AddSlave('tcpserver', 'slave', phys_layer_settings.LogLevel, acceptor, slave_stack_config) # Need to wait because the polling is now occurring on its own # thread. If we exited immediately, the callbacks would never # be called. sleep(2) print('Binaries: %d' % (len(binary_list))) print('Analogs: %d' % (len(analog_list))) print('Counters: %d' % (len(counter_list))) print('ControlStatus: %d' % (len(controlstatus_list))) print('Setpointstatus: %d' % (len(setpointstatus_list))) sys.stdout.flush() if int(args.vt) == 0: for tid in get_thread_ids(os.getpid()): set_def_cpu_affinity(tid, "2-3") while (True): sleep(int(args.life_time) - 2) break